【问题标题】:Getting mysqli result as array for json_encode() in PHP在 PHP 中获取 mysqli 结果作为 json_encode() 的数组
【发布时间】:2013-12-31 10:44:48
【问题描述】:

在升级我的旧 PHP 版本后,我终于说服自己从 PHP mysql 切换到 mysqli。但是,我没有设法实现与以前相同的方法:

这是旧方法:

$sth = mysql_query("select * from .....");

$rows = array();

while($r = mysqli_fetch_assoc($sth)) {
    $rows[] = $r;
}

print json_encode($rows);

这是我的mysqli方法:

$prename = "Peter";

$rows = array();

$mysqli = new mysqli($server, $user, $pass, $dbase);

if ($stmt = $mysqli->prepare("select lastname where prename = ? order by prename asc")) {

    /* bind parameters for markers */
    $stmt -> bind_param("s", $prename);

    /* execute query */
    $stmt -> execute();

    /* bind result variables */
    $stmt -> bind_result($lastname);

    /* fetch value */
    $stmt->fetch();

    echo $lastname;

    /* close statement */
    $stmt -> close();
}

/* close connection */
$mysqli -> close();

print json_encode($rows);

如何将查询结果添加到$rows[] 数组?返回值必须是一个 json 字符串,将由我的 web 应用程序解析。我用$stmt -> fetch_array 尝试了几种解决方案,但都没有奏效。

非常感谢您的帮助。

【问题讨论】:

  • 您是否在$lastname 中获得了预期的结果?
  • @Rikesh,是的,$lastname 填充了数据库中的数据。
  • 而不是将其放入 $rows 数组而不是回显它。
  • 一定有更好的解决方案。上面的示例已编辑。最初我从返回的数据库中有 20 个字段。我希望能够像使用普通 mysql_query 一样做类似的事情:$rows[] = $r;

标签: php mysql sql mysqli prepared-statement


【解决方案1】:

您将在此处的 php.net mysqli bind_result 页面上找到问题的解决方案:

http://www.php.net/manual/en/mysqli-stmt.bind-result.php

在 gmail dot com 上查看 nieprzeklinaj 的评论

他/她提供了一个函数 fetch(),它将作为 fetch all 用于准备好的 mysqli 语句(返回数组中的完整结果集)。它适用于动态数量的选定字段。

您可以将 fetch() 函数添加到您的 php 代码中(当然您可以随意调用它)。

然后要在上面提供的代码中使用它,您可以执行以下操作:

$prename = "Peter";

$rows = array();

$mysqli = new mysqli($server, $user, $pass, $dbase);

if ($stmt = $mysqli->prepare("select lastname where prename = ? order by prename asc")) {

     /* bind parameters for markers */
     $stmt -> bind_param("s", $prename);

     /* execute query */
     $stmt -> execute();

     /* call the fetch() function provided by (nieprzeklinaj at gmail dot com) */
     $rows = fetch($stmt);
}

/* close connection */
$mysqli -> close();

print json_encode($rows);

更新

已满

我创建了一个名为“comment”的测试表,并为其提供了一个“prename”字段和一些其他随机字段,仅用于演示目的:

<?php
//fetch function from php.net (nieprzeklinaj at gmail dot com)
function fetch($result)
{    
    $array = array();

    if($result instanceof mysqli_stmt)
    {
        $result->store_result();

        $variables = array();
        $data = array();
        $meta = $result->result_metadata();

        while($field = $meta->fetch_field())
            $variables[] = &$data[$field->name]; // pass by reference

        call_user_func_array(array($result, 'bind_result'), $variables);

        $i=0;
        while($result->fetch())
        {
            $array[$i] = array();
            foreach($data as $k=>$v)
                $array[$i][$k] = $v;
            $i++;

            // don't know why, but when I tried $array[] = $data, I got the same one result in all rows
        }
    }
    elseif($result instanceof mysqli_result)
    {
        while($row = $result->fetch_assoc())
            $array[] = $row;
    }

    return $array;
}


$prename = "Peter";

$rows = array();

$server = 'localhost';
$user = 'user';
$pass = 'pass';
$dbase = 'mydatabase';

$mysqli = new mysqli($server, $user, $pass, $dbase);

$prename = "Peter";

$rows = array();

if ($stmt = $mysqli->prepare("select * from comment where prename = ? order by prename asc")) {

     /* bind parameters for markers */
     $stmt -> bind_param("s", $prename);

     /* execute query */
     $stmt -> execute();

     /* call the fetch() function provided by (nieprzeklinaj at gmail dot com) */
     $rows = fetch($stmt);
}
else{
    //print error message
    echo $mysqli->error;
}


/* close connection */
$mysqli -> close();

print json_encode($rows);

输出是:

[{"prename":"Peter","comment_id":1,"fullname":"Peter 1","email":"some email"},{"prename":"Peter","comment_id":2,"fullname":"Peter 2","电子邮件":"一些 email"},{"prename":"Peter","comment_id":3,"fullname":"Peter 3","email":"一些电子邮件"}]

数据库表信息(以便您检查输出):

mysql> describe comment;
+------------+--------------+------+-----+---------+-------+
| Field      | Type         | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+-------+
| prename    | varchar(100) | YES  |     | NULL    |       |
| comment_id | int(11)      | YES  |     | NULL    |       |
| fullname   | varchar(150) | YES  |     | NULL    |       |
| email      | varchar(150) | YES  |     | NULL    |       |
+------------+--------------+------+-----+---------+-------+

