Этот подготовленный оператор 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;");