在我的 SQL 语法中找不到错误 - PHP(请查看语法手册?)

Posted

技术标签:

【中文标题】在我的 SQL 语法中找不到错误 - PHP(请查看语法手册?)【英文标题】:Can't find the error in my SQL syntax - PHP (check manual for syntax?) 【发布时间】:2018-12-05 15:37:33 【问题描述】:

问题:

我正在尝试从名为 users 的数据库中的变量 cash_amount 中减去 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 casball_accounts 中。

格式如下:

标识 |名字 |姓氏 |电子邮件 |密码 |现金金额 | 4 之间 |哈希 |活跃

结论:

我很困惑为什么我的 php 代码不起作用,我已经尝试过寻找修复程序,但我找到了“SQL 注入”这个词,但我仍然没有找到错误。我在 JS 方面很先进,但对 PHP 是初学者,所以请多多包涵。谢谢!

【问题讨论】:

您确认idcash_amount$_SESSION 中正确找到了吗? $sql = "UPDATE users SET cash_amount = cash_amount - 0.05 WHERE id = $userid"; @RiggsFolly 所以这是可行的,但由于某种原因,我必须注销然后在使用它来更新金额时重新登录,你知道为什么吗? 嗨,注销什么? 没关系我修好了,我想给你贴上正确答案的标签,但你是评论 【参考方案1】:

你可以简化查询并做

$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();

【讨论】:

【参考方案2】:

语法错误抱怨'' 附近有问题,这意味着在它混淆的地方没有任何内容。即,它在查询结束时会感到困惑。

如果$userid 为空,您的SQL 查询将为

UPDATE users SET cash_amount = ... WHERE id =

这显然是错误的语法,因为= 需要两个操作数。

您需要确保您的 $userid 具有非空值。

其他答案中的建议尝试通过使用引号或查询参数来解决该问题,但真正的问题是您在使用之前没有检查$userid 是否具有值。

【讨论】:

另一条评论实际上修复了它,但现在文件没有从 AJAX 调用,但是当我将链接放在浏览器中时它可以工作。 除非您可以将 AJAX 问题连接到您的 SQL 更新查询,否则这是一个单独的问题。【参考方案3】:

您正在将数据插入查询中,如果这是您想要的,您可以使用 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])

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

【讨论】:

谢谢,但现在脚本根本无法运行,页面无法打开 mysqli_ 也有准备好的语句,这比将应用程序从 mysqli_ 更改为 PDO 容易得多 那我该怎么办?我应该接受穆斯塔法的回答吗? 这也会破坏$conn 变量供以后使用。我知道这段代码只使用了一次,但它是坏示例代码【参考方案4】:

替换

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

改为

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

【讨论】:

并希望没有人设法将0' OR 1=1 这样的字符串放入$userid

以上是关于在我的 SQL 语法中找不到错误 - PHP(请查看语法手册?)的主要内容,如果未能解决你的问题,请参考以下文章

在 discordjs 中找不到 mysql 语法错误

在我的 for 循环中找不到逻辑错误

学习 PyQt5。在我的代码片段中找不到错误 [关闭]

sqlmetal.exe在路径中找不到,即使它在我的机器上正确的路径 - Linqer程序

maven 在我的存储库中找不到原型

致命错误:在 ConnectionFactory.php 中找不到类 ConnectionWrapper