5

次のコードでテーブルを更新しようとしています。WHERE temp_booking_id = ':temp_booking_id'");実際の現在のセッションを使用するように変更するtemp_idと、クエリは実行されますが、プレースホルダーが値としてテーブルに追加されます (例: チェックアウト)。

$data正しい値を保持していますが、プレースホルダーを置き換えていません。

これを何時間も見つめていて、私の人生では問題が何であるかを理解することができず、周りを見回しましたが、解決策が見つかりませんでした.

PDOStatement:errorInfo()戻ってきています

PDOStatement::errorInfo(): 配列 ( [0] => 00000 )

プレースホルダーの前後の逆コンマを削除すると、返されます

PDOStatement::errorInfo(): 配列 ( [0] => HY093 )

何か案は?

try {
  $data = array(
    'temp_booking_id' => $_SESSION['temp_id'],
    'check_in' => $in,
    'check_out' => $out, 
    'adults' => $a,
    'children1' => $c1,
    'children2' => $c2,
    'infants' => $i,
    'cots' => $c,
    'promo_code' => $pc
 );

 $STH = $DBH->prepare("UPDATE b_temp_booking 
   SET check_in = ':check_in',
   check_out = ':check_out',
   adults = ':adults',
   children1 = ':children1',
   children2 = ':children2',
   infants = ':infants',
   cots = ':cots',
   promo_code = ':promo_code' 
   WHERE temp_booking_id = ':temp_booking_id'");

 $STH->execute($data);

 echo "\nPDOStatement::errorInfo():\n";
 $arr = $STH->errorInfo();
 print_r($arr);

} catch(PDOException $e) {
  echo 'ERROR: ' . $e->getMessage();
}
4

1 に答える 1

5

うーん、あなたの SQL ステートメントには一重引用符が必要ないようです。たとえば、代わりにこのブロックを実行してみてください。

   $STH = $DBH->prepare("UPDATE b_temp_booking 
   SET check_in = :check_in,
   check_out = :check_out,
   adults = :adults,
   children1 = :children1,
   children2 = :children2,
   infants = :infants,
   cots = :cots,
   promo_code = :promo_code 
   WHERE temp_booking_id = :temp_booking_id");

PDO プリペアド ステートメントに関する PHP マニュアルを参照してください

また、bindParam() メソッドを使用する例に従ってみてください。

$STH->bindParam(':temp_booking_id', $temp_booking_id);

$temp_booking_id = $_SESSION['temp_id']; // Not sure how binding the environment variable will work, so decoupling it.

$STH->bindParam(':check_in', $in);
$STH->bindParam(':check_out', $out); 
$STH->bindParam(':adults', $a);
$STH->bindParam(':children1', $c1);
$STH->bindParam(':children2', $c2);
$STH->bindParam(':infants', $i);
$STH->bindParam(':cots', $c);
$STH->bindParam(':promo_code', $pc);

実行する準備ができたら、次の行を実行できます。

$STH->execute();

それをチェックして、パラメーターのバインドが探しているものかどうかを確認してください。

于 2012-07-04T17:30:56.283 に答える