nim*_*rod 0 php mysql sql mysqli prepared-statement
升级旧的 PHP 版本后,我终于说服自己从 PHP mysql 切换到 mysqli。但是,我没有设法实施与以前相同的方法:
这是旧方法:
$sth = mysql_query("select * from .....");
$rows = array();
while($r = mysqli_fetch_assoc($sth)) {
$rows[] = $r;
}
print json_encode($rows);
Run Code Online (Sandbox Code Playgroud)
这是我的 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);
Run Code Online (Sandbox Code Playgroud)
如何将查询结果添加到$rows[]数组中?返回值必须是将由我的 web 应用程序解析的 json 字符串。我尝试了几种解决方案,$stmt -> fetch_array但都没有奏效。
非常感谢您的帮助。
您将在 php.net mysqli bind_result 页面上找到您问题的解决方案:
http://www.php.net/manual/en/mysqli-stmt.bind-result.php
查看 nieprzeklinaj 在 gmail dot 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);
Run Code Online (Sandbox Code Playgroud)
更新
满的
我创建了一个名为“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);
Run Code Online (Sandbox Code Playgroud)
输出是:
[{"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 |
+---------+------------+----------+------------+
Run Code Online (Sandbox Code Playgroud)