您的SQL语法有误-但一切似乎都很好

时间:2018-07-14 11:27:56

标签: php mysql

首先,我仍在学习php,由于每个人都提供其他方法,因此当我尝试寻找答案时,每个问题似乎都更具误导性。我已经看到很多类似的问题,但是我已经在问题中使用了答案中的每个合理部分。

即时通讯正在我的游戏网站中进行即时通讯,它正在发送任务数据-它是使用ajax从表单中获得的ID(整数)和点值(也是整数)。发送前的控制台日志和发送后的回显都显示正确的值,例如questID = 1&questPTS = 5以及分别在PHP 1和PHP 5中。

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

由于我不懂这种语言,我在mysql请求中使用变量时很挣扎。执行代码后,我得到一个错误:

您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册以获取正确的语法,以便在> php文件路径此处<第12行

的第1行的'1 = 1 WHERE id = 60'附近使用

看起来变量工作正常,因为单击的任务确实为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();
}

3 个答案:

答案 0 :(得分:1)

您的查询的计算结果为:

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

答案 1 :(得分:0)

您可以尝试将更新语句更改为以下内容吗?也许您只需要在列名周围使用反引号即可。

$statement = $mysqli->prepare("UPDATE profiles SET `$questID` =1 WHERE id=$id");

答案 2 :(得分:0)

您的查询没有占位符(?)

message.delete()

然后您将过程与面向对象混合在一起。只需将其删除

UPDATE profiles SET questID= ?  WHERE id= ?