我知道这个特定的查询是有效的,因为我使用未经准备的程序方法对其进行了测试。在这里:
$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 列作为索引,因此我也需要绑定(bind)它,鉴于上面在 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 风格的准备语句时,我发现很难调试。例如,是否有一种简单的方法来简单地查看实际使用的查询?)
如果我执行以下操作,作为一个简单的示例:
$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 代码的问题。我疯了吗?
最佳答案
我没有看到你准备的语句或参数的使用有什么问题,但你的绑定(bind)结果有问题:
http://php.net/manual/en/mysqli-stmt.bind-result.php说:
Note that all columns must be bound after
mysqli_stmt_execute()
and prior to callingmysqli_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
都绑定(bind)到查询结果,它会在没有错误或警告的情况下工作。
所以我不得不问你:你确定数据库中有一行符合你的条件吗?即,name = 'introduction'
在哪里?请记住,在 SQL 中,字符串比较默认区分大小写。
我看到人们经常犯的一个错误是,他们在 PHP 脚本中连接的数据库与他们用于即席查询的数据库不同。因此,您需要绝对确定您正在验证数据是否存在于正确的数据库中。
关于php - 准备好的声明不返回任何东西,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1019959/