The warning against mixing the use of mysql_result with other result set functions is a bit generic. More specifically, mysql_result alters the result set's internal row pointer (at least in a LAMP environment). This is anything but obvious as the nature of the function is random access for grabbing a quick byte. Using mysql_data_seek after some mysql_result calls, before going into a mysql_fetch_array loop, will set things straight.
mysql_result
(PHP 4, PHP 5)
mysql_result — Retorna dados do resultado
Descrição
mysql_result() retorna o conteúdo de uma célula do resultado MySQL. O argumento field(campo) pode ser o índice do campo, o nome do campo, o a tabela ponto o nome do campo(tabela.campo). Se o nome da coluna usa apelido ('select foo as bar from...'), use o apelido ao invés do nome da coluna.
Quando trabalhando com um grande conjunto de resultado, você deve considerar o uso de uma das funções que retornam toda a linha(especificadas abaixo). Estas funções retornam o conteúdo de multiplas células em uma chamada de função, elas são MUITO mais rapidas do que mysql_result(). Também note que especificar um índice do campo é muito mais rapido do que especificar o nome do campo ou tabela.campo.
Chamadas a mysql_result() não devem ser misturadas com chamadas a outras funções que lidam com o conjunto de resultados.
Exemplo #1 Exemplo mysql_result()
<?php
$link = mysql_connect('localhost', 'mysql_user', 'mysql_password');
if (!$link) {
die('Could not connect: ' . mysql_error());
}
$result = mysql_query('SELECT name FROM work.employee');
if (!$result) {
die('Could not query:' . mysql_error());
}
echo mysql_result($result, 2); // outputs third employee's name
mysql_close($link);
?>
Alternativas de alta performance recomendadas: mysql_fetch_row(), mysql_fetch_array(), mysql_fetch_assoc() e mysql_fetch_object().
mysql_result() will throw E_WARNING if mysql_query returns 0 rows. This is unlike any of the mysql_fetch_* functions so be careful of this if you have E_WARNING turned on in error_reporting(). You might want to check mysql_num_rows() before calling mysql_result()
Note that mysql_result affects the internal pointer used by mysql_fetch_*
<?php
$res = mysql_query('SELECT a,b FROM ab');
echo mysql_result($res,0,0);
print_r(mysql_fetch_assoc($res));
?>
In the above example, the call to mysql_fetch_assoc would return the SECOND result, not the first as (I) expected.
Use mysql_data_seek($res,0) to reset the result set.
<?
$link = mysql_connect("host", "user", "passw");
mysql_select_db("database", $link);
$number = 3;
$insert = mysql_query("SELECT `test1`.*, `test2`.*,
FROM `test1`, `test2`, `
WHERE ((`test1`.`author` = `test2`.`ID`) AND (`test2`.`ID` ='$number'))
ORDER BY `toetsen`.`autoID` DESC",$link);
echo mysql_result( $insert , 0, 'test1.question') ;
#here he echoes the questions the stuff out of the first table
echo mysql_result( $insert , 0, 'test2.name') ;
#here he echoes the questions the stuff out of the second table
?>
If you want to fetch the result from a mysql query similar to one of these two queries...
$query = mysql_query("SELECT COUNT(*) FROM table");
$query = mysql_query("SELECT LAST_INSERT_ID()");
... you would use mysql_result() like shown below to retrieve the output as an int.
$result = mysql_result($query, 0, 0);
two simple but very useful functions, for converting a query to a value or an array:
<?php
function mysql_evaluate($query, $default_value="undefined") {
$result = mysql_query($query);
if (mysql_num_rows($result)==0)
return $default_value;
else
return mysql_result($result,0);
}
function mysql_evaluate_array($query) {
$result = mysql_query($query);
$values = array();
for ($i=0; $i<mysql_num_rows($result); ++$i)
array_push($values, mysql_result($result,$i));
return $values;
}
?>
http://tora.us.fm/_script/highlight.php?file=sql
Usage examples:
<?php
$customer_count = mysql_evaluate("SELECT COUNT(*) FROM customers");
$customer_names = mysql_evaluate_array("SELECT name FROM customers");
$customer_type = mysql_evaluate("SELECT type FROM customers WHERE name='$name'", "DEFAULT_TYPE");
?>
//updated error handling for mysql_evaluate
function mysql_evaluate($query, $default_value=0) {
if (!$result=mysql_query($query)) {
return 0;
}
if (mysql_num_rows($result)==0)
return $default_value;
else
return mysql_result($result,0);
}
// same applies for the mysql_evaluate_array() function
if you want to do something based on the fact that the data is the same in the next row, then looking ahead is easy with this.
<?php
$i=0;
$rows=mysql_num_rows($result);
while($i < $rows) {
$x = mysql_result($result, $i, 0);
if ($x = mysql_result($result, $i+1, 0)) {
echo "It's the same thing!";
}
}
?>
