MySQLi эквивалент mysql_result ()? - PullRequest
39 голосов
/ 19 января 2010

Я портирую некоторый старый код 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'];  
}

Ответы [ 11 ]

35 голосов
/ 07 января 2014

Хотя ответил , я думал, что смогу улучшить ответ, полученный после того же вопроса.Следующая функция полностью копирует функцию 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;
}
14 голосов
/ 07 декабря 2012

PHP 5.4 теперь поддерживает разыменование массива функций , что означает, что вы можете сделать это:

if ($r && $r->num_rows)  
{  
    $row = $r->fetch_assoc()['blah'];  
}
4 голосов
/ 05 мая 2011

Вы можете сделать это, выбрав объект вместо массива.

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

Вам необходим PHP 5+, чтобы использовать цепочку методов, подобную этой., легко написать собственную функцию mysqli_result, которая соответствует mysql_result.

4 голосов
/ 23 сентября 2010
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 голосов
/ 19 января 2010

Ну, вы всегда можете сократить его до чего-то вроде этого:

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

Но это может быть так же хорошо, как вы собираетесь получить.

1 голос
/ 16 ноября 2012

Я предлагаю вам добавить эту строку в Cris 'решение , чтобы иметь возможность получить результат, выполнив db_result('mytable.myfield) и db_result('myfield'), поскольку это поведение по умолчанию для исходного 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)]:'')); 
}
0 голосов
/ 19 февраля 2019

Адаптация ответа Марио Лурига с использованием объекта 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 голосов
/ 29 октября 2015

Я использую следующую функцию для замены 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];
}
0 голосов
/ 16 декабря 2014

Это хороший ответ, от 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;
}
?>
0 голосов
/ 06 декабря 2012

Если вы выберете в запросе только ОДНО поле и ожидаете только одного возвращенного данных выбранного поля, то это работает:

function mysqli_datum($result)
{
    if ($result->num_rows == 0)
        return;
    $result->data_seek(0);
    $row=$result->fetch_row();     
    return $row[0];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...