2014-02-13 114 views
0

使用PHP PDO時,在預處理語句中調用execute可能會完全掛起腳本的執行。 PDO初始化如下:PHP PDO執行掛起執行

$db = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', ''); 
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING); 
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 
$db->setAttribute(PDO::ATTR_PERSISTENT, false); 

據我所知,連接工作正常 - 沒有任何跡象表明它失敗。然後,我稍後調用prepare並執行,並且執行似乎停止。

echo "Hi";              //executes 
$username = mysql_real_escape_string($_POST['username']); 
echo "Still Here";            //executes 
$password = md5(mysql_real_escape_string($_POST['password'])); 
echo "So far so good";           //executes 
$stmt = $db->prepare("SELECT * FROM users WHERE Username=:username"); 
echo "Still good";            //executes 
$stmt.execute(array(':username' => $username)); 
echo "Nope...";            //doesn't execute 
if($stmt->rowCount() >= 1) 
{ 
    echo "Sorry, that username is already taken."; 
} 

我不確定究竟發生了什麼導致此錯誤,但任何幫助解決它將不勝感激。

+0

更改'$ stmt.execute(array(':username'=> $ username));'to'$ stmt-> execute(array(':username'=> $ username));' –

回答

1

您錯過了->.在執行行。

更換

$stmt.execute(array(':username' => $username)); 

通過$stmt->execute(array(':username' => $username));

您可以使用綁定。您不需要使用mysql_real_escape_string中的PDO

+0

@Colin Moore:你測試過了嗎? –

+0

我懷疑我會永遠活下來哈哈哈,謝謝你,一雙新鮮的眼睛常常會捕捉到這樣的愚蠢錯誤。 –

0

mysql_real_escape_string需要一個mysql連接,因爲你連接的是PDO,所以你的函數不會執行任何操作。

此外,爲什麼你不只使用預處理語句?