【问题标题】:PDO uses correct value but inserts wrong value into databasePDO 使用正确的值,但将错误的值插入数据库
【发布时间】:2015-05-30 18:24:23
【问题描述】:

我有一个对我的 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 后的结果:

在分数是十进制数和我使用 PARAM_STR 方面是否存在(未来)问题?

【问题讨论】:

  • 我复制了 PHP 代码。这对我来说可以。你能把var_dump($name, $score) 的结果放在某个地方吗?
  • @ockcyp 已添加!感谢您的宝贵时间
  • 你也可以把你的表定义?看起来分数列太小了,无法容纳 12
  • 啊,我明白了!我有decimal(1,0)。我将其更改为Decimal(10,1),它工作正常!非常感谢!

标签: php mysql ajax database pdo


【解决方案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;

【讨论】:

  • 我已将其更改为Decimal(10,1)。那也是正确的,对吧?
  • 这也有效。这取决于您输入的值。
  • 至少1个,最大可能在10000左右。我只需要1个十进制数
  • 那你就可以DECIMAL(6,1) UNSIGNED了。这将允许 099999.9 之间的值
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-22
  • 1970-01-01
  • 2018-07-26
  • 2013-07-28
  • 1970-01-01
相关资源
最近更新 更多