PDO Функция setFetchMode

Здравствуйте, я пытался сделать функцию с PDO, но получить ошибку (новичок в PDO) вот мой код

function mail_id($mail){ global $host, $dbname, $user, $pass; $DBH = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass); $STH = $DBH->query("select count(from) from messages where from = '$mail'"); $STH->setFetchMode(PDO::FETCH_ASSOC); $row = $STH->fetch(); return $row; } 

Я хочу, чтобы подсчитать строку FROM, и вот мой вопрос, который я пытался

 $mail=mail_id($userid); if (0<count($mail['to_viewed'])) {echo "green";} else {echo "gray";} 

это ошибка

 Call to a member function setFetchMode() on a non-object 

помогите thx

Solutions Collecting From Web of "PDO Функция setFetchMode"

Вам нужно проверить возвращаемое значение PDO::query() . В (уродливом) PHP есть много функций, возвращающих значение смешанного типа. В случае PDO::query() тип возврата – это PDOStatement или bool, хотя прототип в документации говорит что-то другое:

Описание:
PDOStatement PDO::query ( string $statement )
...

Похоже, он всегда возвращает PDOStatement .

Возвращаемые значения:
PDO :: query () возвращает объект PDOStatement или FALSE при сбое.

Ой, не в каждом случае! Поэтому вам не гарантируется, что возвращаемое значение является PDOStatement .

Правильный прототип:

Описание:
mixed PDO::query ( string $statement )
...

В вашем случае запрос недопустим (используя зарезервированное ключевое слово, например FROM, как имя столбца), что приводит к возвращаемому значению типа boolean со значением FALSE. Логическое значение не является объектом, и поэтому ваш вызов $STH->setFetchMode() терпит неудачу.

В зависимости от вашего PDO :: ATTR_ERRMODE вы получаете

  • исключение (PDO :: ERRMODE_EXCEPTION), поэтому вам не нужно проверять возвращаемое значение
  • предупреждение (PDO :: ERRMODE_WARNING)
  • ничего (PDO :: ERRMODE_SILENT), поэтому вам нужно проверить возвращаемое значение, errorCode() и errorInfo()