Delicious Bookmark this on Delicious Share on Facebook SlashdotSlashdot It! Digg! Digg



PHP : Function Reference : MySQL Functions : mysql_data_seek

mysql_data_seek

Move internal result pointer (PHP 4, PHP 5, PECL mysql:1.0)
bool mysql_data_seek ( resource result, int row_number )

Example 1419. mysql_data_seek() example

<?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);
?>

Code Examples / Notes » mysql_data_seek

b.steinbrink

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


justus dot brugman

So you can use it as the equivalent of the reset() call for an array.
eg.
while ($row = mysql_fetch_object($result_01))
{
// code goes here
 while ($row = mysql_fetch_object($result_02))
 {
  // code goes here.
 }
 mysql_data_seek($result_02,0)
}
Still hoping that there is going to be a better way, like mysql_reset($result).


guy gordon

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.


arturo_b

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($sql, 2);
 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.


30-may-2006 09:52

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
}
?>


kennethnash1134

/*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


jonybd

/*
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];
}


Change Language


Follow Navioo On Twitter
mysql_affected_rows
mysql_change_user
mysql_client_encoding
mysql_close
mysql_connect
mysql_create_db
mysql_data_seek
mysql_db_name
mysql_db_query
mysql_drop_db
mysql_errno
mysql_error
mysql_escape_string
mysql_fetch_array
mysql_fetch_assoc
mysql_fetch_field
mysql_fetch_lengths
mysql_fetch_object
mysql_fetch_row
mysql_field_flags
mysql_field_len
mysql_field_name
mysql_field_seek
mysql_field_table
mysql_field_type
mysql_free_result
mysql_get_client_info
mysql_get_host_info
mysql_get_proto_info
mysql_get_server_info
mysql_info
mysql_insert_id
mysql_list_dbs
mysql_list_fields
mysql_list_processes
mysql_list_tables
mysql_num_fields
mysql_num_rows
mysql_pconnect
mysql_ping
mysql_query
mysql_real_escape_string
mysql_result
mysql_select_db
mysql_set_charset
mysql_stat
mysql_tablename
mysql_thread_id
mysql_unbuffered_query
eXTReMe Tracker