Mysqli - 将结果绑定到数组

Posted

技术标签:

【中文标题】Mysqli - 将结果绑定到数组【英文标题】:Mysqli - Bind results to an Array 【发布时间】:2014-08-13 08:45:58 【问题描述】:

我最近从 mysql 切换到 mysqli 并开始使用准备好的语句。 在mysql中我们这样做

$result = mysql_query("SELECT * FROM table WHERE id = ?");

所以我们将整个表的数组放在一个变量中。

但在 mysqli 中我们会这样做

mysqli_stmt_bind_result($stmt, $result);

所以基本上这里只有一个变量绑定到变量结果。 我们如何才能获得与从 mysql 获得的相同的变量(数组)? PS - 希望我的问题足够清楚。我知道他们的方法并不多,但我正在寻找最好的方法。 PSS - 我对程序方式更满意。

【问题讨论】:

PSS - I am more comfortable with the procedural way. 那么你不是未来的证明。 我同意。但是 Mysql 是整个程序的方式,我已经做了很长时间了。所以我需要时间来切换到 oop。 试试像doctrine-project.org这样的ORM吧!? 【参考方案1】:

这个代码终于可以工作了!!!!!!

  <?php 
    $host = 'localhost'; 
    $user = 'root'; 
    $pass = '1234'; 
    $data = 'test'; 

    $mysqli = new mysqli($host, $user, $pass, $data); 
    /* check connection */ 
    if (mysqli_connect_errno())  
        printf("Connect failed: %s\n", mysqli_connect_error()); 
        exit(); 
     

    if ($stmt = $mysqli->prepare("SELECT * FROM sample WHERE t2 LIKE ?"))  
        $tt2 = '%'; 

        $stmt->bind_param("s", $tt2); 
        $stmt->execute(); 

        $meta = $stmt->result_metadata(); 
        while ($field = $meta->fetch_field()) 
         
            $params[] = &$row[$field->name]; 
         

        call_user_func_array(array($stmt, 'bind_result'), $params); 

        while ($stmt->fetch())  
            foreach($row as $key => $val) 
             
                $c[$key] = $val; 
             
            $result[] = $c; 
         

        $stmt->close(); 
     
    $mysqli->close(); 
    print_r($result); 
    ?>

【讨论】:

我有一个不包含 mysqlnd 的罐装 PHP 发行版。此代码替换了对 mysqli_stmt_get_result() 和 mysqli_fetch_all() 的调用。【参考方案2】:

使用准备好的语句作为..

$stmt = $mysqli->prepare("SELECT id, label FROM test WHERE id = 1");
$stmt->execute();
$res = $stmt->get_result();
$row = $res->fetch_assoc();

printf("id = %s (%s)\n", $row['id'], gettype($row['id']));
printf("label = %s (%s)\n", $row['label'], gettype($row['label']));

【讨论】:

我想使用 select * @jackkorbin 我的回答有帮助吗??【参考方案3】:

像这样简单地使用

$con=mysqli_connect( "$host", "$mysql_u", "$mysql_p","$mysql_db");/*these variables are ur host,username, password and db name*/
    $val="SELECT * FROM table";
    $ex=mysqli_query($con,$val);
    while ($row = mysqli_fetch_assoc($ex)) 

    $ans=$row['col1'];
    ....
    

【讨论】:

SELECT * FROM table 只是一个例子。我必须使用准备好的语句,因为它实际上是 SELECT * FROM table WHERE id = ?. @jackkorbin 只需添加 where 条件,例如 $val="SELECT * FROM table WHERE col1='aaa'"; 对不起,我再回答你 link此链接可能对您有所帮助 没关系,您可以使用准备好的语句 - 但要获取数组,您仍然在语句上使用(假设您编写程序代码)mysqli_fetch_assoc【参考方案4】:

mysql

$result = mysql_query("SELECT * FROM table");

mysqli

$result = mysqli_query("SELECT * FROM table");

请注意您提供的示例未使用准备好的语句。

但是,如果您想使用 mysqli_stmt_bind_result 并同时返回一个数组而不是一列,您可能需要将其包装为您自己的自定义函数。

好消息,bottom of the docs 上的示例很少,但它们都在 OOP 中(是时候切换了?)。


