我开始学习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();
}
?>
每次我使用表单时都会遇到此错误。
ErrorINSERT INTO ......等等。
答案 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_string
或PDO::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;