web-dev-qa-db-ja.com

mysql_result()と同等のMySQLi?

いくつかの古い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'];  
}
40
DOOManiac

PHP 5.4は function array dereferencing をサポートするようになりました。つまり、これを行うことができます。

if ($r && $r->num_rows)  
{  
    $row = $r->fetch_assoc()['blah'];  
}
15
Clamburger

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;
}
35
Mario Lurig

これを行うには、配列ではなくオブジェクトを取得します。

$mysqli->query("SELECT email FROM users WHERE userid = 'foo'")->fetch_object()->email;

このようなメソッドチェーンを使用するには、PHP 5+が必要です。

あるいは、手続き型MySQLiを使用している場合、独自のmysqli_resultに一致する関数mysql_result

4
HertzaHaeon
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; 
}
4
Cris

さて、いつでもこのように短縮できます:

if ($r && $r->num_rows)
    list($blarg) = $r->fetch_row();

しかし、それはあなたが得ようとしているのと同じくらい良いかもしれません。

3
Dereleased

デフォルトであるため、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
nfroidure

クエリで1つのフィールドのみを選択し、選択したフィールドの単一の戻りデータのみを期待する場合、これは機能します。

function mysqli_datum($result)
{
    if ($result->num_rows == 0)
        return;
    $result->data_seek(0);
    $row=$result->fetch_row();     
    return $row[0];
}
0
netrox

これは、マリオ・ルリグの答えを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;
}
0
Buttle Butkus