我正在将一些旧的PHP代码从mysql移植到MySQLi,我遇到了一个小问题。
是否没有旧的mysql_result()
功能?
我知道当你使用超过1行时,mysql_result()
比其他函数慢,但很多时候我只有1个结果和1个字段。使用它可以让我将4行压缩为1。
旧代码:
if ($r && mysql_num_rows($r))
$blarg = mysql_result($r, 0, 'blah');
所需代码:
if ($r && $r->num_rows)
$blarg = $r->result(0, 'blah');
但是没有这样的事情。 :(
有什么我想念的吗?或者我将不得不吮吸它并做出一切:
if ($r && $r->num_rows)
{
$row = $r->fetch_assoc();
$blarg = $row['blah'];
}
答案 0 :(得分:35)
当回答时,我想我可以在提出相同问题后给出答案。以下函数完全复制mysql_result()函数,并在您的请求超出范围时返回false(空结果,没有该行的行,没有该数字的列)。它确实有额外的好处,如果你没有指定行,它假设0,0(要传递的值少一个)。该功能已更新,以允许字段 或字段名称的数字偏移。
function mysqli_result($res,$row=0,$col=0){
$numrows = mysqli_num_rows($res);
if ($numrows && $row <= ($numrows-1) && $row >=0){
mysqli_data_seek($res,$row);
$resrow = (is_numeric($col)) ? mysqli_fetch_row($res) : mysqli_fetch_assoc($res);
if (isset($resrow[$col])){
return $resrow[$col];
}
}
return false;
}
答案 1 :(得分:14)
PHP 5.4现在支持function array dereferencing,这意味着你可以这样做:
if ($r && $r->num_rows)
{
$row = $r->fetch_assoc()['blah'];
}
答案 2 :(得分:4)
function db_result($result,$row,$field) {
if($result->num_rows==0) return 'unknown';
$result->data_seek($row);
$ceva=$result->fetch_assoc();
$rasp=$ceva[$field];
return $rasp;
}
答案 3 :(得分:4)
您可以通过提取对象而不是数组来完成此操作。
$mysqli->query("SELECT email FROM users WHERE userid = 'foo'")->fetch_object()->email;
你需要PHP 5+来使用像这样的方法链接。
或者,如果您使用程序化MySQLi,则可以轻松编写与mysqli_result
匹配的mysql_result
函数。
答案 4 :(得分:3)
嗯,你可以随时将它缩短为:
if ($r && $r->num_rows)
list($blarg) = $r->fetch_row();
但这可能会和你一样好。
答案 5 :(得分:1)
我建议您将此行添加到Cris' solution,以便能够通过执行db_result('mytable.myfield)
和db_result('myfield')
来获得结果,因为它是原始{{3}}的默认行为1}}功能。
mysql_result
答案 6 :(得分:0)
如果您只在查询中选择一个字段,而您只希望选定字段的单个返回数据,那么这可以:
function mysqli_datum($result)
{
if ($result->num_rows == 0)
return;
$result->data_seek(0);
$row=$result->fetch_row();
return $row[0];
}
答案 7 :(得分:0)
这是对Mario Lurig的回答的改编,它使用mysqli_result
对象而不是mysqli
的过程版本。
/**
* Accepts int column index or column name.
*
* @param mysqli_result $result
* @param int $row
* @param int|string $col
* @return bool
*/
function resultMysqli(mysqli_result $result,$row=0,$col=0) {
//PHP7 $row can use "int" type hint in signature
$row = (int)$row; // PHP5 - cast to int
if(!is_numeric($col) ) { // cast to string or int
$col = (string)$col;
} else {
$col = (int)$col;
}
$numrows = $result->num_rows;
if ($numrows && $row <= ($numrows-1) && $row >=0) {
$result->data_seek($row);
$resrow = (is_numeric($col)) ? $result->fetch_row() : $result->fetch_assoc();
if (isset($resrow[$col])){
return $resrow[$col];
}
}
return false;
}
答案 8 :(得分:-1)
这是一个很好的答案,来自http://php.net/manual/es/class.mysqli-result.php
<?php
function mysqli_result($result,$row,$field=0) {
if ($result===false) return false;
if ($row>=mysqli_num_rows($result)) return false;
if (is_string($field) && !(strpos($field,".")===false)) {
$t_field=explode(".",$field);
$field=-1;
$t_fields=mysqli_fetch_fields($result);
for ($id=0;$id<mysqli_num_fields($result);$id++) {
if ($t_fields[$id]->table==$t_field[0] && $t_fields[$id]->name==$t_field[1]) {
$field=$id;
break;
}
}
if ($field==-1) return false;
}
mysqli_data_seek($result,$row);
$line=mysqli_fetch_array($result);
return isset($line[$field])?$line[$field]:false;
}
?>
答案 9 :(得分:-1)
我使用以下函数替换mysql_result()
function mysqli_result($result, $iRow, $field = 0)
{
if(!mysqli_data_seek($result, $iRow))
return false;
if(!($row = mysqli_fetch_array($result)))
return false;
if(!array_key_exists($field, $row))
return false;
return $row[$field];
}
答案 10 :(得分:-1)
我最终使用了程序风格的自定义函数:
function mysqli_result($res, $row, $field=0) {
mysqli_data_seek($res, $row);
return mysqli_fetch_array($res)[$field];
}
参考:https://www.sitepoint.com/community/t/change-mysql-result-to-mysqli/190972/6
答案 11 :(得分:-4)
如果您正在寻找一个强大的库来进行数据库连接,我建议您使用AdoDB。此库可以连接到多个数据库,如果更改数据库,则不必重写查询,只要它不包含特定数据库引擎的任何特定SQL即可。检查this page以获取使用示例。此外,如果您使用PHP5,则可以使用foreach for iteration。
我希望这可以帮助您将任何旧代码转换为更强大的跨数据库代码。