0

[やっと] PDO を学んでいて、この 1 時間、解決できないように見える問題に取り組んできました。私はこのコードを持っています:

//Simple script that connects to mysql and database.
$db = new PDO ("mysql:host=".Configuration::get('MysqlServername').";dbname=".Configuration::get('MysqlDatabase').";charset=UTF-8",
          Configuration::get('MysqlUsername'),
          Configuration::get('MysqlPassword')) or die ("Error connecting");

// To test why it doesn't work
$STH = $db->prepare("INSERT INTO htranslations (keyword, en, page, last) VALUES (?, ?, ?, NOW())") or die ("Error preparing");
$STH->bindValue(1, "New_test", PDO::PARAM_STR) or die ("Error binding 1");
$STH->bindValue(2, "New test", PDO::PARAM_STR) or die ("Error binding 2");
$STH->bindValue(3, $_SERVER['PHP_SELF'], PDO::PARAM_STR) or die ("Error binding 3");
$STH->execute() or die ("Error executing");

:or dieは、エラーの発生場所をテストするための一時的な手段としてのみ設定されています。このコードは単に機能していません。理由がわかりません。今、私が試したこと:

  • やるときは、ブラウザvar_dump($db);に乗ります。object(PDO)#1 (0) { }これは本来あるべき姿ではないと思いますが、私にはわかりませんし、オンラインであまり見つけることができませんでした. 実行されていないステートメントは、or dieこれが正しいかもしれないと私に思わせます。

  • 表示されるエラーはError executingです。これは、最後のクエリを実行できなかったことを意味しますが、以前に発生した問題である可能性があるため、あまり役に立ちません。

  • Configuration クラスは正しい値を返しています。以前は mysql で動作していましたが、正しい値が返されるかどうかをテストしました (そうです)。

  • 私は 000webhost.com の無料アカウントにいます。このフォーラムの投稿この他の投稿から、ここの PDO に問題はないはずです。さらに、print_r(PDO::getAvailableDrivers());mysql、sqlite、および sqlite2 を返します。

  • 逆に、execute() ステートメントで配列に値を挿入しても機能しません。

動作する以前の mysql_* コードは次のとおりです (以前はエスケープされていました)。

 $sql="INSERT INTO htranslations (keyword, en, page, last) VALUES ('$Id', '$Text', '".$_SERVER['PHP_SELF']."', now())";
 mysql_query($sql);

私が間違っていることがわかりますか?そうでない場合は、少なくともテストを続けるための方向性を教えてもらえますか? 私は主に(それだけではなく)このチュートリアルに従いました。どうもありがとう。

4

1 に答える 1

1

ユーザー andrewsi のおかげで、問題を解決できました。

基本的に、どこで間違いを探すべきかわからなかったので、このコードを実行var_dump($STH->ErrorInfo());して何が問題なのかを突き止め、それを修正しました。私の結果のコードは次のとおりです。

//Simple script that connects to mysql and database.
$db = new PDO ("mysql:host=".Configuration::get('MysqlServername').";dbname=".Configuration::get('MysqlDatabase').";charset=UTF-8",
          Configuration::get('MysqlUsername'),
          Configuration::get('MysqlPassword')) or die ("Error connecting");

// To test why it doesn't work
$STH = $db->prepare("INSERT INTO htranslations (keyword, en, page, last) VALUES (?, ?, ?, NOW())");
$STH->execute(array("New_test","New test",$_SERVER['PHP_SELF']));
var_dump($STH->ErrorInfo());

重複したキーが返されました。そのとき、以前の mysql_* で (一度) 機能したコードが、データベースのエラーのためだけに機能しなかったことに気付きました。

しかし、PDO の方法でエラーをチェックアウトする方法を学びました (まだ try/catch ブロックが必要です)。同様のエラーでこの質問に来た誰かがこの回答で解決することを願っています。

于 2012-11-18T15:56:19.713 に答える