このコードはエラーをスローしませんが、クエリは失敗します。つまり、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;
}
}
これに追加したかっただけで、エラーメッセージがないことから同様のフラストレーションがありました。
PDOがサイレントに失敗するのを防ぐために、PDO接続でエラーモードを設定できます。
$dbh = new PDO();
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
もあります PDO::ERRMODE_WARNING
エラーが必要な場合でも、続行します。
私もそのエラーに直面していました。
print_r($con->errorInfo());
を使用しました0000
in 0th
配列のキー。
次に、すべての列名を照合し、間違ったフィールド名を使用していることがわかりました。
これ 私の日を節約します。
今週、このサイレントインサートの失敗に苦労しました。これが私のために働いた解決策です。トランザクションでcommitを呼び出していなかったため、挿入は保留状態になりましたが、データベースで完了しませんでした。したがって、エラーは発生しませんでした。このプロジェクトのPDRdbラッパーは静的クラスであるため、自動的に閉じられないため、これは注意が必要でした。
解決策:挿入/更新/削除アクションの後、またはページを閉じるときに、必ずPDOハンドルでcommitを呼び出してください。
$PDO->exec("COMMIT;");
誰かがメインIDフィールドのDB自動インクリメントをオフ/オフにした場合にも、同様の問題が発生する可能性があります。