准备好的声明不返回任何内容

时间:2009-06-19 20:43:41

标签: mysqli prepared-statement

请原谅我这个问题愚蠢的可能性,但我刚开始使用准备好的陈述。我知道这个特定的查询是有效的,因为我用无准备的程序方法测试它。这是:

$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();

非常感谢任何正确方向的建议或观点!

编辑1: 我尝试进行故障排除时,只是对我的进度的更新。我意识到,因为我在section表中有一个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();

再次感谢能提供建议的所有人。 (我很好奇:我发现在以这种方式使用OOP样式的预准备语句时很难调试。例如,是否有一种简单的方法可以简单地查看实际使用的查询?)

编辑2: 嗨,谢谢你做了那个测试,我真的很感激。我理解你被迫提出的问题,因为我现在已经把我的大脑震撼了一段时间。我必须说它确实存在。

如果我执行以下操作,就像一个快速而肮脏的例子:

$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代码的问题。我只是疯了吗?

感谢您的继续帮助,非常感谢!

编辑3: 嗯,我觉得自己像个白痴,但是,我已经修好了,比尔,你的问题是正确的。我不知道我到底怎么设置了不正确的数据库细节并且错过了这么久,但这正是发生的事情。

再次感谢您的耐心和愿意提供帮助。

2 个答案:

答案 0 :(得分:4)

我没有看到你准备声明或使用参数有什么问题,但你的绑定结果有问题:

http://php.net/manual/en/mysqli-stmt.bind-result.php说:

  

请注意,必须绑定所有列   在mysqli_stmt_execute()之后和之前   致电mysqli_stmt_fetch()

(强调我的)


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

好的,我自己就试过了。如果我省略$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脚本中连接到的数据库与用于即席查询的数据库相连。因此,您需要绝对确定您正在验证数据是否存在于正确的数据库中。

答案 1 :(得分:0)

不应该是

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

当您选择2列