0

このコードでエラーが発生しました。

$Database = new Database('localhost','root','password','Db');    

$Statement = $Database->prepare("INSERT INTO User VALUES(:ID,:FirstName,:MiddleName:LastName,:RegisteredDate")

$Array_Bind = array(
'ID'=>$ID,
'FirstName'=>$FirstName,
'MIddeName'=>$MiddleName,
'LastName'=>$LastName
'RegisteredDate'=>$Date
)

foreach($Array_Bind AS $Key=>$value){
$Statement->bindParam(':' .$Key, $value)

}

if($Statement->execute()){
echo 'Successfully inserted into the database';


}else{
echo 'could not insert into database';
};

$ID (PrimaryKey) がデフォルトで MySQL データベースの AUTO-INCREMENTING 値ではない場合、次の点に注意してください。

  1. DATETIME フィールドを除くすべてのフィールドは、データベースに挿入されたときに配列の最後の要素の値を取得します。すなわち

    ID = $LastName FirstName = $LastName MiddleName = $LastName LastName = $LastName RegisteredDate = $RegisteredDate

  2. bindValue を使用した場合も同様のエラーが出力されます。

だから私は結局使った

if($Statement->execute($Array_Bind)){
echo 'Successfully inserted into the database';


}else{
echo 'could not insert into database';
};

質問

  1. このシナリオで bindParam または bindValue を使用するのではなく、すべてのデータがサニタイズされていると仮定して、execute($array_Bind) を使用することをお勧めしますか?

  2. そうでない場合、bindParam または bindValue と配列を使用する方法はありますか?

  3. これはバグですか、それともコーディング アーキテクチャが間違っていますか。

4

2 に答える 2

-1

プレースホルダー名にタイプミスがあることに気付きました。これで問題が解決するかどうかはわかりません

$Statement = $Database->prepare("INSERT INTO User VALUES(:ID,:FirstName,:MiddleName:LastName,:RegisteredDate")

$Array_Bind = array(
'ID'=>$ID,
'FirstName'=>$FirstName,
'MIddeName'=>$MiddleName,
'LastName'=>$LastName
'RegisteredDate'=>$Date
)

プレースホルダーMIddeNameを使用しますが、クエリで使用しますMiddleName

これを変える

'MIddeName'=>$MiddleName,

これに

'MiddleName'=>$MiddleName,
于 2014-04-01T08:03:13.960 に答える
-2

敷地を確認する必要があります。次に、再確認します。次に、ドキュメントを確認します。

  • bindParam の場合、これはバグではなく必須の機能です。
  • bindValue では決して起こらない
  • もちろん、配列を execute() に渡すことをお勧めします。これは、他のメソッドと比較して全体的な健全性とコード量が多いためです。
于 2014-03-31T05:09:44.730 に答える