(PHP 4, PHP 5)
mysql_data_seek — Bewegt den internen Ergebnis-Zeiger
Rückgabewert: Gibt bei Erfolg TRUE zurück. Im Fehlerfall wird FALSE zurückgegeben.
mysql_data_seek() bewegt den internen Datensatz-Zeiger eines Anfrageergebnisses zum Datensatz mit der übergebenen Nummer. Der nächste Aufruf von mysql_fetch_row() liefert den entsprechenden Datensatz.
Die Datensatznummer beginnt bei 0. Die Datensatznummer sollte ein Wert im Bereich zwischen 0 und mysql_num_rows - 1 sein. Falls die Ergebnismenge jedoch Null sein sollte (mysql_num_rows == 0) wird eine Suche nach Datensatznummer 0 mit einem E_WARNING fehlschlagen und mysql_data_seek() gibt FALSE zurück.
Hinweis:
Die Funktion mysql_data_seek() kann nur zusammen mit mysql_query() benutzt werden und nicht mit mysql_unbuffered_query().
Beispiel #1 mysql_data_seek() Beispiel
<?php
$link = mysql_connect('localhost', 'mysql_user', 'mysql_password');
if (!$link) {
die('Keine Verbindung möglich: ' . mysql_error());
}
$db_selected = mysql_select_db('sample_db');
if (!$db_selected) {
die('Auswahl der Datenbank nicht möglich: ' . mysql_error());
}
$query = 'SELECT nach_name, vor_name FROM freunde';
$result = mysql_query($query);
if (!$result) {
die('Anfrage fehlgeschlagen: ' . mysql_error());
}
/* holen der Zeilen in umgekehrter Reihenfolge */
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['nach_name'] . ' ' . $row['vor_name'] . "<br />\n";
}
mysql_free_result($result);
?>
Siehe auch: mysql_query() und mysql_num_rows().
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.
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;
}
?>
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.
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
}
?>
/*
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];
}
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.
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
/*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