2012-10-14 56 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