Этот подготовленный оператор PDO возвращает false, но не выдает ошибку - PullRequest
18 голосов
/ 25 марта 2010

Этот код не выдает ошибку, но запрос не выполняется, то есть метод 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;
     }
}

Ответы [ 6 ]

39 голосов
/ 26 июня 2010

Просто хотел добавить к этому, испытывал аналогичные разочарования из-за отсутствия сообщения об ошибке.

Чтобы прекратить молчаливый сбой PDO, вы можете установить режим ошибки для соединения PDO.

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

Существует также PDO::ERRMODE_WARNING, если вы хотите ошибки, но все еще продолжаете.

18 голосов
/ 25 марта 2010

Я почти уверен, что MySQL захлебывается именем поля desc - это зарезервированное слово . Вы должны поместить его в кавычки `` 'или, что лучше, изменить имя поля.

Что касается сообщения об ошибках, используйте метод errorInfo . Вы можете заставить PDO фактически выводить результат неудавшегося запроса в исключении, но поведение по умолчанию - я думаю - выдает исключение, только если запрос вообще не может быть выполнен, но это не дает сбоя, если запрос неисправен.

4 голосов
/ 08 августа 2014

Я тоже столкнулся с этой ошибкой.

Я использовал print_r($con->errorInfo());, это дает мне 0000 в 0th ключе массива.

Затем я сопоставил имена всех столбцов и выяснил, что я использую неправильное имя поля.

Это спасает мой день.

3 голосов
/ 24 июня 2016

Это также происходит, когда вы используете PDOStatement::bindValue() с PDO::PARAM_BOOL.Решение: просто переключитесь на PDO::PARAM_INT.

0 голосов
/ 28 апреля 2016

Я боролся с этой неудачной вставкой на этой неделе. и вот решение, которое сработало для меня. я не вызывал commit для транзакции, поэтому вставка была переведена в состояние ожидания, но никогда не была завершена в базе данных - следовательно, нет ошибки. это было сложнее, потому что оболочка PDR db в этом проекте является статическим классом, поэтому она не закрывается автоматически

решение: не забудьте вызвать commit для дескриптора PDO после действий вставки / обновления / удаления - или при закрытии страницы.

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

0 голосов
/ 28 ноября 2012

Подобные проблемы могут возникать, когда кто-то включает / выключает автоинкремент БД в основном поле id.

...