2012-06-02 2 views
6

Ich erhalte den folgenden Fehler beim Versuch, Werte in der Datenbank mit denen in einem Formular übereinzustimmen, um zu überprüfen, ob ein Benutzer existiert.Abfangbarer schwerwiegender Fehler: Objekt der Klasse PDOStatement konnte nicht in Zeichenfolge konvertiert werden

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

Dies ist der Code Ich verwende:

//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

Sie sollten 'mysql_ *' nicht verwenden, wenn Sie PDO verwenden ........ – Esailija

Antwort

7

mysql_query() und PDO sind nicht kompatibel und nicht zusammen verwendet werden können. Sie versuchen, das PDO-Anweisungsobjekt an mysql_query() zu übergeben, das eine Zeichenfolge erwartet. Stattdessen möchten Sie Zeilen aus $stmt über eine der PDO des Abrufverfahren holen, oder überprüfen Sie die Anzahl der Zeilen mit rowCount() zurückgegeben:

$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

Danke, warum haben Sie die execute-Methode in eine if-Anweisung eingefügt? – crm

+1

@crm Wenn es aus irgendeinem Grund fehlschlägt, wird es FALSE zurückgeben, also nur eine einfache Fehlerprüfung. Ich nehme an, in diesem Fall würde es eine Exception werfen, wenn die Ausführung von execute() fehlschlagen würde, so dass Sie sie nicht wirklich in ein if einpacken müssen. Sie könnten es in einen Versuch/Fang setzen. –

+0

Okay danke Michael. – crm

1

MySQL und PHP5/PDO nicht gut funktionieren mit der Anzahl der Zeilen zurück. Nach Ihrem neuen gU(), Ausgabe:

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

Dann gibt Ihre Anfrage ...

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

Andernfalls wird Ihr rowCount würde entweder Bool 0 oder null/throw Fehler.

Verwandte Themen