我开始从 HTML、CSS 和 php 开始学习编码。我创建了一个基本表格来测试我的技能。但是,我被这个困住了。你能帮我吗?
我知道它对 SQL 注入(inject)是开放的,我只是想在编码方面提高自己,并将在现实生活中使用准备好的语句和参数化查询。
<?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...等
最佳答案
您的插入值周围缺少引号,这是固定的 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 为最流行的数据库提供统一的接口(interface)。您可以在这里阅读更多关于 PDO 的信息:http://php.net/manual/en/book.pdo.php
编码人员更喜欢准备好的语句来净化他们的输入。然而,与在 php 中编写更多代码相比,这会导致与 mysql 服务器的额外通信。准备好的语句比普通查询更复杂,因为它们被缓存在 SQL 服务器上并经过预处理等待数据被使用,还有大量的问号使得代码很难阅读,特别是如果你开始在生产中工作并且有大量的问号要填写的列数。在这里您可以阅读有关准备好的语句的更多信息: https://dev.mysql.com/doc/refman/5.7/en/sql-syntax-prepared-statements.html
主要内容:
- 永远、永远、永远不要将未经处理的数据保存到数据库中!!使用
mysqli_real_escape_string
或PDO::quote
或准备好的语句,视情况而定。 - 将准备好的语句用于创建它们的目的,而不仅仅是作为批发 sanitizer 工具,当您必须重复执行相同的查询时使用它们。特别是如果此查询不是插入,在这种情况下我建议您像这样进行批量插入:
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
配置。
关于PHP插入错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49710151/