Pregunta

El siguiente bloque de código funciona bien (sin errores)

$query = "select * from users where username = ?";
$statement = $sql->prepare($query);
echo gettype($statement); // -- This returns 'object'
$statement->bindParam(1, $username);

Lo siguiente da: Error grave: Llamada a una función miembro bindParam () en un no objeto en /file.php en la línea 39

$email = 'fake@email.com';
$query = "select * from users where email = ?";
$statement = $sql->prepare($query);
echo gettype($statement); // -- this returns 'boolean'
$statement->bindParam(1, $email); // -- this is line 39.

Ahora esto es extraño.

En mi máquina local y mi host remoto, esto nunca fue un problema.

Estos errores solo aparecen en esta nueva empresa de hosting que estoy probando durante el mes. ¿Podría ser un parámetro de configuración cuando compilaron php?

-------- editar -------- Mientras todavía trataba de averiguar qué estaba mal, descubrí esto.

$query = "select userID, username from users";
$statement = $sql->prepare($query);    
$statement->execute();
$r = $statement->fetchAll(PDO::FETCH_ASSOC);

// display # of rows
echo "Rows returned: " . $statement->rowCount();

// display results array
echo '<pre>'; print_r($r); echo '</pre>'; 

En un servidor, obtengo

Rows returned: 4

Array
(
    [0] => Array
        (
            [userID] => 1
            [username] => lyrae
        )

    [1] => Array
        (
            [userID] => 2
            [username] => jproffer
        )

    [2] => Array
        (
            [userID] => 3
            [username] => king
        )

    [3] => Array
        (
            [userID] => 4
            [username] => gergy
        )

)

Cuál es correcto. Dice 4 filas devueltas y muestra la matriz de resultados. Sin embargo, en otro servidor, obtengo

Rows returned: 0

Array
(
    [0] => Array
        (
            [userID] => 1
            [username] => lyrae
        )

    [1] => Array
        (
            [userID] => 2
            [username] => jproffer
        )

    [2] => Array
        (
            [userID] => 3
            [username] => king
        )

    [3] => Array
        (
            [userID] => 4
            [username] => gergy
        )

)

Por lo tanto, también parece que PDOStatement :: rowCount () no funciona en un servidor, pero funciona en otro.

¿Fue útil?

Solución 2

Se encontró una solución al problema.

Este es todo el bloque de código ..

// check if username exists
$query = "select * from users where username = ?";
$statement = $sql->prepare($query);
$statement->bindParam(1, $username);
$statement->execute();


// check if email exists
$sql2 = new PDO('mysql:host=localhost; dbname=db', 'username', 'pw');
$query = "select * from users";
$statement = $sql2->prepare($query);
echo gettype($statement);
#$statement->bindParam(1, $email);

Entonces, por alguna razón, tengo que crear una nueva instancia de PDO. Lo extraño es que en otros 2 servidores, no tengo que hacer esto.

Y luego de buscar más, descubrí que PDO :: Prepare eleva una PDOExeption.

Aquí está:

SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are active. Consider using PDOStatement::fetchAll(). Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute.

Array
(
    [0] => HY000
    [1] => 2014
    [2] => Cannot execute queries while other unbuffered queries are active.  Consider using PDOStatement::fetchAll().  Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute.
)

Quizás ayude a alguien en el futuro :)

Otros consejos

Lea esto: $ Statement- > closeCursor ()

  

PDOStatement :: closeCursor () libera la conexión al servidor para que se puedan emitir otras instrucciones SQL

¿Está utilizando la misma base de datos en el servidor donde dice que no tiene este problema?

¿El correo electrónico $ no está definido? También puedes probar un var_dump ($ email) para ver qué dice. Buena suerte.

¿Has intentado poner la línea $ email = debajo del bindParam (pero antes de ejecutar)? bindParam pasa el parámetro por referencia para que pueda ejecutarlo como consulta, cambiar el valor de la variable y ejecutar de nuevo.

Creo que probablemente es un error de configuración de PHP. Escuché que la gente decía que PDO tenía muchos errores antes de PHP 5.3, ¿tal vez ver si puede obtener PHP hasta la última versión?

¿También ha intentado intercambiar las dos consultas? Tal vez algo se rompe después de ejecutar una consulta.

Mejor recomiendo usar esto:

$email = 'fake@email.com';
$query = "select * from users where email = ?";
$statement = $sql->prepare($query);
$statement->execute(array($email));

Aquí no se necesita el uso de BindParam.

Tuve el mismo problema con   echo " Filas devueltas: " . $ extracto- > rowCount ();

Tengo -1 filas, jajaja. Mi base de datos es INFORMIX y la búsqueda en la web que encontré that rowCount (); devuelve solo las filas afectadas en una declaración DELETE, INSERT o UPDATE ejecutada por el objeto PDOStatement correspondiente.

Con una instrucción SELECT necesita usar la función   $ Statement- > fetchColumn ();

léalo aquí: http://www.phpbuilder.com /manual/en/function.pdostatement-rowcount.php

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top