PHP UPDATE查询未提交

时间:2018-12-18 13:23:21

标签: php sql database post mysqli

我有一个表单,提交后将更新数据库中的现有信息。但是,一旦提交表单,代码就会引发错误。下面是错误和我正在使用的代码。

  

“错误更新记录:您的SQL语法有错误;请检查与您的MariaDB服务器版本相对应的手册,以在'UPDATE def SET color = blue WHERE id ='26'; UPDATE def附近使用正确的语法设置味精=   嗨,第2行的“ WHER”

<?php
if (!empty($_POST)) {

    $conn = new mysqli($host, $user, $password, $database_name);
    if ($conn->connect_error) {
        die("Connection failed: " . $conn->connect_error);
    }

    $sql = "UPDATE def SET title = $_POST[title] WHERE id = '$_GET[id]';
    UPDATE def SET color = $_POST[color] WHERE id = '$_GET[id]';
    UPDATE def SET msg = $_POST[msg] WHERE id = '$_GET[id]';";

    if ($conn->query($sql) === TRUE) {
        echo "Record updated successfully";
    } else {
        echo "Error updating record: " . $conn->error;
    }
    $conn->close();
}
?>

不知道为什么会这样,因为我多次更改了代码,并在Stackoverflow中进行了搜索,没有结果。

1 个答案:

答案 0 :(得分:2)

您在这里遇到多个问题。

  • 必须包装字符串$_POST['title']$_POST['color']$_POST['msg']用引号或单引号 。从您得到的错误中可以清楚地看出这一点。

    • 现在,您要用引号引起来的唯一一个是$_POST['id'],我假设它是一个数字。那是不需要唯一需要引号的内容。但是,正如我在下面指出的,无论如何,您都不应该这样做。它使您容易受到SQL注入攻击。
  • 您命名的数组索引(titlecolormsg等)应该用单引号引起来: $_POST['title'] ,而不是$_POST[title]

  • 您正尝试通过一次调用$conn->query()来执行多个查询。那不行您将需要调用$conn->multi_query(),但不必这样做,因为那样很难测试,调试和维护。通常,您应该分拆代码,以便一次运行一个查询。

    • 但是,在这种情况下,您首先不需要多个查询。您可以并且应该在一个UPDATE查询中更新匹配行的所有三列。
  • 此外,您对**SQL injection **持开放态度。您需要使用准备好的语句,而不是将变量连接到查询中。仅转义变量是不够的。参见How can I prevent SQL injection in PHP?