MYSQLI准备语句没有输出

时间:2013-09-03 12:58:54

标签: php mysql mysqli prepared-statement

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

 ?>

3 个答案:

答案 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_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 *在数据库分析工具中你想得到一切。如果您事先知道自己想要什么,那就是您应该要求的。

答案 2 :(得分:0)

确保在包含'config.php'之前在页面顶部添加以下代码来启用错误报告:

error_reporting(E_ALL);

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