MySQL 函数
在线手册:中文  英文

mysql_data_seek

(PHP 4, PHP 5)

mysql_data_seek移动内部结果的指针

说明

bool mysql_data_seek ( resource $result , int $row_number )

mysql_data_seek() 将指定的结果标识所关联的 MySQL 结果内部的行指针移动到指定的行号。接着调用 mysql_fetch_row() 将返回那一行。

row_number 从 0 开始。row_number 的取值范围应该从 0 到 mysql_num_rows - 1。但是如果结果集为空( mysql_num_rows() == 0),要将指针移动到 0 会失败并发出 E_WARNING 级的错误, mysql_data_seek() 将返回 FALSE

参数

result

resource 型的结果集。此结果集来自对 mysql_query() 的调用。

row_number

想要设定的新的结果集指针的行数。

返回值

成功时返回 TRUE, 或者在失败时返回 FALSE

范例

Example #1 mysql_data_seek() 例子

<?php
$link 
mysql_connect('localhost''mysql_user''mysql_password');
if (!
$link) {
    die(
'Could not connect: ' mysql_error());
}
$db_selected mysql_select_db('sample_db');
if (!
$db_selected) {
    die(
'Could not select database: ' mysql_error());
}
$query 'SELECT last_name, first_name FROM friends';
$result mysql_query($query);
if (!
$result) {
    die(
'Query failed: ' mysql_error());
}
/* fetch rows in reverse order */
for ($i mysql_num_rows($result) - 1$i >= 0$i--) {
    if (!
mysql_data_seek($result$i)) {
        echo 
"Cannot seek to row $i: " mysql_error() . "\n";
        continue;
    }

    if (!(
$row mysql_fetch_assoc($result))) {
        continue;
    }

    echo 
$row['last_name'] . ' ' $row['first_name'] . "<br />\n";
}

mysql_free_result($result);
?>

注释

Note:

本扩展自 PHP 5.5.0 起已废弃,并在将来会被移除。应使用 MySQLiPDO_MySQL 扩展来替换之。参见 MySQL:选择 API 指南以及相关 FAQ 以获取更多信息。用以替代本函数的有:

Note:

mysql_data_seek() 只能和 mysql_query() 结合起来使用,而不能用于 mysql_unbuffered_query()

参见


MySQL 函数
在线手册:中文  英文

用户评论:

saeed at photobookworldwide dot com (2011-11-25 18:30:04)

Here, you can find the current pointer of selected row easily:

<?php
//selected row with id=4
$id    =    "4";

$result    =    mysql_query("select * from jos_components");

$num    =    mysql_num_rows($result);

for(
$i=0;$i<$num;$i++){
    
    
mysql_data_seek($result,$i);
 
    
$row    =    mysql_fetch_assoc($result);
    
    if(
$row['id']    ==    $id){
        
        
$pointer    =    $i;
    }

 
}

// current pointer for selected row
echo $pointer;
?>

webmail7 at suddenlink dot net (2009-04-29 10:48:32)

The mysql_query() function using the SELECT, SHOW, DESCRIBE, EXPLAIN or other statements returning a resultset, by default uses a TABLES INDEX, or simply the RECORD INSERT ORDER, in creating the resultset. 

When using the mysql_data_seek() function along with a mysql_query() function using the SELECT, SHOW, DESCRIBE, EXPLAIN or other statements returning a resultset, and your desire is to SELECT A SPECIFIC ROW based upon the CONTENTS of a SPECIFIC FIELD then be sure to use the ORDER statement in your query or the mysql_data_seek() function may have unpredictable results.

Example (Find Last Record):

==============================================

<?php

$query
="SELECT * FROM `team` ORDER BY `team`.`id` ASC";
$result=mysql_query($query);
$last_row mysql_num_rows($result) - 1;
if (
mysql_data_seek($result$last_row)) { //Set Pointer To LAST ROW in TEAM table.

     
$row mysql_fetch_row($result); //Get LAST RECORD in TEAM table
     
$id $row[0] + 1//New Team ID Value
     // more code here ...

} else { //Data Seek Error

    
echo "Cannot seek to row $last_row: " mysql_error() . "\n";        

}

?>

==============================================

** Note: 

1. The above example code relates to a MYSQL table named 'team' similar to this:

+-ID-+ TEAM NAME-+
| 49 |  Team 49  |
| 33 |  Team 33  |
| 84 |  Team 84  |
| 07 |  Team 07  |
+----+-----------+
** Records shown in the order inserted (i.e. TABLE NOT INDEXED)

2. In the above example code the field named ID is NOT set to AUTO-INCREMENT (i.e. field value set programmatically).

3. Wanting to insert a new team with a team number higher that the highest team number used, simply using the following code snippet

==============================================

<?php

$query
="SELECT * FROM `team`";

?>

==============================================

resulted in an ERROR when using the mysql_data_seek() function  to select the record with the highest ID value.

4. Use of the ORDER statement in the query corrected the error/problem.

Hope this helps someone.

Daniel (2008-08-28 14:59:19)

Here is a simple function to "peek" at the position of the internal pointer in a query result:

<?php
function mysql_pointer_position($result_set) {
        
$num_rows mysql_num_rows($result_set);
        
$i 0;
        while(
$result mysql_fetch_array($result_set)) {
            
$i++;
        }
        
$pointer_position $num_rows $i;

//Return pointer to original position
        
if($pointer_position <= $num_rows 1) {
            
mysql_data_seek($result_set$pointer_position);
        }
        return 
$pointer_position;
    }
