2012-06-02 16 views
6

ユーザーが存在するかどうかを確認するためにフォームに渡された値とデータベースの値を照合しようとすると、次のエラーが発生します。キャッチ可能な致命的なエラー:クラスPDOStatementのオブジェクトを文字列に変換できません

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

これは私が使用しているコードです:

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

PDOを使用している場合は、mysql_ *を使用しないでください... – Esailija

答えて

7

mysql_query()とPDOに互換性がないと一緒に使用することはできません。文字列を必要とするmysql_query()にPDO文オブジェクトを渡そうとしています。代わりに、あなたは行数がrowCount()で返さPDOのフェッチ方法のうちの1つを介して$stmtから行をフェッチするか、チェックしたい:

$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

なぜ、if文の中にexecuteメソッドを配置しましたか? – crm

+1

@crmなんらかの理由で失敗すると、FALSEが返されます。単純なエラーチェックだけです。この場合、execute()が失敗した場合は例外がスローされるので、ifでラップする必要はありません。あなたはtry/catchの中に置くかもしれません。 –

+0

マイケルに感謝します。 – crm

1

MySQLとPHP5/PDOは、行数を返すとうまく動作しません。新しいPDO()した後、問題:

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

は、その後、あなたのクエリを発行...

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

そうでなければ、あなたのROWCOUNTがBOOL 0、またはnull /スロー・エラーのいずれかになります。

関連する問題

 関連する問題