我对我的PHP文件进行了AJAX调用,该文件能够从数据库中检索和插入高分数。检索部分工作得非常好,但每当我使用插入部分时,都会发生奇怪的事情!
当我进行AJAX调用时,我添加了2个参数:name
和score
。当PDO执行时,它总是插入9作为分数。我有没有线索为什么会发生这种情况,当我插入echo
score
之前,它与我作为参数提供的值完全相同!
你们其中一个人可以帮我解决这个问题吗?
我的AJAX电话:
function sendHighScore(name, score) {
//name = string
//score = decimal
$.ajax({
url: "../php/score_server.php",
type: 'GET',
data: {
"action": "addScore",
"name": name,
"score": score
},
error: function (jqXHR, textStatus, errorThrown) {
console.log(jqXHR);
console.log(textStatus);
console.log(errorThrown);
},
async: true
});
};
我的PHP文件:
<?php
$user = "xxxx";
$pass = "xxxx";
$dbh = new PDO('mysql:host=localhost; port=3307; dbname=Client', $user, $pass);
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
if (isset($_GET['action']) && $_GET['action'] == 'getScore') {
$sqlGetScore = $dbh->prepare("SELECT * FROM score ORDER BY score");
if (!$sqlGetScore) {
echo "\nPDO::errorInfo1():\n";
print_r($dbh->errorInfo());
}
$sqlGetScore->execute();
$result = $sqlGetScore->fetchAll(PDO::FETCH_ASSOC);
echo json_encode($result);
} else if (isset($_GET['action']) && $_GET['action'] == 'addScore') {
$name = $_GET['name'];
$score = $_GET['score'];
echo "Before the prepare statement</br> ";
var_dump($name, $score);
$sqlAdd = $dbh->prepare("INSERT INTO score (name, score) VALUES (:name, :score)");
if (!$sqlAdd) {
echo "\nPDO::errorInfo1():\n";
print_r($dbh->errorInfo());
}
echo "</br>after the prepare statement, before the bindvalues</br> ";
var_dump($name, $score);
$sqlAdd->bindValue(":name", $name, PDO::PARAM_STR);
$sqlAdd->bindValue(":score", $score, PDO::PARAM_STR);
$sqlAdd->execute();
echo "</br>After the execute</br>";
var_dump($name, $score);
}
?>
当我查看数据库时,得分总是为9!有人可以在此脚本中看到任何错误吗?
修改 var_dumps之后的结果:
关于得分为十进制数并且我使用PARAM_STR可能存在(未来)问题吗?
答案 0 :(得分:1)
当我将score
列更改为DECIMAL(1,0)
来自MySQL文档DECIMAL Data Type Characteristics:
MySQL 5.1中的DECIMAL列不允许大于列定义隐含的范围的值。例如,DECIMAL(3,0)列支持-999到999的范围。
请更改score
的列定义,如下所示:
ALTER TABLE `score` CHANGE `score` `score` INT(10) NOT NULL;