web-dev-qa-db-ja.com

このPDOプリペアドステートメントはfalseを返しますが、エラーはスローしません

このコードはエラーをスローしませんが、クエリは失敗します。つまり、executeメソッドはfalseを返します。どうしてそうなの?

require_once("Abstracts/DBManager.php");
require_once("UI/UI.Package.php");
class BlogDBM extends DBManager
{
     private $table = "blog_records";
     function saveRecord($title,$url,$desc,$feedId,$pubDate)
     {
      $PDO = $this->db->connect();
      try
  {

   $query = $PDO->prepare("
    INSERT INTO ".$this->table."
    (title,url,desc,feed_id,pubdate) VALUES
    (:title,:url,:desc,:feed_id,:pubdate)");
   $query->bindParam(":title", $title);
   $query->bindParam(":url", $url);
   $query->bindParam(":desc", $desc);
   $query->bindParam(":feed_id", $feedId, PDO::PARAM_INT);
   $query->bindParam(":pubdate", $pubDate, PDO::PARAM_INT);
   $query->execute();
   //return $PDO->lastInsertId();


  } catch(PDOException $e)
  {
   echo "Error " . $e->getMessage();

  }
  $PDO = NULL;
     }
}
18
Simsevu

MySQLがdescフィールド名でチョークすることはかなり確信しています-それは 予約語 です。 「 `」引用符で囲むか、フィールド名を変更する必要があります。

エラー報告については、 errorInfo メソッドを使用してください。 PDOに実際に例外で失敗したクエリの結果を出力させることはできますが、デフォルトの動作(私は思う)は、クエリをまったく実行できない場合にのみ例外をスローしますが、クエリが失敗しない場合故障しています。

18
Pekka 웃

これに追加したかっただけで、エラーメッセージがないことから同様のフラストレーションがありました。

PDOがサイレントに失敗するのを防ぐために、PDO接続でエラーモードを設定できます。

$dbh = new PDO();
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

もあります PDO::ERRMODE_WARNINGエラーが必要な場合でも、続行します。

40
WhoIsRich

私もそのエラーに直面していました。

print_r($con->errorInfo());を使用しました0000 in 0th配列のキー。

次に、すべての列名を照合し、間違ったフィールド名を使用していることがわかりました。

これ 私の日を節約します。

4

今週、このサイレントインサートの失敗に苦労しました。これが私のために働いた解決策です。トランザクションでcommitを呼び出していなかったため、挿入は保留状態になりましたが、データベースで完了しませんでした。したがって、エラーは発生しませんでした。このプロジェクトのPDRdbラッパーは静的クラスであるため、自動的に閉じられないため、これは注意が必要でした。

解決策:挿入/更新/削除アクションの後、またはページを閉じるときに、必ずPDOハンドルでcommitを呼び出してください。

$PDO->exec("COMMIT;");

0
xeo

誰かがメインIDフィールドのDB自動インクリメントをオフ/オフにした場合にも、同様の問題が発生する可能性があります。

0
DragonLord