$result = mysql_query("SELECT * FROM table WHERE id = ?");


/* create a prepared statement */
if ($stmt = mysqli_prepare($link, "SELECT col1, col2  FROM table WHERE id = ?")) 

    /* bind parameters for markers */
    mysqli_stmt_bind_param($stmt, "s", $city);

    /* execute query */
    mysqli_stmt_execute($stmt);


    /* fetch associative array */
    while ($row = mysqli_fetch_assoc($stmt)) 
        printf ("%s (%s)\n", $row["col1"], $row["col2"]);
    


else
    echo "prepared failed";

【讨论】:

@jackkorbin 我已经扩展了我的答案,并包含了一个准备好的陈述示例 @jackkorbin 您最终在我提供的链接中使用了一个示例,您介意批准我的回答吗?【参考方案5】:

PHP 的 variable argument list (ellipsis) operator 可用于动态数量的预准备语句替换:

mysqli_stmt_bind_param($stmt, $params_types, ...$params);

一个例子:

$sql = 'SELECT * FROM Table WHERE one = ? AND two = ?';
$params_types = 'ii';
$params = array(1, 2);

// prepare
$stmt = mysqli_stmt_init($dbconn_read);
if ( mysqli_stmt_prepare($stmt, $sql) ) 

  // bind and execute
  mysqli_stmt_bind_param($stmt, $params_types, ...$params); // unpack array into arguments
  mysqli_stmt_execute($stmt);

  // get column names for binding return results
  $resultmeta = mysqli_stmt_result_metadata($stmt);
  list($columns, $columns_vars) = array(array(), array());
  while ( $field = mysqli_fetch_field($resultmeta) ) 
    $columns[] = $field->name;
    $columns_vars[] = &$'column_' . $field->name;
  

  // call bind function with arguments in array
  call_user_func_array('mysqli_stmt_bind_result', array_merge(array($stmt), $columns_vars));

  // get return results
  $return_array = array();
  while ( mysqli_stmt_fetch($stmt) ) 
    $row = array();
    foreach ( $columns as $col ) 
      $row[$col] = $'column_' . $col; // populate assoc. array with data
    
    $return_array[] = $row; // push row data onto return array
  

更好地结合在一个函数中:

function db_query(&$dbconn, $sql, $params_types, ...$params)  // pack dynamic number of remaining arguments into array

  // GET QUERY TYPE
  $query_type = strtoupper(substr(trim($sql), 0, 4));

  $stmt = mysqli_stmt_init($dbconn);
  if ( mysqli_stmt_prepare($stmt, $sql) ) 
    mysqli_stmt_bind_param($stmt, $params_types, ...$params); // unpack
    mysqli_stmt_execute($stmt);

    if ( 'SELE' == $query_type || '(SEL' == $query_type ) 
      $result = mysqli_stmt_result_metadata($stmt);
      list($columns, $columns_vars) = array(array(), array());
      while ( $field = mysqli_fetch_field($result) ) 
        $columns[] = $field->name;
        $columns_vars[] = &$'column_' . $field->name;
      
      call_user_func_array('mysqli_stmt_bind_result', array_merge(array($stmt), $columns_vars));
      $return_array = array();
      while ( mysqli_stmt_fetch($stmt) ) 
        $row = array();
        foreach ( $columns as $col ) 
          $row[$col] = $'column_' . $col;
        
        $return_array[] = $row;
      

      return $return_array;
     // end query_type SELECT

    else if ( 'INSE' == $query_type ) 
      return mysqli_insert_id($dbconn);
    
    return 1;
  

这样称呼它:

$records = db_query(
  $dbconn_read,
  'SELECT * FROM Table WHERE one = ? AND two = ?',
  'ii', 1, 2
);

【讨论】:

以上是关于Mysqli - 将结果绑定到数组的主要内容,如果未能解决你的问题,请参考以下文章

如何使用循环绑定mysqli参数并将结果存储在数组中?

如何将 MySQLi 结果集加载到二维数组中?

bind_result 成数组 PHP mysqli 准备好的语句

如何将结果集行作为索引子数组添加到结果数组中?

如何使用索引号将数据发送到mysqli(准备好的语句)

mysqli结果foreach结果集转换为数组