Php 您的SQL语法中有一个错误,但似乎一切正常

Php 您的SQL语法中有一个错误,但似乎一切正常,php,mysql,Php,Mysql,首先,我还在学习php,当我试图寻找答案时,每一个问题似乎都会产生误导,因为每个人都给出了其他方法。我见过很多这样的问题,但我在我的问题中使用了几乎所有合理的答案 我所做的是在我的游戏站点中发送任务数据——它是ID(整数)和点值(也是整数),使用ajax从表单发送。发送前的控制台日志和发送后的echo都显示了正确的值,例如questID=1和questPTS=5,分别以php 1和5表示 我要做的是更新数据库中用户配置文件上的任务状态。 表名为“配置文件”,但任务是名称从1到25(数字)的列。因

首先,我还在学习php,当我试图寻找答案时,每一个问题似乎都会产生误导,因为每个人都给出了其他方法。我见过很多这样的问题,但我在我的问题中使用了几乎所有合理的答案

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

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

我一直在努力在mysql请求中使用变量,因为我不懂这种语言。执行代码后,我得到一个错误:

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

看起来变量工作正常,因为clicked quest实际上是1,会话中存储的用户id是60。我见过很多答案,比如在“$questID”(我真的不知道如何在这里输入它们)等后面的记号中放上列的数字名称,用点分隔变量等,但没有区别,在bind参数中更改integer/string也没有任何作用

这是我的代码:

<?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();
}

能否尝试将update语句更改为以下内容。可能您只需要在列名周围使用反勾号

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

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

你把过程和面向对象混为一谈。只需将其移除即可

if(mysqli_query($mysqli, $sql)){
        echo "Updated";
    } else {
        echo "ERROR: $sql. " . mysqli_error($mysqli);
    }

您的查询计算结果为:

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到25(有25个任务),所以我必须使用一个变量来根据在站点上单击的任务给出数字,这是我最大的问题,列正在更改,而不是我想要的值set@Assaeyedjames我更改了答案,请看是否有帮助。我可以使用吗?作为列名?这是我这里最大的问题,列是可变的,而我设置的值始终是相同的。看一看。您的问题是,您正在将
$questID
的值放入您应该放入字段名的查询中。尝试更新配置文件集questID=$questID,其中id=$id
,假设您的表中有一个同名字段。只需检查-您是否真的有名为“1”的列,如果这是问题编号,则您需要检查表结构是否正常化,而不是对该问题进行排序。就是这样!非常感谢,我不知道bind param中的每一件事情实际上并不是我目前不知道的所有事情,但是数据库中实际发生变化的事情,对我来说非常有用!我同意安全问题,但在这里它不是一个优先事项,它是一个项目的一个单一的党我主持今天的游戏:D
// 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);