预处理语句没有返回任何内容。

3
我知道这个特定的查询有效,因为我用未准备好、过程式的方法进行了测试。以下是代码:

我知道这个特定的查询有效,因为我用未准备好、过程式的方法进行了测试。以下是代码:

$name = 'introduction';
$mysqli = new mysqli('localhost', 'user', 'pass', 'db') or die('There was a problem connecting to the database.');
$stmt = $mysqli->prepare("SELECT name, content FROM sections WHERE name = ?");
$stmt->bind_param('s', $name);
$stmt->execute();
$stmt->bind_result($content);
$stmt->fetch();
echo  $content;
$stmt->close();

我意识到,由于在sections表中有一个id列作为索引,因此我还需要将其绑定为结果,根据php.net上面的语句(再次感谢Bill)。

这是新代码:

$name = 'introduction';
$mysqli = new mysqli('localhost', 'user', 'pass', 'db') or die('There was a problem connecting to the database.');
$stmt = $mysqli->prepare("SELECT name, content FROM sections WHERE name = ?");
$stmt->bind_param('s', $name);
$stmt->execute();
$stmt->bind_result($id, $name, $content);
$stmt->fetch();
echo $content;
$stmt->close();

再次感谢所有能提供建议的人。(我很好奇:在使用面向对象风格的预处理语句时,我发现很难进行调试。例如,有没有一种简单的方法只是查看实际使用的查询语句?)

如果我做以下操作,只是一个快速而简单的示例:

$name = 'introduction';
@mysql_connect('host', 'user', 'pass');
@mysql_select_db('db');
$query = "SELECT name,content FROM sections WHERE name = '$name'";
$result = mysql_query($query) or die(mysql_error());
while($row = mysql_fetch_object($result)) {
    $content = $row->content;
    echo $content;
}

我的数据出现了,一切都很好。但是,如果我按照以下方式操作:

$name = 'introduction';
$mysqli = new mysqli('localhost', 'user', 'pass', 'db') or die('There was a problem connecting to the database.');
$stmt = $mysqli->prepare("SELECT name, content FROM sections WHERE name = ?");
$stmt->bind_param('s', $name);
$stmt->execute();
$stmt->bind_result($name, $content);
$stmt->fetch();
echo  $content;
$stmt->close();

我认为这是正确的(当然,如果不正确请随便叫),但我没有得到任何结果。更重要的是,使用该代码时,当我进行html验证(以防万一)时,我会收到一个内部服务器警告(500),我认为这可能是与sql代码有关的问题。我是不是疯了?


请不要在问题更新中发布答案 - 这就是“编辑”链接的作用。 - John Rasch
@John:谢谢你,另一个用户刚刚告诉了我,我已经编辑了我的原始问题。抱歉。 - Steve K
2个回答

4
我看不出你准备语句或使用参数有什么问题,但是在绑定结果时有问题:http://php.net/manual/en/mysqli-stmt.bind-result.php 说:

请注意,在调用 mysqli_stmt_fetch() 之前,必须在执行 mysqli_stmt_execute() 后绑定所有列

(强调我)


上述文档应该理解为查询中的所有列,而不是表中的所有列。

好的,我刚刚自己尝试了一下。如果我省略 $name 列,它会给出以下警告:

PHP Warning:  mysqli_stmt::bind_result(): Number of bind variables doesn't 
match number of fields in prepared statement in mysqli.php on line 9
PHP Stack trace:
PHP   1. {main}() /Users/bill/workspace/PHP/mysqli.php:0
PHP   2. mysqli_stmt->bind_result() /Users/bill/workspace/PHP/mysqli.php:9

但它确实获取了数据。

如果我将$name$content都绑定到查询结果,它可以正常工作,没有错误或警告。

所以我不得不问你:您确定数据库中有与您的条件匹配的行吗?也就是说,name ='introduction'?请记住,在SQL中,默认情况下字符串比较区分大小写。

我经常看到人们犯的一个错误是,在PHP脚本中连接到与他们用于临时查询的不同数据库。因此,您必须确保您正在验证数据存在于正确的数据库中。


0

这不应该是这样吗?

$stmt->bind_result($name, $content);

当您选择2列时


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接