在我的sql语法中找不到错误-php(检查语法手册?)

kwvwclae  于 2021-06-24  发布在  Mysql
关注(0)|答案(4)|浏览(338)

问题是:

我试图从数据库users中的可变现金金额中减去0.05,我用ajax调用这个文件,但是什么都没有发生。要解决此问题,我在浏览器中打开了文件,出现以下错误:

错误:

sql语法有错误;请查看与mysql服务器版本对应的手册,以获取在第1行的“”附近使用的正确语法

代码:

PHP:

<?php
session_start();

$servername = "localhost";
$username = "myUser";
$password = "myPass";
$dbname = "myDBname";
$cash_amount = $_SESSION['cash_amount'];

// Create connection

$userid = $_SESSION['id'];

// You must enter the user's id here. /\

$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection

if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

// Fetch the existing value of the cash_amount against that particular user here. You can use the SELECT cash_amount from users where userid = $userid
$_SESSION['cash_amount'] -= 0.05;
$newAmount = $cash_amount - 0.05;

$sql = "UPDATE users SET cash_amount = $newAmount WHERE id = $userid";
$result = $conn->query($sql);

if($result)
{
   echo "5 cents have been subtracted!";
}
else
{
   echo mysqli_error($conn);
   session_start();
   session_unset();
   session_destroy();
}

$conn->close();
?>

javascript/ajax:

function countdownEnded() {
    //make serverscreen dissapear
        document.getElementById('serverScreenWrapper').style.display = 'none';
        document.getElementById('serverScreenWrapper').style.opacity = '0';
        document.getElementById("cashOutNumTwo").style.right = '150%';
        document.getElementById("cashOutNumOne").style.right = '150%';
//start Timer
        setInterval(gameTimer.update, 1000);
//make player move again
        socket.emit('4');
        socket.emit('6');
//make game appear
        document.getElementById('gameAreaWrapper').style.opacity = 1;
//play sound
        document.getElementById('spawn_cell').play();
//cut 5 cents from account - php function
        $.ajax({
        type: "POST",
        url: 'http://cashballz.net/game/5game/subtract5.php',
        data: { },
        success: function (data) {
            alert(data);
        }
    });
}

我的数据库:

我的表名为users,它位于db casu帐户的内部。
格式如下:
id |名字|姓氏|电子邮件|密码|现金|金额| 4介于|哈希|活动

结论:

我很困惑为什么我的php代码不起作用,我已经尝试过搜索一个修复程序,我发现了“sql注入”这个词,但仍然没有找到错误。我在js方面是高级的,但对php来说是初学者,所以请耐心听我说。谢谢!

nfs0ujit

nfs0ujit1#

替换

$sql = "UPDATE users SET cash_amount = '$newAmount' WHERE id = '$userid'";

相反

$sql = "UPDATE users SET cash_amount = $newAmount WHERE id = $userid";
xxe27gdn

xxe27gdn2#

您在查询中插入数据,如果这是您想要的,您可以使用mostafa的答案,并在这些值周围加上引号,以防它们的格式不正确。这也意味着您必须在将它们放入查询之前检查它们是否是合法的值。
然而,它们也可能受到用户输入的影响,所以一定要使用pdo准备好的语句。

$sql = "UPDATE users SET cash_amount = :newAmount WHERE id = :userid";
$conn = $conn->prepare($sql, [PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY]);
$conn->execute([':newAmount' => $newAmount, ':userid' => $userid])

…应该解决这个问题。但是确保你有你认为你有可以防止很多红鲱鱼。

dba5bblo

dba5bblo3#

您可以简化查询并

$sql = "UPDATE users SET cash_amount = cash_amount - 0.05 WHERE id = $userid";

但是为了避免sql注入的可能性,我还建议修改代码以使用这样的参数化和绑定查询

$sql = "UPDATE users SET cash_amount = cash_amount - 0.05 WHERE id = ?";
$stmt = $conn->prepare($sql);
$stmt->bind_param('s', $userid);
$result = $stmt->execute();
2w2cym1i

2w2cym1i4#

语法错误表明附近有问题 '' 也就是说,没有任何东西会在它被混淆的地方出现。i、 例如,它在查询结束时会变得混乱。
如果 $userid 为空,您的sql查询将为

UPDATE users SET cash_amount = ... WHERE id =

这显然是错误的语法,因为 = 需要两个操作数。
你需要确保你的 $userid 具有非空值。
其他答案中的建议试图通过使用引号或查询参数来解决这个问题,但真正的问题是您没有检查它 $userid 在你使用它之前有一个值。

相关问题