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_resultとの両方bind_resultが失敗することもあります。

あなたの特定の問題(最初の問題を修正したら)は、複数のselect *列を取得しようとしているが、結果に1つしかバインドしていないことです。これは、呼び出しから得られるエラー メッセージから明らかです。bind_result

バインド変数の数がフィールドの数と一致しません

selectステートメントを のように変更するselect id from ...と、機能し始めることがわかります。

ただし、より多くの列が必要であると仮定すると、次のようなバインディングでより多くの変数を提供する必要があります。

$stmt = $db->prepare("SELECT col1, col2 FROM messages WHERE post_id = ?");
:
$ex = $stmt->bind_result($param1, $param2);

select *ほとんどすべての状況で明示的な列の命名を使用することをお勧めします。

  • DB スキーマが変更されても驚くことはありません。
  • 必要なデータのみを取得します。
  • 列を結果変数に適切にマップできます。

私がこれまでに使用しても問題ないとわかった唯一select *の場所は、すべてを取得したい DB 分析ツールです。欲しいものが事前にわかっている場合は、それを求めるべきです。

于 2013-09-03T13:21:08.737 に答える
0

インクルード 'config.php' の前に、ページの上部に次のコードを追加して、エラー報告がオンになっていることを確認してください。

error_reporting(E_ALL);

次に、それを診断して、エラーの原因を突き止めることができます。

于 2013-09-03T13:05:01.673 に答える