Función PDO setFetchMode

Hola, estaba tratando de hacer una función con PDO pero obtuve un error (nuevo en PDO) aquí está mi código

    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;
}

quiero contar la fila DESDE y aquí está el resultado que estaba intentando

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

este es el error

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

por favor ayuda gracias

preguntado el 22 de mayo de 12 a las 20:05

¿Quizás su declaración SQL tiene un error? No sé si puede tener una columna llamada "de" (es decir, count(from)). Es posible que deba envolverlo en marcas de verificación o algo así. -

tengo una columna con el nombre DE -

FROM es una palabra clave en SQL. Debe envolverlo en marcas de verificación en sus declaraciones SQL al describir su columna. -

tu tambien puedes hacer var_dump($STH->errorInfo()); para obtener cualquier error de sql -

1 Respuestas

Debe verificar el valor de retorno de PDO::query(). En PHP (feo) hay muchas funciones que devuelven un valor de tipo mixto. En el caso de PDO::query() el tipo de retorno es PDOStatement o bool, aunque el prototipo en la documentación dice algo diferente:

Descripción
PDOStatement PDO::query ( string $statement )
...

parece que siempre vuelve PDOStatement.

Valores devueltos:
PDO::query() devuelve un objeto PDOStatement o FALSE en caso de falla.

¡Uy, no en todos los casos! Por lo tanto, no se le garantiza que el valor devuelto sea un PDOStatement.

El prototipo correcto sería:

Descripción
mixed PDO::query ( string $statement )
...

En su caso, la consulta no es válida (al usar una palabra clave reservada como FROM como nombre de columna), lo que da como resultado un valor de retorno de tipo booleano con el valor FALSO. Un valor booleano no es un objeto y, por lo tanto, su llamada a $STH->setFetchMode() falla.

Dependiendo de su PDO::ATTR_ERRMODE obtiene

  • una excepción (PDO::ERRMODE_EXCEPTION), por lo que no necesita verificar el valor de retorno
  • una advertencia (PDO::ERRMODE_WARNING)
  • nada (PDO::ERRMODE_SILENT), por lo que debe verificar el valor de retorno, errorCode() y errorInfo()

contestado el 23 de mayo de 12 a las 01:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.