PDO使用正确的值但将错误的值插入数据库

时间:2015-03-26 16:10:40

标签: php mysql ajax database pdo

我对我的PHP文件进行了AJAX调用,该文件能够从数据库中检索和插入高分数。检索部分工作得非常好,但每当我使用插入部分时,都会发生奇怪的事情!

当我进行AJAX调用时,我添加了2个参数:namescore。当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之后的结果:

Result

关于得分为十进制数并且我使用PARAM_STR可能存在(未来)问题吗?

1 个答案:

答案 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;