2012-11-08 90 views
0

Possible Duplicate:
PDO Database access WHERE title = $title呼叫一個成員函數調用setFetchMode()上的非對象PDO

這裏是$消息的內容的示例:

String(108) "\n cc je t'ai envoy� une invitation A plus :p\n "

以下是錯誤消息:

Fatal error: Call to a member function setFetchMode() on a non-object in B:\wamp\www\messages.php on line 101

我的請求不起作用:

$resultats = $connexion->query("SELECT * FROM messages WHERE message LIKE '%$message%'"); 
    $resultats->setFetchMode(PDO::FETCH_OBJ); 
    $occurences= $resultats->rowCount(); 

這個爲什麼有效? (我通過a更改$消息):

$resultats = $connexion->query("SELECT * FROM messages WHERE message LIKE '%a%'"); 
     $resultats->setFetchMode(PDO::FETCH_OBJ); 
     $occurences= $resultats->rowCount(); 
+1

你沒有正確地轉義它。如果您使用PDO開始,請使用參數化查詢。而且您沒有檢查是否設置了「$ resultats」,也沒有檢查任何錯誤消息。 – mario

+1

您不應該參數化您的查詢嗎?我想象你的信息在某個地方有一個引號。 –

+0

@mario&Waleed Khan是的..非常感謝,問題是從引號.. – Ydhem

回答

1

只需用PDO與被用於mysql_*不會給你帶來任何好,同樣的技術,你需要採取的parameterized queries的優勢:

$query = $connexion->prepare("SELECT * FROM messages WHERE message LIKE ?"); 
$query->setFetchMode(PDO::FETCH_OBJ); 
if($query->execute(array('%'.$message.'%'))) { 
    // process 
} 
else { 
    // only for debugging purposes, not a live app 
    var_dump($connexion->errorInfo()); 
} 

它執行所有必要自動和正確轉義對於你的參數,你通過​​方法傳遞。


至於I used addslashes:這是不安全。使用上面演示的準備好的語句。

除非你生成SQL –實際的SQL邏輯,與用戶沒有空白填充生成的內容–你應該永遠有需要SQL中的PHP變量。

+0

我與你的代碼有同樣的問題:o這很奇怪。我試過這=>'$ query = $ connexion-> prepare(「SELECT * FROM messages WHERE message LIKE:msg」); $ resultats = $ query-> execute(array('msg'=>'%'。$ message。'%')); $ resultats-> setFetchMode(PDO :: FETCH_OBJ);'但是我有同樣的問題......但它使用addslashes和一個簡單的「執行」。 – Ydhem

+0

@貼子請參閱我的關於如何獲取錯誤信息的編輯。 – phant0m

+0

@ phanto0m $ message = string(21)的var_dump「\ n salluuuut \ n」 而且我遇到了一個致命錯誤:在第103行的messages.php中的非對象上調用成員函數setFetchMode() 。所以它是同樣的錯誤,第103行=> $ resultats-> setFetchMode(PDO :: FETCH_OBJ);.我很確定我的請求是正確的。 – Ydhem

1

嘗試使用PDO準備。這幾乎相當於mysql_real_escape_string()。這可能會消除大部分(如果不是全部)由於特殊字符而導致的錯誤。

+0

我用addslashes。但是,謝謝,我會看看準備。 – Ydhem

相關問題