$query = "INSERT INTO myCity (Name, CountryCode, Distrit) VALUES (?,?,?)";
$stmt = $mysqli->prepare($query);
$stmt->bind_param("sss", $val1, $val2, $val3);
$val1 = 'Stuttgart';
$val2 = 'DEU';
$val3 = 'Baden-Wuerttemberg';
$stnt->execute();
这是PHP使用预编译语句的一个例子,在这个例子中,先预编译SQL语句,将变量用?表示。当用户输入参数时,通过bindParam()函数绑定,将输入当做整体传给预编译SQL语句来执行,不会出现执行拼接字符的情况,避免了SQL注入攻击。
prepareStatement= connection.prepareStatement("INSERT INTO tb1_students (name,age,sex,address) VALUES (?,?,?,?)");
prepareStatement.setString(1,var1);
prepareStatement.setString(2,var2);
prepareStatement.setString(3,var3);
prepareStatement.setString(4,var4);
prepareStatement.executeUpdate();
这是Java中的预编译语句,原理跟PHP中的一样。
使用预编译语句的优点不仅仅是防御SQL注入攻击,其优点还有:
(1)提高执行效率
预编译对象就是把一些格式固定的SQL编译后,存放在缓冲区中,当我们再次执行相同的SQL语句时就不需要预编译的过程了。
(2)提高代码可读性和可维护性
使用?代替参数,将输入参数与SQL语句分开,方便扩展。