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

准备好的select语句作为数组的结果

  •  14
  • Johannes  · 技术社区  · 7 年前

    我希望得到作为数组(键/值对)准备好的语句的完整结果,以便以后在 str_replace() 功能。

    我的表有三列,一个索引和字段“x1”和“x2”。我成功地使用了以下内容:

    $db = new mysqli("servername", "username", "pw", "dbname");
    
    if($ps1 = $db->prepare("SELECT x1, x2 FROM my_table")) {
      $ps1->execute();
      $ps1->bind_result($search, $replace);
        $result = array();
        while ($ps1->fetch()) {
          $result[$search] = $replace;
        }
        $ps1->close();
    }
    

    然而,我认为必须有一个简单的方法,没有 while 循环,获取完整的结果,而不是从单个行逐个相加。

    我查看了其他问题,并提出了以下问题,但它不起作用(“警告:mysqli_fetch_assoc()期望参数1为mysqli_result”):

    if($ps1 = $db->prepare("SELECT x1, x2 FROM my_table")) {
      $ps1->execute();
      $result = mysqli_fetch_assoc($ps1);
      return $result;
      $ps1->close();
    }
    

    我也试过了 $result = mysqli_fetch_all($ps1); 没有成功(获取“调用未定义函数mysqli_fetch_all()”。

    顺便说一句,我使用的是php 5.6。


    此外,在有关mysqlnd的评论中进行了一些回答和讨论:

    phpinfo() 在其 mysqlnd 章节:

    加载的插件: mysqlnd,debug_trace,auth_plugin_mysql_native_password,auth_plugin_mysql_clear_password,auth_plugin_sha256_password

    7 回复  |  直到 7 年前
        1
  •  0
  •   IVO GELOV    7 年前

    你试过这样的东西吗?

    $db = new mysqli("servername", "username", "pw", "dbname");
    
    if($ps1 = $db->prepare("SELECT x1, x2 FROM my_table")) {
      $ps1->execute();
      $result = $ps1->fetchAll(PDO::FETCH_NAMED);
      $ps1->close();
    }
    

    更新

    我是说像这样(如果你已经安装了 迈斯昆德 驱动器)

    <?php
    $link = mysqli_connect("localhost", "my_user", "my_password", "world");
    
    /* check connection */
    if (mysqli_connect_errno()) {
        printf("Connect failed: %s\n", mysqli_connect_error());
        exit();
    }
    
    $query = "SELECT Name, CountryCode FROM City ORDER by ID DESC LIMIT 150,5";
    
    if ($stmt = mysqli_prepare($link, $query)) {
    
        /* execute statement */
        mysqli_stmt_execute($stmt);
    
        /* get result object */
        $result = mysqli_fetch_all(mysqli_stmt_get_result($stmt));
    
        /* close statement */
        mysqli_stmt_close($stmt);
    }
    
    /* close connection */
    mysqli_close($link);
    ?>
    
        2
  •  2
  •   JesusTheHun    7 年前

    确实有一种更简单的方法。请考虑使用 array_column :

    $link = mysqli_connect("localhost", "my_user", "my_password", "world");
    
    /* check connection */
    if (mysqli_connect_errno()) {
        printf("Connect failed: %s\n", mysqli_connect_error());
        exit();
    }
    
    $query = "SELECT x1, x2 FROM my_table";
    
    if ($stmt = mysqli_prepare($link, $query)) {
    
        /* execute statement */
        mysqli_stmt_execute($stmt);
    
        /* get result object */
        $rows = mysqli_fetch_all(mysqli_stmt_get_result($stmt), MYSQLI_ASSOC);
    
        /* get formatted object */
        $result = array_column($rows, 'x2', 'x1');
    
        /* close statement */
        mysqli_stmt_close($stmt);
    }
    
    /* close connection */
    mysqli_close($link);
    

    编辑:更新答案以使用程序 米斯利 功能

        3
  •  1
  •   Accountant Ù    7 年前

    我就是这样 fetch_all 使用mysqli编写语句的结果

    $stmt = $db->prepare("SELECT x1, x2 FROM my_table")
    $stmt->execute();
    $result = $stmt->get_result();
    $allRows = $result->fetch_all(MYSQLI_ASSOC);
    
        4
  •  1
  •   Saleh Mahmood    7 年前

    对不起,我的英语

    我认为那是不可能的,因为 mysqli_fetch_assoc() 采用 mysqli_result 作为一个论点, mysqli->prepare->execute 返回 mysqli_stmt 对象。

    你能做的就是用程序化的方式 JesusTheHun's 回答或者你可以用 $ps1 = $db->query($stmt) 而不是 prepare and execute 然后传给 $ps1->fetch_all(MYSQLI_ASSOC)

    例子:

    if($ps1 = $db->query("SELECT x1, x2 FROM my_table")) {
      $result = $ps1->fetch_all(MYSQLI_ASSOC);
    
      $ps1->close();
      return $result;
    }
    
    print_r($result);
    

    PHP文档 mysqli

        5
  •  0
  •   Julio    7 年前

    您可以尝试使用如下函数扩展mysqli_result类:

    public function my_fetch_keyval() {
        for ($result = array(); $tmp = $this->fetch_row();) {
            // Expecting 2 columns. 1st = Key; 2nd = Value
            $result[$tmp[0]] = $tmp[1];
        }
        return $result;
    }
    

    然后您可以在代码上使用它:

    if($ps1 = $db->prepare("SELECT x1, x2 FROM my_table")) {
        $ps1->execute();
        $my_assoc_array = $ps1->my_fetch_keyval();
        $ps1->close();
    }
    
        6
  •  0
  •   Nimeshka Srimal    7 年前

    编辑:我浏览了您的评论和其他答案,很明显您没有MySQL本机驱动程序。

    如果你不想使用mysqlnd,我相信你无法摆脱while循环;)

    ==========================================

    你好像错过了一件事!

    你需要打电话给 get_result() 方法,然后 fetch_all() 在那个物体上。

    $db = new mysqli("servername", "username", "pw", "dbname");
    
    if($ps1 = $db->prepare("SELECT x1, x2 FROM my_table")) {
        $ps1->execute();
        $result = $ps1->get_result()->fetch_all();
        //return $result;
        $ps1->close();
    }
    
    echo '<pre>';
    print_r($result);
    

    还请注意,我已经将 return 语句,因为它在该点终止脚本的执行。

    希望有帮助:)

        7
  •  0
  •   Sasa Blagojevic    7 年前

    从先前的答案(缺少适当的 mysqlnd 分机-有两个,一个给 mysqli 和一个 PDO ,我们可以得出这样的结论:您有两个选项,您可以将准备好的语句与while循环或标准查询一起使用,但这会将结果作为关联数组返回。

    由于您没有任何参数,因此可以安全地使用纯OLE查询,因为:

    a)没有必须转义的用户输入,语句中没有参数,因此不存在安全风险。

    b)如果您将准备好的语句用作普通的OLE SQL查询,那么它的性能提升是疏忽的(如果有的话)。当您一次又一次地重复使用同一个语句,只更改绑定到它的参数值时,准备好的语句就会发光。

    那么,让我们切入主题:

    $conn = mysqli($host, $user, $pass, $dbname);
    
    $query = $conn->query("SELECT x1, x2 FROM your_table");
    
    $result = $query->fetch_assoc();
    

    结果将采用以下格式:

    [
       'x1' => 'v1',
       'x2' => 'v2'
    ]
    

    如果您需要整个数据集而不仅仅是一个项,那么使用以下内容:

    $result = $query->fetch_all(MYSQLI_ASSOC);
    

    结果如下:

    [
        [
          'x1' => 'v1',
          'x2' => 'v2'
       ],
       [
         'x1' => 'v1',
         'x2' => 'v2'
       ],
       ...
    ]
    

    更新

    现在我明白了 mysqli::fetch_all 为您也抛出一个错误,那么恐怕没有办法在没有循环的情况下获取整个数据集。如果你想要一个替代方法,可能是这样的:

    $query = $conn->query("SELECT x1, x2 FROM your_table");
    
    $results = [];
    for ($i = 0; $i < $query->num_rows; $i++) {
        $row = $query->fetch_assoc();
        $results[$row['x1']] = $row['x2'];
    }
    

    或者这个:

    while($row = $query->fetch_assoc()) {
       $results[$row['x1']] = $row['x2'];  
    }
    

    但老实说,你也可以按照你最初的方式去做,如果你没有 mysqli::全部获取 可获得的

    推荐文章