Can';在我的SQL语法-PHP中找不到错误(检查手册中的语法?) 问题是:

Can';在我的SQL语法-PHP中找不到错误(检查手册中的语法?) 问题是:,php,mysql,ajax,html,phpmyadmin,Php,Mysql,Ajax,Html,Phpmyadmin,我试图从数据库中名为users的变量cash_amount中减去0.05,我用ajax调用这个文件,但什么都没有发生。要解决此问题,我在浏览器中打开了该文件,并出现以下错误: 错误: 您的SQL语法有错误;请查看与MySQL服务器版本对应的手册,以获取第1行“”附近要使用的正确语法 守则: PHP: 我的数据库: 我的表名为users,它位于DB casball_accounts的内部 格式如下: id |名字|姓氏|电子邮件|密码|现金|金额| 4介于之间|哈希|活动 结论: 我很困惑为什么我

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

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

守则: PHP:

我的数据库: 我的表名为users,它位于DB casball_accounts的内部

格式如下:

id |名字|姓氏|电子邮件|密码|现金|金额| 4介于之间|哈希|活动

结论: 我很困惑为什么我的php代码不起作用,我已经尝试过搜索修复程序,我找到了“SQL注入”这个词,但仍然没有找到错误。我在JS方面是高级的,但对PHP来说是初学者,所以请容忍我。谢谢

更换

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

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

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

…应该处理好这个问题。但是确保你拥有你认为你拥有的东西可以避免很多的麻烦。

语法错误抱怨在
''
附近有一个问题,这意味着在它变得混乱的地方没有任何东西。也就是说,它在查询结束时变得混乱

如果
$userid
为空,则SQL查询将为空

UPDATE users SET cash_amount = ... WHERE id =
这显然是错误的语法,因为
=
需要两个操作数

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


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

您可以简化查询并执行以下操作

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

您是否确认在
$\u会话中正确找到了
id
cash\u amount
$sql=“UPDATE users SET cash\u amount=cash\u amount-0.05,其中id=$userid”
@RiggsFolly所以这是可行的,但出于某种原因,我必须注销,然后在使用它更新金额时重新登录,你知道为什么吗?嗨,注销什么?不管我怎么修复它,我想标记你为正确答案,但你是一个注释另一个注释实际上修复了它,但现在该文件不是从AJAX调用的,但是当我把链接放在浏览器中时,它就工作了。除非你能将AJAX问题连接到SQL update查询,否则这是一个单独的问题。希望没有人能将
0'或1=1这样的字符串输入$useridThank,但现在脚本根本不起作用了,该页面只是没有打开
mysqli_
也有准备好的语句,这比将应用程序从
mysqli_
更改为PDO容易得多。那么我该怎么办呢?我应该使用Mustafa的答案吗?这也会破坏
$conn
变量以供以后使用。我知道这段代码只使用它一次,但它是hust的坏示例代码
$sql = "UPDATE users SET cash_amount = cash_amount - 0.05 WHERE id = $userid";
$sql = "UPDATE users SET cash_amount = cash_amount - 0.05 WHERE id = ?";
$stmt = $conn->prepare($sql);
$stmt->bind_param('s', $userid);
$result = $stmt->execute();