2012-10-14 88 views
1

我正試圖使用​​POSTAJAX將數據保存到數據庫中。該腳本作爲Firefox的用戶腳本運行。當我運行腳本時,沒有顯示錯誤,數據庫中也沒有顯示任何錯誤。javascript post to database

PHP

$db_connection = new PDO("mysql:host=$hostname;dbname=$database", $username, $password); 
    //$db_connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT); 
    //$db_connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING); 
    //$db_connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

    $insert_key = $db_connection->prepare("INSERT into userstats (key, match, expire) VALUES (?, ?, ?, ?)"); 
    $insert_key->bindParam(1, $_POST["user"]); 
    $insert_key->bindParam(2, $_POST["score"]); 
    $insert_key->bindParam(3, $_POST["location"]); 
    $insert_key->bindParam(4, $_POST["pointtime"]); 
    $insert_key->execute(); 

    $db_connection = null; 

    echo "saved to database!"; 

} catch(PDOException $e) { 
    echo $e->getMessage(); 
} 

的JavaScript

xhr = new XMLHttpRequest(); 
xhr.open("POST", "stats.php", true); 
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
xhr.setRequestHeader("Content-length", params.length); 
xhr.setRequestHeader("Connection", "close"); 
xhr.onreadystatechange = function() { 
    if (xhr.readyState == 4 && xhr.status == 200) { 
     console.log(xhr.responseText); 
    } 
} 

var params = "?user=james&score=5&location=homepage&pointtime=1350249055"; 
xhr.send(params); 

回答

3

KEYMATCHMySQL reserved keywords,所以你的聲明沒有被適當地準備。將它們用反引號把它作爲列名:

$insert_key = $db_connection->prepare("INSERT into userstats (`key`, `match`, expire) VALUES (?, ?, ?, ?)"); 

至於爲什麼它沒有拋出異常,請確保你確實有PDO配置拋出異常。如果你不這樣做,$insert_key將是FALSE,你會得到E_WARNING s爲隨後的嘗試綁定params並執行它。

我會建議確保error_reporting()啓用和display_errors上,所以如果你沒有得到拋出異常,而是得到了導致腳本終止一個致命的錯誤,你至少會看到錯誤輸出返回給你的AJAX來電console.log()

ini_set('display_errors', 1); 
error_reporting(E_ALL); 
+0

哇我真不敢相信我錯過了那個。小時和測試,它來到這哈哈。我也必須在POST上使用mysql_real_escape_string,或者PDO如何處理? –

+0

@ Mr.1.0不,你不使用'mysql_real_escape_string()',因爲這是完全不同的API的一部分。綁定參數在內部處理。我剛剛更新了,'MATCH'也是保留的,必須加引號。 –

+0

當您處於這種狀態時,最好始終引用列名和表格以防止陷入下一個預留關鍵字問題。 – Sven