首页 > 解决方案 > 您的 SQL 语法有错误 - 但一切似乎都很好

问题描述

首先,我仍在学习 php,当我尝试寻找答案时,每个问题似乎都更加误导,因为每个人都给出了其他方法。我见过很多这样的问题,但我几乎使用了我可以在我的问题中使用的答案的每一个合理部分。

我所做的是在我的游戏站点中发送任务数据 - 它是使用 ajax 的表单的 ID(整数)和点值(也是整数)。发送前的控制台日志和发送后的回显都显示了正确的值,例如 questID=1&questPTS=5 和分别在 php 1 和 5 中。

我试图做的是更新数据库中用户个人资料的任务状态。表称为“配置文件”,但任务是名称从 1 到 25(数字)的列。所以我在表配置文件中进行更新以将特定任务(在本例中为“1”)设置为 1(从当前的 0 到 1,然后我将其视为我的状态),其中用户“id”是存储在会话中的 id。

我在 mysql 请求中使用变量时遇到了困难,因为我不懂这种语言。执行代码后出现错误:

您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获取正确的语法,以便在第 1 行的“1=1 WHERE id=60”附近使用 >php file path here< 第 12 行

看起来变量工作正常,因为单击的任务确实是 1 并且存储在会话中的用户 ID 是 60。我已经看到了很多答案,比如将列的数字名称放在反引号中,如“$questID”(我真的不知道如何在这里输入它们),用点等分隔变量但没有区别,在绑定参数中更改整数/字符串也没有任何作用。

这是我的代码:

<?php
session_start();
include 'db_connect.php';
$questID = $_POST['questID'];
$questID = strval($questID); //this gives 1 in this example
$questPTS = '';
$id = $_SESSION['id']; //this gives 60 in this example
if (isset($_POST['questID'])){
    $statement = $mysqli->prepare("UPDATE profiles SET $questID=1 WHERE id=$id");
    if ($statement === false) {
      trigger_error($mysqli->error, E_USER_ERROR);
      return;
    }
    $questPTS = $_POST['questPTS'];
    $statement->bind_param('si', $questID, $id);
    $result = $statement->execute();
    if(mysqli_query($mysqli, $sql)){
        echo "Updated";
    } else {
        echo "ERROR: $sql. " . mysqli_error($mysqli);
    }
    $statement->close();
}

标签: phpmysql

解决方案


您的查询评估为:

UPDATE profiles SET 1=1 WHERE id=60

这确实是一个 SQL 语法错误。数字列名必须在反引号中转义,因此您应该针对此:

UPDATE profiles SET `1`=1 WHERE id=60

快速说明:您不能将参数用于列标识符,并且由于您的列名来自用户输入,因此您需要格外小心以防止 SQL 注入。您可以使用$id当前未正确执行的值的参数。

// first, make sure `$questID` is actually a number (this will make it 0 if a
// user is testing your security with a string value)
$questID = (int)$questID;

// use an actual placeholder for the $id value
$statement = $mysqli->prepare("UPDATE profiles SET `$questID`=1 WHERE id=?");

// Only $id needs to be bound, because $questID is not a parameter
$statement->bind_param('i', $id);

推荐阅读