在PHP中将mysqli结果获取为json_encode()的数组
在升级旧的PHP版本后,我终于说服自己从PHP mysql切换到mysqli。但是,我没有实施与以前相同的方法: 这是老办法:在PHP中将mysqli结果获取为json_encode()的数组,php,mysql,sql,mysqli,prepared-statement,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); $prename = "Peter"; $rows = array();
$sth = mysql_query("select * from .....");
$rows = array();
while($r = mysqli_fetch_assoc($sth)) {
$rows[] = $r;
}
print json_encode($rows);
$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);
这是我的mysqli方法:
$sth = mysql_query("select * from .....");
$rows = array();
while($r = mysqli_fetch_assoc($sth)) {
$rows[] = $r;
}
print json_encode($rows);
$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字符串,由我的webapplication解析。我用$stmt->fetch\u数组尝试了几种解决方案,但都不起作用
非常感谢您的帮助。您可以这样填充阵列
/* bind result variables */
$stmt -> bind_result($lastname);
/* fetch value */
while ($stmt->fetch()) {
array_push($row, $lastname);
}
说服自己使用PDO
$stm = $db->prepare("select lastname where prename = ? order by prename asc");
$stm->execute([$prename]);
echo json_encode($stm->fetchAll());
您可以在php.net mysqli bind_结果页面上找到您的问题的解决方案: 查看gmail.com上nieprzeklinaj的评论 他/她提供了一个函数fetch,该函数将作为fetchall,用于在数组中返回完整结果集的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);
我最终使用了PDO,因为它似乎比mysqli简单得多:
$stmt = $db->prepare("select * from .....");
$stmt->execute(array($lastname));
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
print json_encode($rows);
我需要从mysqli查询中获取带有数字数组的JSON,而不需要准备语句
<?php
header('Content-Type: application/json');
$conn = include_once("dbopen.php");
$result = mysqli_query($conn, "CALL sp_readtable");
$data = array();
while ($row = mysqli_fetch_row($result)){
$data[] = $row;
}
echo json_encode($data, JSON_NUMERIC_CHECK);
?>
您是否在$lastname中获得了预期的结果?@Rikesh,是的,$lastname中填充了数据库中的数据。而不仅仅是将其放入$rows数组中,而不是将其回显。一定有更好的解决方案。以上示例已编辑。最初,我从返回的数据库中有20个字段。我希望能够像使用普通mysql_查询一样执行类似的操作:$rows[]=$r;这并没有像预期的那样起作用。没有生成任何输出:嗯,考虑到您的sql语法中没有任何错误,应该没有问题。我注意到您没有检查您发布的原始代码中的错误。我将在这里发布我的完整代码和结果,以便您可以看到它正在工作。我没有看到您的查询中指定的表名。这可能是导致您不返回结果的错误。在这种情况下,如何绑定变量?您很少运行没有参数的静态查询,因此您的解决方案非常复杂limited@YourCommonSense:我之所以发布这个答案,是因为我需要一个来自json的真实数组,而我在任何地方都找不到解决方案,所以我花了几个小时进行测试——也许是有人感兴趣。顺便说一句,由于我现在需要一些其他参数化存储过程,我将在我的帖子中添加另一个例子。特别是如果你学习PHP一周,你应该使用PDO,直到它还不太晚。关于你的编辑,应该从你的答案中删除它,因为这正是SQL注入的例子,本主题的目的就是避免它,如果你的问题是一个真正的数组,那么你应该问一个问题,而不是写一个答案,因为有一种更简单的方法可以从mysqli获取数字索引。@YourCommonSense:非常感谢您的编辑。
[
["row1fieldvalue1","row1fieldvalue2"],
["row2fieldvalue1","row2fieldvalue2"],
...
]