PHP插入错误

时间:2018-04-07 17:39:15

标签: php mysql

我开始学习HTML,CSS和php的编码开始。我创建了一个基本表单来测试我的技能。但是,我对此感到困惑。你能帮帮我吗?

我知道SQL注入是开放的,我只是想在编码方面提高自己,并且会在现实生活中使用预处理语句和参数化查询。

<?php

if ($_SERVER["REQUEST_METHOD"] == "POST") {

    $mysql_host = "";
    $mysql_username = "";
    $mysql_password = "";
    $mysql_database = "";

    $conn = new mysqli ($mysql_host, $mysql_username, $mysql_password, $mysql_database);

    $c_name = $_POST["club_name"]; 
    $c_league = $_POST["league"];
    $c_rank = $_POST["ranking"];
    $c_prank = $_POST["previous_rank"];

    $sql = "INSERT INTO `club_data` (`club_name`, `league`, `ranking`, `previous_rank`)
    VALUES ('$c_name', '$c_league, $c_rank, $c_prank);";
    mysqli_query($conn, $sql); 

    if ($conn->query($sql) === TRUE) {
        echo "kayit islendi";
    }
    else {
        echo "Error". $sql ."<br>". $conn->error;
    }
    $conn->close();
}
?>

List Names

每次我使用表单时都会遇到此错误。

ErrorINSERT INTO ......等等。

2 个答案:

答案 0 :(得分:3)

您的插入值周围缺少引号,这里是固定的sql:

$sql = "INSERT INTO `club_data` (`club_name`, `league`, `ranking`, `previous_rank`)
VALUES ('$c_name', '$c_league', '$c_rank', '$c_prank');"

你错过了每个值的引号!

但是,这是一种在生产中进行数据库查询的不明智的方法。使用mysqli_real_escape_string来清理字符串(每个变量都需要这种处理)或使用预处理语句。

或者,您应始终使用数据库的方式是通过PDO包装器。在这种情况下,您将使用:PDO::quote。 PDO为最流行的数据库提供统一的界面。在这里,您可以阅读有关PDO的更多信息:http://php.net/manual/en/book.pdo.php

编码员更喜欢准备好的陈述来清理他们的输入。然而,这会引发与mysql服务器的额外通信,而不是在php中编写更多代码。准备好的语句比普通查询更复杂,因为它们被缓存在SQL服务器上并进行预处理,等待使用数据,还有一个问号镜像使得代码非常难以阅读,特别是如果你开始在生产中工作并拥有一个miriad列填充。在这里,您可以阅读有关预准备语句的更多信 https://dev.mysql.com/doc/refman/5.7/en/sql-syntax-prepared-statements.html

主要内容:

  • 从不,永远,永远将未经过抽样的数据保存到数据库中!!根据具体情况,使用mysqli_real_escape_stringPDO::quote或准备好的语句。
  • 使用预备语句创建它们的内容,而不仅仅是批量清理工具,在必须重复执行相同查询时使用它们。特别是如果这个查询不是插入,在这种情况下我建议你像这样进行大量插入:INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);在这里阅读更多:https://dev.mysql.com/doc/refman/5.7/en/insert.html这有一个警告,即插入值的sql的最大大小应该永远不要大于max_allowed_packet config。

答案 1 :(得分:2)

您应该使用准备好的陈述。它不仅可以防止SQL注入攻击,还可以避免您目前面临的令人讨厌的引用问题

$sql = "INSERT INTO `club_data` (`club_name`, `league`, `ranking`, `previous_rank`)
VALUES (?, ?, ?, ?);";

$result = $conn->prepare($sql);
$result->bind_param('ssss', $c_name, $c_league, $c_rank, $c_prank);
echo $result->execute() === true ? 'kayit islendi' : 'Error'.$conn->error;