【问题标题】:MYSQLI prepared statement proceeds no outputMYSQLI 准备好的语句没有输出
【发布时间】:2013-09-03 12:58:53
【问题描述】:

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

 ?>

【问题讨论】:

  • 首先,您的表中是否有帖子 ID 为 450 的行?其次,您在添加错误检测时遇到了一些麻烦,但为什么中途停止呢? store_resultbind_result 都可能失败。
  • 如你所说,我已经添加了。并且代码在 bind_result() 阶段停止。
  • 错误提示...?
  • Number of bind variables doesn't match number of fields 如果你想知道

标签: php mysql mysqli prepared-statement


【解决方案1】:

您最初的问题是您没有检查每个调用是否失败,只是一开始就检查了少数。 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】:

    这是你的 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;
    }
    

    【讨论】:

      【解决方案3】:

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

      error_reporting(E_ALL);
      

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

      【讨论】:

        猜你喜欢
        • 2012-12-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-18
        • 2011-03-07
        • 2014-06-11
        • 2011-06-20
        相关资源
        最近更新 更多