在升级我的旧 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 字符串。我用 $stmt -> fetch_array
尝试了几种解决方案,但都没有奏效。
非常感谢您的帮助。
最佳答案
您将在此处的 php.net mysqli bind_result 页面上找到问题的解决方案:
http://www.php.net/manual/en/mysqli-stmt.bind-result.php
查看 nieprzeklinaj 在 gmail.com 上的评论
他/她提供了一个 fetch() 函数,它将作为准备好的 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":"some email"},{"prename":"Peter","comment_id":3,"fullname":"Peter 3","email":"some 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 |
+---------+------------+----------+------------+
关于php - 在 PHP 中获取 mysqli 结果作为 json_encode() 的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20856049/