代码之家  ›  专栏  ›  技术社区  ›  DOOManiac

mysqli相当于mysql_result()?

  •  39
  • DOOManiac  · 技术社区  · 15 年前

    我将一些旧的PHP代码从mysql移植到mysql i,我遇到了一个小问题。

    没有等价于旧的吗 mysql_result() 功能?

    我知道 MySql结果() 当您处理的行超过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 回复  |  直到 5 年前
        1
  •  14
  •   Clamburger    12 年前

    php 5.4现在支持 function array dereferencing 也就是说你可以这样做:

    if ($r && $r->num_rows)  
    {  
        $row = $r->fetch_assoc()['blah'];  
    }
    
        2
  •  35
  •   Mario Lurig    10 年前

    同时 回答 我想我可以在有了同样的问题之后改进给出的答案。以下函数完全复制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;
    }
    
        3
  •  4
  •   Kevin Peno    13 年前
    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
  •  4
  •   Nisse Engström sting_roc    7 年前

    您可以通过获取对象而不是数组来实现这一点。

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

    您需要php 5+来使用这样的方法链接。

    或者,如果您使用过程mysqli,那么很容易编写自己的 mysqli_result 匹配的函数 mysql_result .

        5
  •  3
  •   Dereleased    15 年前

    嗯,你可以把它缩短到这样的长度:

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

    但这可能是你能得到的。

        6
  •  1
  •   Nisse Engström sting_roc    7 年前

    我建议您将此行添加到 Cris' solution 为了能够通过这两种方法得到结果 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)]:'')); 
    }
    
        7
  •  0
  •   Nisse Engström sting_roc    7 年前

    如果在查询中只选择一个字段,并且只期望所选字段的单个返回数据,则此操作有效:

    function mysqli_datum($result)
    {
        if ($result->num_rows == 0)
            return;
        $result->data_seek(0);
        $row=$result->fetch_row();     
        return $row[0];
    }
    
        8
  •  0
  •   Buttle Butkus    5 年前

    以下是对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;
    }
    
        9
  •  -1
  •   Fred    10 年前

    这是一个很好的答案,从 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;
    }
    ?>
    
        10
  •  -1
  •   Dima L.    9 年前

    我使用以下函数替换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];
    }
    
        11
  •  -4
  •   Nisse Engström sting_roc    7 年前

    如果您正在寻找一个健壮的库来进行数据库连接,我建议您使用 AdoDB . 此库可以连接到多个数据库,如果更改数据库,则无需重写查询,只要它不包含特定数据库引擎的任何特定SQL。检查 this page 用于使用示例。另外,如果使用php5,则可以使用 foreach for iteration .

    我希望这将有助于您将任何旧代码转换为更健壮的跨数据库代码。