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 - 将结果绑定到数组的主要内容,如果未能解决你的问题,请参考以下文章