我刚刚开始学习MYSQLI预处理语句技术,并且面临着非常烦人的问题。我的代码在bind_result()处停止。我只是不明白这可能是错的,所以请伙计们帮助我。
这是我的config.php:
<?php
$db_name = 'site';
$db_user = 'root';
$db_pass = 'root';
$db_host = 'localhost';
$db_port = 8889;
$db = new mysqli($db_host, $db_user, $db_pass, $db_name, $db_port);
if($db->connect_errno > 0){
die('Unable to connect to database [' . $db->connect_error . ']');
}
?>
我的主要代码:
<?php
include 'config.php';
$post_id=450;
$stmt = $db->prepare("SELECT * FROM messages WHERE post_id = ?");
if ( false===$stmt ) {
die('prepare() failed: ' . htmlspecialchars($db->error));
}
$ex=$stmt->bind_param('i', $post_id); // Bind "$post_id" to parameter.
if ( false===$ex ) {
die('bind_param() failed: ' . htmlspecialchars($stmt->error));
}
$ex=$stmt->execute();// Execute the prepared query.
if ( false===$ex ) {
die('execute() failed: ' . htmlspecialchars($stmt->error));
}
$ex=$stmt->store_result();
if ( false===$ex ) {
die('store_result() failed: ' . htmlspecialchars($stmt->error));
}
$ex=$stmt->bind_result($p);
if ( false===$ex ) {
die('bind_result() failed: ' . htmlspecialchars($stmt->error));
}
while($stmt->fetch()){
echo $p;
}
?>
答案 0 :(得分:2)
以下是config.php必须如何
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1); // change it to 0 on production server
$db_name = 'site';
$db_user = 'root';
$db_pass = 'root';
$db_host = 'localhost';
$db_port = 8889;
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli($db_host, $db_user, $db_pass, $db_name, $db_port);
以下是您的主要代码必须
<?php
include 'config.php';
$post_id=450;
$stmt = $db->prepare("SELECT * FROM messages WHERE post_id = ?");
$stmt->bind_param('i', $post_id);
$stmt->execute();
$stmt->store_result();
$stmt->bind_result($p); // here is where an error have to be shown
while($stmt->fetch()){
echo $p;
}
答案 1 :(得分:2)
您最初的问题是,您没有检查每次呼叫是否失败,只是开始时的少数几个。 store_result
和bind_result
都可能失败。
您的具体问题(一旦您修复了初始问题)就是您正在select *
获取多个列,但您只是绑定一个在结果中。从bind_result
调用中收到的错误消息可以看出这一点:
绑定变量数与字段数不匹配
如果您将select
语句更改为select id from ...
,则会发现它开始有效。
但是,假设您想要更多列,您应该在绑定中提供更多变量,例如:
$stmt = $db->prepare("SELECT col1, col2 FROM messages WHERE post_id = ?");
:
$ex = $stmt->bind_result($param1, $param2);
你会注意到我没有在那里使用select *
,最好在几乎所有情况下使用显式列命名,以便:
几乎唯一的地方我发现可以使用select *
在数据库分析工具中你想得到一切。如果您事先知道自己想要什么,那就是您应该要求的。
答案 2 :(得分:0)
确保在包含'config.php'之前在页面顶部添加以下代码来启用错误报告:
error_reporting(E_ALL);
然后你可以诊断它以找出来自哪里的错误。