为什么此 SQL 更新查询不适用于 WHERE 的变量?



这是我在Stack Overflow的第一篇文章。我知道这个问题以前已经问过很多次了。我经历了很多答案,尝试了所有答案(显然正确的方法除外(,但不知道该尝试什么了。

我有一个SQL表,其中每一行都有一个"编辑"按钮。单击它时,我将所选行的 id 传递给edit.php.在那里,我得到它并使用表单中的用户输入根据 id 更新给定的行。第一列是 id,设置为AUTO_INCREMENT

附带说明一下,无论我使用WHERE id=$id";还是WHERE id='$id'";,我都会收到相同的错误

我认为最接近正确方法的代码如下,并在代码下方生成错误消息:

<html>
<title>
Video Archiv - New
</title>

<body>
<?php
include("connect.php"); 
$id=$_GET['id'];
echo "Details von Video #$id editieren:<br /><br />";

if(isset($_POST['update']))
{
$sql =  "UPDATE VideoArchiv             
SET ('".$_POST["titel"]."','".$_POST["schauspieler"]."')
WHERE id=$id";
$result = mysqli_query($connect,$sql);
if (mysqli_query($connect,$sql) === TRUE) 
{
echo "Record updated successfully";
} 
else 
{
echo "Error updating record: " . $connect->error;
}
}
?>
<form action="edit.php" method="post"> 

<label> Titel:</label><br/>
<input type="text" name="titel" required><br/>
<label>Schauspieler</label><br/>
<input type="text" name="schauspieler" required><br/>
<br />
<button type="submit" name="update">Speichern</button>

</form>
<?php
include("back.php");
?>
</body>
</html> 

错误信息:

更新记录时出错:您的 SQL 语法有错误;请查看与您的 MySQL 服务器版本对应的手册,了解在第 2 行的"(a','d'( WHERE id=9' 附近使用的正确语法

非常感谢您的帮助,也很抱歉重复的问题,但我真的找不到解决方案,非常绝望。

更新:

以下代码给出此错误:

致命错误:

未捕获错误:在第 30 行的/homepages/25/d72758610/htdocs/multimedia/edit.php:30 中的 bool 上调用成员函数 bind_param( 堆栈跟踪:#0 {main} 在第 30 行抛出/homepages/25/d72758610/htdocs/multimedia/edit.php

<html>
<title>
Video Archiv - New
</title>

<body>
<?php
include("connect.php"); 
$id=$_GET['id'];
$title = $_POST["titel"];
$schauspieler = $_POST["schauspieler"];
if(empty($title))
{
echo "error";
}
elseif(empty($schauspieler))
{
echo "error";
}
else
{
$sql = "UPDATE users SET title=?, schauspieler=? WHERE id=?";
$stmt= $connect->prepare($sql);
$stmt->bind_param("ssi", $title, $schauspieler, $id);
if($stmt->execute())
{
echo "Succes";
}
else
{
echo "something went wromg";
}
}
?>
<form action="edit.php" method="post"> 

<label> Titel:</label><br/>
<input type="text" name="titel" required><br/>
<label>Schauspieler</label><br/>
<input type="text" name="schauspieler" required><br/>
<br />
<button type="submit" name="update">Speichern</button>

</form>
<?php
include("back.php");
?>
</body>
</html> 

非常简单,可以避免SQL注入并使用最新的代码,并且您的SQL语法有错误

这是一个例子:

include("connect.php"); 
$id=$_GET['id'];
$title = $_POST["titel"];
$schauspieler = $_POST["schauspieler"];
if(empty($title)){
echo "error";
}elseif(empty($schauspieler)){
echo "error";
}else{
$sql = "UPDATE VideoArchiv SET title=?, schauspieler=? WHERE id=?";
$stmt= $connect->prepare($sql);
$stmt->bind_param("ssi", $title, $schauspieler, $id);
if($stmt->execute()){
echo "Succes";
}else{
echo "something went wromg";
}
}

查看更多 : https://phpdelusions.net/mysqli_examples/update

更新:第一个代码将为您工作,但是如果您仍然想使用程序方式,那么我们将:

include("connect.php");
if ($_SERVER["REQUEST_METHOD"] == "POST") {
//Check if we get id 
$Testid = $_GET['id'];
if(empty($Testid)){
echo "id is empty";
}else{
$id = $_GET['id'];
}

$title = $_POST["titel"];
$schauspieler = $_POST["schauspieler"];
if(empty($title )){
echo "error". $title; 
}elseif(empty($schauspieler)){
echo "error". $schauspieler;
}else{
$sql = "UPDATE VideoArchiv SET title=?, schauspieler=? WHERE id=?";
$stmt = mysqli_prepare($connect, $sql);
mysqli_stmt_bind_param($stmt, 'ssi', $title, $schauspieler, $id);
mysqli_stmt_execute($stmt); 
}
}

<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
	<label> Titel:</label><br/>
	<input type="text" name="titel" required><br/>
	<label>Schauspieler</label><br/>
	<input type="text" name="schauspieler" required><br/>
	<br />
	<button type="submit" name="update">Speichern</button>
</form>

您遇到的问题是您的代码没有正确使用SET,您目前有以下内容;

$sql =  "UPDATE VideoArchiv             
SET ('".$_POST["titel"]."','".$_POST["schauspieler"]."')
WHERE id=$id";

这就像你做一个INSERT

要纠正眼前的问题,只需更改为;

$sql =  "UPDATE VideoArchiv             
SET field1 = '".$_POST["titel"]."',
field2 = '".$_POST["schauspieler"]."'
WHERE id=$id";

但是这个颂歌让你对SQL注入攻击持开放态度,要快速轻松地解决这个问题,像下面这样简单的东西会有所帮助;

$id = mysqli_real_escape_string($connect, $_POST["id"]);
$titel = mysqli_real_escape_string($connect, $_POST["titel"]);
$schauspieler = mysqli_real_escape_string($connect, $_POST["schauspieler"]);
$sql =  "UPDATE VideoArchiv             
SET field1 = '{$titel}',
field2 = '{$schauspieler}'
WHERE id=$id";

我建议阅读准备好的陈述,因为这会更安全

我知道在这篇文章之前,这已经对手头的问题有了正确的答案,但没有提到注入和如何解决(即使是像这里这样的软方法(

可以使用以下查询:

UPDATE VideoArchiv SET columnname1 = '".$_POST["titel"]."', columnname2 = '".$_POST["schauspieler"]."' WHERE id=$id

查询中不给出列名

更新table_name 设置 column_name1 = expr1, column_name2 = expr2, ... [其中 条件];

因此,您的查询将如下所示,并检查数据库中的列名:

$sql =  "UPDATE VideoArchiv             
SET titel='".$_POST["titel"]."',schauspieler='".$_POST["schauspieler"]."'
WHERE id=$id";

注意:这是SQL易受攻击的,所以请添加mysql真实转义函数(https://www.php.net/manual/en/function.mysql-real-escape-string.php(或将其转换为pdo。

最新更新