我正在制作一个小项目,但在使用 php 脚本时遇到了一些问题。基本上,当他们输入文本然后单击“Enter”时,它会加载到“insert.php”。问题是,如果他们只访问 insert.php 页面而不进入主页,它会进入一个计划表,这可能会导致大问题。
代码:
$con=mysqli_connect("localhost","info","info","info");
// Check connection
if (mysqli_connect_errno())
{
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
$sql="INSERT INTO Persons (FirstName, LastName, Age)
VALUES
('$_POST[firstname]','$_POST[lastname]','$_POST[age]')";
if (!mysqli_query($con,$sql))
{
die('Error: ' . mysqli_error($con));
}
echo "1 record added";
mysqli_close($con);
你能帮我解决这个问题吗,因为它可能会引起很多麻烦。
最佳答案
首先,您需要使用 isset() 验证 $_POST 变量。 如果不是从表单提交,$_POST 将为空。这意味着当用户尝试输入 URL 时,不会有任何发布数据,并且您的 SQL 查询也不会运行。
第二,由于您没有转义内容,因此您会受到 SQL 注入(inject)的影响。 我建议使用准备好的语句或 mysqli_real_escape_string 转义每个变量(安全性较低,但总比没有好)。`
if ( isset($_POST) && !empty($_POST['firstname']) && !empty($_POST['lastname']) && !empty($_POST['age'])) {
$con=mysqli_connect("localhost","info","info","info");
// Check connection
if (mysqli_connect_errno())
{
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
//simple example of escaping variables - BUT NOT AS SECURE AS PREPARED STATEMENT!!
$firstname = $con->real_escape_string($_POST['firstname']);
$lastname = $con->real_escape_string($_POST['lastname']);
$age = $con->real_escape_string($_POST['age']);
//With MySQLi it is best practice to use `prepere`, `bind_param` and `execute:
//or use PDO.
$sql="INSERT INTO Persons (FirstName, LastName, Age)
VALUES
('$firstname','$lastname','$age')";
if (!mysqli_query($con,$sql))
{
die('Error: ' . mysqli_error($con));
}
echo "1 record added";
mysqli_close($con);
}
最后,您缺少 $_POST 变量中的单引号。
希望这有帮助!
关于php - 如何修复 php 添加普通行的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21344618/