Этот подготовленный оператор 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;
}
}
Ответы
Ответ 1
Я уверен, что MySQL захлебывается именем поля desc
- это зарезервированное слово. Вы должны поместить его в кавычки или, что лучше, изменить имя поля.
Что касается сообщения об ошибках, используйте метод errorInfo. Вы можете заставить PDO фактически выводить результат неудавшегося запроса в исключении, но поведение по умолчанию - я думаю - выдает исключение, только если запрос вообще не может быть выполнен, но это не дает сбоя, если запрос неисправен.
Ответ 2
Просто хотел добавить к этому, были схожие разочарования из-за отсутствия сообщения об ошибке.
Чтобы остановить отказ PDO от отказа, вы можете установить режим ошибки в подключении PDO.
$dbh = new PDO();
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
Существует также PDO::ERRMODE_WARNING
, если вы хотите ошибок, но продолжаете.
Ответ 3
Я также столкнулся с этой ошибкой.
Я использовал print_r($con->errorInfo());
, он дает мне 0000
в 0th
ключ массива.
Затем я сопоставил все имена столбцов и выяснил, что я использую неправильное имя поля.
Это сохраняет мой день.
Ответ 4
Это также происходит, когда вы используете PDOStatement::bindValue()
с PDO::PARAM_BOOL
. Решение: просто переключитесь на PDO::PARAM_INT
.
Ответ 5
Подобные проблемы могут возникать, когда кто-то поворачивается/уходит с автоинкремента БД в поле основного идентификатора.
Ответ 6
я боролся с этой молчаливой вставкой на этой неделе. и вот решение, которое сработало для меня. я не вызывал фиксацию транзакции, поэтому вставка была помещена в ожидающее состояние, но никогда не была завершена в базе данных - следовательно, ошибки не было. это было более сложным, поскольку оболочка PDR db в этом проекте является статическим классом, поэтому он не закрывается автоматически
: убедитесь, что вы вызываете commit в дескрипторе PDO после действий вставки/обновления/удаления или на закрытии страницы.
$PDO->exec("COMMIT;");