2012-06-02 16 views
6

Recibo el siguiente error al intentar hacer coincidir valores en la base de datos con los aprobados en un formulario para verificar si existe un usuario.Error fatal capturable: el objeto de la clase PDOStatement no se pudo convertir a la cadena

Catchable fatal error: Object of class PDOStatement could not be converted to string

Este es el código que estoy usando:

//Check users login details 
    function match_login($username, $password){ 
      //If the button has been clicked get the variables 
      try{ 

       $dbh = new PDO("mysql:host=localhost;dbname=mjbox","root", "usbw"); 

      } catch(PDOException $e) { 

       echo $e->getMessage(); 

      } 
      $stmt = $dbh->prepare("SELECT * FROM mjbox WHERE username=? AND password=?"); 
      $stmt->bindParam(1, $username); 
      $stmt->bindParam(2, $password); 
      $stmt->execute(); 

      $result = mysql_query($stmt); 
      if(mysql_num_rows($result) > 0){ 

       echo 'There is a match!'; 
      }else{ 
       echo 'nooooo'; 
      } 
    } 
+3

se supone que usted no debe usar 'mysql_ *' si está usando PDO ........ – Esailija

Respuesta

7

mysql_query() y PDO no son compatibles y no se pueden utilizar juntos. Está intentando pasar el objeto de declaración PDO al mysql_query() que espera una cadena. En su lugar, desea recuperar filas de $stmt a través de uno de los métodos de ir a buscar de DOP, o comprobar el número de filas devueltas con rowCount():

$stmt = $dbh->prepare("SELECT * FROM mjbox WHERE username=? AND password=?"); 
$stmt->bindParam(1, $username); 
$stmt->bindParam(2, $password); 

if ($stmt->execute()) { 

    // get the rowcount 
    $numrows = $stmt->rowCount(); 
    if ($numrows > 0) { 
    // match 
    // Fetch rows 
    $rowset = $stmt->fetchAll(); 
    } 
    else { 
    // no rows 
    } 
} 
+0

Gracias ¿por qué coloco el método de ejecución dentro de una instrucción if? – crm

+1

@crm Si falla por algún motivo, devolverá FALSE, por lo que solo se realizará una simple comprobación de error. Supongo que en este caso arrojaría una excepción si el comando execute() fallara, por lo que realmente no es necesario envolverlo en un if. Puede ponerlo dentro de un try/catch. –

+0

Bien gracias Michael. – crm

1

MySQL y PHP5/DOP no trabaja bien con devolver el número de filas. Después de que su nueva DOP(), ejecuta:

$dbh->setAttribute(PDO::MYSQL_ATTR_FOUND_ROWS, true); 

a continuación realizará su consulta ...

$stmt = $dbh->prepare("SELECT * FROM mjbox WHERE username=? AND password=?"); 
$stmt->bindParam(1, $username); 
$stmt->bindParam(2, $password); 
$stmt->execute(); 

// number of rows returned 
if($stmt->rowCount()){ 
    // ... matches 
}else{ 
    // .. no match 
} 

De lo contrario su rowCount habría ya sea bool 0, o un error nulo/tiro.

Cuestiones relacionadas