いくつかの古いPHPコードをmysqlからMySQLiに移植していますが、ちょっとした障害に遭遇しました。
古いmysql_result()
関数に相当するものはありませんか?
mysql_result()
は、複数の行を操作しているときは他の関数よりも遅いことを知っていますが、多くの場合、結果とフィールドは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は function array dereferencing をサポートするようになりました。つまり、これを行うことができます。
if ($r && $r->num_rows)
{
$row = $r->fetch_assoc()['blah'];
}
answeredながら、同じ質問をした後に与えられた答えを改善できると思いました。次の関数はmysql_result()関数を完全に複製し、リクエストの範囲外の場合はfalseを返します(空の結果、その番号の行、その番号の列はありません)。行を指定しない場合、0,0(渡される値が1つ少ない)と見なされるという追加の利点があります。関数は、フィールドの数値オフセットまたはフィールド名を許可するように更新されました。
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;
}
これを行うには、配列ではなくオブジェクトを取得します。
$mysqli->query("SELECT email FROM users WHERE userid = 'foo'")->fetch_object()->email;
このようなメソッドチェーンを使用するには、PHP 5+が必要です。
あるいは、手続き型MySQLiを使用している場合、独自のmysqli_result
に一致する関数mysql_result
。
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();
しかし、それはあなたが得ようとしているのと同じくらい良いかもしれません。
デフォルトであるため、db_result('mytable.myfield)
とdb_result('myfield')
の両方を実行して結果を取得できるように、この行を Cris 'solution に追加することをお勧めします。元の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)]:''));
}
クエリで1つのフィールドのみを選択し、選択したフィールドの単一の戻りデータのみを期待する場合、これは機能します。
function mysqli_datum($result)
{
if ($result->num_rows == 0)
return;
$result->data_seek(0);
$row=$result->fetch_row();
return $row[0];
}
これは、マリオ・ルリグの答えを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;
}