首先,我仍在学习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();
}
答案 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= ?