mysql> select * from comment;
+---------+------------+----------+------------+
| prename | comment_id | fullname | email      |
+---------+------------+----------+------------+
| Peter   |          1 | Peter 1  | some email |
| Peter   |          2 | Peter 2  | some email |
| Peter   |          3 | Peter 3  | some email |
+---------+------------+----------+------------+

【讨论】:

  • 这没有按预期工作。没有生成输出:(
  • 嗯,考虑到您的 sql 语法中没有任何错误,应该没问题(我注意到您没有检查您发布的原始代码中的错误)。我将在这里发布我的完整代码和结果,以便您可以看到它的工作。
  • 我没有看到您的查询中指定的表名。这可能是导致您返回没有结果的错误。
【解决方案2】:

我最终使用了 PDO,因为它似乎比 mysqli 容易得多:

$stmt = $db->prepare("select * from .....");
$stmt->execute(array($lastname));
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
print json_encode($rows);

【讨论】:

    【解决方案3】:

    你可以像这样填充你的数组

    /* bind result variables */
    $stmt -> bind_result($lastname);
    
    /* fetch value */
    while ($stmt->fetch()) {
        array_push($row, $lastname);
    }
    

    【讨论】:

      【解决方案4】:

      我需要从没有准备好的语句的 mysqli 查询中获取带有数字数组的 JSON。

      <?php 
        header('Content-Type: application/json');
        $conn = include_once("dbopen.php");
        $result = mysqli_query($conn, "CALL sp_readtable");
        $data = array();
        while ($row = mysqli_fetch_row($result)){
            $data[] = $row;
        }
        echo json_encode($data, JSON_NUMERIC_CHECK);
      ?>
      

      结果是一个没有键开销的二维真数组,如下所示:

      [
        ["row1fieldvalue1","row1fieldvalue2"],
        ["row2fieldvalue1","row2fieldvalue2"],
        ...
      ]
      

      【讨论】:

      • 你很少运行没有参数的静态查询,所以你的解决方案非常有限
      • @YourCommonSense:我发布这个答案是因为我需要一个来自 json 的 true array 并且我找不到任何解决方案,所以我花了几个小时的测试- 也许有人感兴趣。顺便说一句,由于我现在需要一些其他参数化存储过程,我将在我的帖子中添加另一个示例。
      • 尤其是如果你学习 PHP 一周,你应该使用 PDO,直到为时不晚。关于您的编辑,它应该从您的答案中删除,因为它是 SQL 注入 的确切示例,本主题的目的就是避免它
      • 如果你的问题是一个“真正的数组”,那么你应该问一个问题,而不是写一个答案,因为有一种更简单的方法可以从 mysqli 获取数字索引。
      • @YourCommonSense:非常感谢您的编辑。
      【解决方案5】:

      说服自己使用 PDO

      $stm = $db->prepare("select lastname where prename = ? order by prename asc");
      $stm->execute([$prename]);
      echo json_encode($stm->fetchAll());
      

      【讨论】:

      • 在这种情况下如何绑定我的变量?
      【解决方案6】:
          //index.html (jQuery)
                      $.ajax({
                          type : "POST",
                          url : "getResults.php",
                          data : "ID=" + "160",
                          datatype : "json",
                          success : function(result) {
                              console.log(result);
                          },
                              error : function(msg) {
                                  console.log("error",msg);
                              }
                      });
      
          //getResults.php
      <?php
          try {
              include ('config.php');
      
              $db = connect();
      
              $stmt = $db -> prepare('SELECT * FROM test where test2_id = ? group by test4_id,test5_id');
      
              $p1 = "151";
      
              $stmt -> bind_param('s', $p1);  //$_POST['ID']);
      
              $stmt -> execute();
      
              $result = $stmt -> get_result();
      
              $returnVAR = array();
      
              //MYSQLI_NUM = Array items will use a numerical index key.
              //MYSQLI_ASSOC = Array items will use the column name as an index key.
              //MYSQLI_BOTH = [default] Array items will be duplicated, with one having a numerical index key and one having the column name as an index key.
              while ($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) {
                  $returnVAR[] = $row;
              }
      
              //unicode
              header("Content-Type: application/json", true);
      
              echo json_encode($returnVAR);
      
          } catch (exception $e) {
              echo json_encode(null);
          }
      ?>
      
          //config.php
          <?php
      
          function connect() {
              $mysql_hostname = "localhost"; 
              $mysql_user = "coin";
              $mysql_password = "P8";
              $mysql_database = "c3in";
      
              //setup a connection with mySQL
              $mysqli = new mysqli($mysql_hostname, $mysql_user, $mysql_password,$mysql_database);
      
              /* check connection */
              if (mysqli_connect_errno()) {
                  printf("Connect failed: %s\n", mysqli_connect_error());
                  exit();
              }
      
              //enable utf8!
              $mysqli -> query("SET character_set_results = 'utf8', character_set_client = 'utf8', character_set_connection = 'utf8', character_set_database = 'utf8', character_set_server = 'utf8'");
      
              return $mysqli;
          }
      
          ?>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-05-27
        • 2018-06-13
        • 2011-11-19
        • 2010-12-02
        相关资源
        最近更新 更多