0

我刚开始学习 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;
  }

 ?>
4

3 回答 3

2

您最初的问题是您没有检查每个呼叫是否失败,只是一开始就检查了几个。两者store_resultbind_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 *地方是您想要获取所有内容的数据库分析工具。如果你事先知道你想要什么,那就是你应该要求的。

于 2013-09-03T13:21:08.737 回答
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;
}
于 2013-09-03T13:16:44.167 回答
0

通过在页面顶部的include 'config.php'之前添加以下代码,确保您的错误报告已打开:

error_reporting(E_ALL);

然后您可以诊断它以找出错误来自哪里。

于 2013-09-03T13:05:01.673 回答