?>

Guy Gordon (2007-06-27 13:26:54)

I needed to "peek" at the next record in order to see if fetching it would go too far. So I want to do a fetch, followed by seek(-1).

I could find no function to move the internal row pointer relative to it's current position, or to retrieve it as a row number as required by mysql_data_seek(). This limits the function's usefulness to resetting the row to 0, unless you track the row number yourself.
If you use a While loop to step through the results, you can increment a tracking index at the bottom of the loop. But be sure never to use Continue; which would bypass your index. And document this restriction for the person who needs to maintain your code. It's probably better to use a For loop, which makes the index explicit.
In either case be sure to range check the index when you manipulate it. E.G. When I "peek" at the next record I must check for index>=count (end of data). Or if I decrement the index, make sure it does not go negative. Again, document why you are coding it this way, so the next programmer doesn't "correct" the inelegant code.

(2006-05-30 01:52:11)

A helpful note about the 'resource' data type.

Since the 'resource' variable is pointing to a row in a result set at any given time, you can think of it as being passed to this function by reference every time you pass it or assign it to a variable.

<?

$sql = "SELECT * from <table>";
$result = mysql_query($sql);
$temp_result = $result;

while ($row = mysql_fetch_assoc($temp_result)) {
    // do stuff with $row
}

while ($row = mysql_fetch_assoc($result)) {
    // This code will never run because the 'resource' variable is pointing past the end of the result set,
    // even though it was *not* assigned by reference to $result2.
}

?>

Therefore, the following snipits are functionally identical:

<?

// Start snipit 1

$sql = "SELECT * from <table>";
$result = mysql_query($sql);

while ($row = mysql_fetch_assoc($result)) {
    // do stuff with $row
}

mysql_data_seek($result, 0);

while ($row = mysql_fetch_assoc($result)) {
    // do other stuff with $row
}

// Start snipit 2

$sql = "SELECT * from <table>";
$result = mysql_query($sql);
$temp_result = $result;

while ($row = mysql_fetch_assoc($temp_result)) {
    // do stuff with $row
}

mysql_data_seek($result, 0);

while ($row = mysql_fetch_assoc($temp_result)) {
    // do other stuff with $row
}

?>

jonybd at yahoo dot com (2005-06-27 05:40:47)

/*
helpfull for real time databases query
- Query one time
- Retreive data twice from the same query
- mysql_data_seek *
*/
include("p_MySql_Connection.php");
$v_Query = "SELECT f1 from t1";

$v_Result = mysql_query($v_Query, $v_RS);
/*
First loop for one single query
*/
while ($row = mysql_fetch_array($v_Result,MYSQL_NUM)) {
$v_total = $v_total + $row[1];
}
echo $v_total;

/*
Retreive data
*/
$v_Re = mysql_data_seek($v_Result,0);
if (!$v_Re){
echo 'MySql data seek Error' . mysql_error();
}
/*
Second loop for one single query
*/
while ($row = mysql_fetch_array($v_Result,MYSQL_NUM)) {
echo $row[0];
}

arturo_b at hotmail dot com (2005-04-20 20:53:47)

hello, this script would be easy to understand for those that are novice in php whose want to understand about this function:

the table "user" have 2 columns "id" and "name".
"user" content:
position 0: "id"=195342481 "name"='Arthur'
position 1: "id"=179154675 "name"='John'
>>position 2<<: "id"=157761949 "name"='April' >>third row<<
position 3: "id"=124492684 "name"='Tammy'
position 4: "id"=191346457 "name"='Mike'

<?php
  mysql_connect
("localhost""root")
  
mysql_select_db("test");
  
$sql mysql_query("select * from user");
  
mysql_data_seek($sql2);
  echo 
"<table border=1>";
  while (
$row mysql_fetch_row($sql)){
    echo 
"<tr><td>$row[0]</td><td>$row[1]</td></tr>";
  }
  echo 
"</tabla>";
?>

explanation:
mysql_data_seek move internal result pointer to the third row of table user. Thus mysql_fetch_row will begin by april?s row.

b.steinbrink at g m x dot de (2004-12-08 23:09:35)

to kennethnash1134 at yahoo dot com
your loop can be done like this as well and i guess this is faster:
$r=mysql_query("select user,id,ip from accounts limit 10");
unset($users); // Just to be sure
while($users[] = mysql_fetch_row);
array_pop($users); // Drop the last entry which is FALSE

kennethnash1134 at yahoo dot com (2004-03-26 00:12:05)

/*here is a nice function for converting a mysql result row set into a 2d array, a time saver if need small data from several rows, saves you from having to do Alot of queries... would be nice to have this built into PHP future versions :) */
// simple example query
$r=mysql_query("select user,id,ip from accounts limit 10");
//starts the for loop, using mysql_num_rows() to count total
//amount of rows returned by $r
for($i=0; $i<mysql_num_rows($r); $i++){
//advances the row in the mysql resource $r
mysql_data_seek($r,$i);
//assigns the array keys, $users[row][field]
$users[$i]=mysql_fetch_row($r);
}
//simple, hope someone can use it :)
// -Kenneth Nash

易百教程