MySQLi相当于mysql_result()?
我将一些旧的PHP代码从mysql移植到MySQLi,我遇到了一个小问题。
有没有相当于旧的mysql_result()
函数?
我知道mysql_result()
比其他函数慢,当你使用多于1行,但很多时候我只有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']; }
PHP 5.4现在支持函数数组解引用 ,这意味着你可以这样做:
if ($r && $r->num_rows) { $row = $r->fetch_assoc()['blah']; }
在回答问题的同时 ,我想我可以改进回答。 下面的函数完全复制了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; }
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; }
那么,你总是可以缩短到这样的东西:
if ($r && $r->num_rows) list($blarg) = $r->fetch_row();
但是,这可能会像你将要得到的那样好。
您可以通过获取对象而不是数组来完成此操作。
$mysqli->query("SELECT email FROM users WHERE userid = 'foo'")->fetch_object()->email;
你需要PHP 5+像这样使用方法链接。
或者,如果使用过程式MySQLi,则可以很容易地编写与mysql_result
相匹配的自己的mysqli_result
函数。
为了能够通过执行db_result('mytable.myfield)
和db_result('myfield')
来获得结果,我建议你将这一行添加到Cris的解决方案中,因为它是原始mysql_result
函数的默认行为。
function db_result($result,$row,$field) { if($result->num_rows==0) return 'unknown'; $result->data_seek($row); $ceva=$result->fetch_assoc(); return (isset($ceva[$field])?$ceva[$field] :(strpos($field,'.')?$ceva[substr($field,strrpos($field,'.')+1)]:'')); }
如果您在查询中只选择了一个字段,并且您只希望单个返回的选定字段的数据,那么这将工作:
function mysqli_datum($result) { if ($result->num_rows == 0) return; $result->data_seek(0); $row=$result->fetch_row(); return $row[0]; }
这是一个很好的答案,从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; } ?>
我使用下面的函数来替换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]; }
如果你正在寻找一个强大的库来做数据库连接,我建议你使用AdoDB 。 这个库可以连接到多个数据库,并且如果更改了数据库,则不必重写查询,只要它不包含特定数据库引擎的任何特定SQL即可。 检查此页面的使用示例。 另外,如果您使用PHP5,则可以使用foreach进行迭代 。
我希望这将帮助您将任何旧的代码转换为更健壮的跨数据库代码。