这是我在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。