Php 如何在下面的代码中避免SQL注入?

Php 如何在下面的代码中避免SQL注入?,php,mysql,mysqli,sql-injection,Php,Mysql,Mysqli,Sql Injection,我一直在思考如何避免对代码的SQL注入攻击 这就是我现在拥有的 <?php session_start(); $email = $_POST['e-mail']; $fn = $_POST['firstname']; $ln = $_POST['lastname']; $cp = $_POST['cellphone']; $phn = $_POST['phone_number']; $comp = $_POST['company']; $prov = $_POST['province'];

我一直在思考如何避免对代码的SQL注入攻击

这就是我现在拥有的

<?php
session_start();
$email = $_POST['e-mail'];
$fn = $_POST['firstname'];
$ln = $_POST['lastname'];
$cp = $_POST['cellphone'];
$phn = $_POST['phone_number'];
$comp = $_POST['company'];
$prov = $_POST['province'];
$brgy = $_POST['barangay'];
$fadd = $_POST['address'];
$sadd = $_POST['address2'];

$conn = mysqli_connect('localhost','root','','newcartdb')or die('Could not connect');

foreach($_POST['product'] as $product)
{
    $date = date('Y-m-d H:i:s');
    $order_name = $product['item_name'];
    $order_code = $product['item_code'];
    $order_qty = $product['item_qty'];
    $sub_total = $product['price'];

    $query = "INSERT INTO `newcartdb`.`orders`(`Email`,`Firstname`,`Lastname`,`ContactNum`,`PhoneNum`,`Company`,`Province`,`Barangay`,`FAddress`,`SAddress`,`ProductName`,`ProductCode`,`Qty`,`SubTotal`,`datetime`) VALUES('$email','$fn','$ln','$cp','$phn','$comp','$prov','$brgy','$fadd','$sadd','$order_name','$order_code','$order_qty','$sub_total','$date')";
    mysqli_query($conn,$query);
}



mysqli_close($conn);

header('Location: order_confirmation.php');
?>
如何对此进行改进?

正如所建议的,准备好的语句是实现良好的SQL注入保护的最佳方法

缩略示例

您需要添加条目来填充所有要插入的列

$email = $_POST['e-mail'];
$fn = $_POST['firstname'];
$ln = $_POST['lastname'];

if ($stmt = $mysqli->prepare("INSERT INTO `newcartdb`.`orders`(Email,Firstname,Lastname) values(?,?,?)") {
    $stmt->bind_param("sss",  $email, $fn, $ln);
sss-表示每个条目的数据类型,即s-字符串、i-整数

值?,?,?-这是bind_params语句的占位符,因此“?”将按顺序替换为您在bind_params方法中放置的值


你为什么不使用搜索工具自己查找信息?你使用MySQLi,你使用PHP,不难找到PHP-MySQLi-sql注入预防?,?,?。我需要在里面放点什么吗?变量,还是我需要这样键入有准备好的声明吗?是占位符,当执行命令时,它将采用元素i.esss、$email、$fn、$ln;并用bind_params方法中的变量按顺序替换“?”,因此不需要替换它。Ahhh。我得到了它。如果我有7个变量,那么我必须在里面打7个问号,对吗?现在我知道为什么了?让黑客不知道我今天已经学会了!芜湖!!!谢谢您,先生@Stacker-flow.sir!!!我对“sss”很好奇:D是“s”的数量取决于变量的数量?如果变量中只有一个整数,例如$age、$name、$num,那么它应该是'isi',对吗?@Stacker flow?是的,第一部分中的's'数量必须匹配,并且按照您使用的列的顺序排列。例如,名称、年龄、最喜欢的颜色将有..sis、$name、$age、$color;
    $stmt->execute();

    $_SESSION['notice'] = "Table updated";
}

else{
    $_SESSION['notice'] = "Table could not be updated!";
}