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

我意识到,由于我在 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 样式的预准备语句时,我发现很难调试。例如,是否有一种简单的方法可以简单地查看实际使用的查询?)

如果我执行以下操作,就像一个简单粗暴的例子:

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

4

2 回答 2

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 脚本中连接到不同的数据库,而不是他们用于临时查询的数据库。因此,您需要绝对确定您正在验证数据是否存在于正确的数据库中。

于 2009-06-19T20:53:41.107 回答
0

那不应该是

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

当您选择 2 列时

于 2009-06-19T20:53:39.717 回答