Php mysqli prepare不会输出为json

Php mysqli prepare不会输出为json,php,mysql,json,mysqli,Php,Mysql,Json,Mysqli,我试图从一个sql表中检索所有记录并将其作为json返回,但是它保持不返回任何内容,即使sql查询在phpMyAdmin中返回了几行。我甚至尝试在循环中只输出所有$id,这很好,但是当我将其作为数组返回时,它只返回一个空页面。我不知道这是否是由$image引起的,它在数据库中是一个blob <?php error_reporting(-1); ini_set('display_errors', 'On'); include('config.php'); $stmt = $db->p

我试图从一个sql表中检索所有记录并将其作为json返回,但是它保持不返回任何内容,即使sql查询在phpMyAdmin中返回了几行。我甚至尝试在循环中只输出所有$id,这很好,但是当我将其作为数组返回时,它只返回一个空页面。我不知道这是否是由$image引起的,它在数据库中是一个blob

<?php
error_reporting(-1);
ini_set('display_errors', 'On');

include('config.php');
$stmt = $db->prepare('SELECT * FROM camps');
$stmt->execute();
$stmt->bind_result($id, $title, $body, $long, $lat, $img);

$rows = array();
while ($stmt->fetch()) {
  $rows[] = array(
    'id' => $id,
    'title' => $title,
    'body' => $body,
    'long' => $long,
    'lat' => $lat,
    'image' => $img
  );
  echo $img;
}

$stmt->close();
$db->close();
echo json_encode($rows);
?>

已编辑:除非绑定结果中的数字与数据库中的列总数匹配,否则无法绑定SELECT*语句。否则,您必须选择所有列和以匹配查询中的列数,如bind_结果中的列数。关于如何显示数据库中的图像,请参阅下面的链接

我有宽大的肩膀,会承认我的错误。没有人不做任何事就能学到任何东西,而我今天也学到了一些东西

参考:

检查了查询中的错误后,如果是这样的话,可能会给您带来一些问题

手册规定:

请注意,所有列都必须在mysqli_stmt_执行之后和调用mysqli_stmt_fetch之前绑定。根据列类型,绑定变量可以静默地更改为相应的PHP类型

那么,我没有得到什么?也许他们应该重写它,因为他们提出了它

编辑:测试

测试了OP在我自己的服务器上发布的PHP 5.6.21版下运行的代码后,返回:

警告:mysqli_stmt::bind_result:绑定变量的数量与

使用“从表中选择*时”

但确实返回了一个JSON结果

使用SELECTCOL1,表中的col2并没有抛出该错误

此外,您正在尝试从数据库中回显图像;使用JSON无法做到这一点,需要使用不同的方法

有关如何从db回显图像,请参阅堆栈上的以下问题:

因此,您的$img看起来像:

echo '<img src="data:image/jpeg;base64,'.base64_encode( $img ).'"/>';
这是我已经成功测试过的东西

不过,您需要知道一点,那就是确保每一行都有一个图像,否则,对于不包含图像块的行,就会出现断开的图像图标。 如果是这种情况,那么您需要将其限制为WHERE子句

注:使用blob可以显著增加数据库的大小。理想情况下,将文件保存在文件夹中并将其路径保存在数据库中是许多人首选的方法。然而,这完全是你的选择

参考答案下面的注释


我无法添加任何内容。

您的表中正好有6列?最好在select语句中明确列出列名。我认为您的问题可能是json_encode。如果只打印_r$行,是否会得到输出;?手册中确实有一个SELECT*方法示例,但与您在这里尝试使用的方法不同。看看它从哪里开始,因为很多人不喜欢bind_结果如何与准备好的语句一起工作@特里,你为什么这么说?据我所见,所有使用的方法都被mysqli公开了,但也许我遗漏了什么?@r3wt我同意。好我几乎准备放弃这个问题,因为我没有得到OP的回应;只是评论和其他人的否决票。哦,好吧,除了尽力帮忙,你还能做什么呢。这就是生活。@Fred ii-,我只是想排除列计数不匹配的风险。这并不是因为我认为……是不允许的。我甚至在PHP页面上看到使用它的用户评论。这当然不是保证。我现在不能自己测试它。。。注意:我没有dv。@Fred ii-,是一个更好的例子,强烈建议它可以工作。我使用PHP7构建了一个测试用例,a$db->prepare'SELECT*FROM-camps';和$stmt->bind_result$id、$title、$body、$long、$lat、$img;它工作起来没有任何问题。因此,使用SELECT*FROM绑定_结果不是问题。至少不是在PHP7中。出于好奇,我用5.4和5.5在两个不同的操作系统上测试了它,在那里它也可以工作。只有当变量计数与列计数不匹配时,我才会收到错误警告:mysqli_stmt::bind_result:bind变量的数量与prepared语句错误中的字段数量不匹配。但如果变量计数匹配,则它是有效的。因此,不能绑定SELECT*语句,必须选择所有列。如果所有列都错误,则可以绑定到SELECT*,但前提是变量与列计数匹配。无论如何,在SELECT*上绑定是个坏主意,因为这样。@nanocv为什么你说我很粗鲁?我已经看过了这些评论,老实说我不是。但是,是的,你和其他对此发表评论的人都是对的,我已经承认了我的错误;-没有人能像我们所有人一样,在不创造它们的情况下学习任何东西。给我看一个从未犯过错误的人,我会给你看一个从未学到过东西的人。这不仅仅适用于 y是编码,但是是我们日常生活的全部-