MySQLi准备语句的良好实践

时间:2016-10-07 10:19:03

标签: php security mysqli prepared-statement sql-injection

我想看看我的练习是否足以防止sql注入。

$mysqli = new mysqli($host,$username,$password,$database);
$query = $mysqli->prepare('SELECT * FROM users WHERE id = ? AND check = ?');
$query->bind_param('ii', $_GET['id'], $_POST['check']);
$query->execute();

$result = $mysqli->query($query);
while ($row = $result->fetch_assoc()) {
...
}

我已经看到,在某些例子中,在此之前有这条线:

$result = $query->get_result();

其他在$ _GET / $ _ POST中使用trim(),intval()等以确保安全。 哪种方法是避免sql注入的最佳实践和最安全的方法?

1 个答案:

答案 0 :(得分:0)

最佳 MySQLi预备声明练习显然是 PDO准备好的声明

您在上面发布的代码毫无意义。为了使它工作,确实你必须使用get_result()函数,唉! - is not guaranteed to be available

$query = $mysqli->prepare('SELECT * FROM users WHERE id = ? AND check = ?');
$query->bind_param('ii', $_GET['id'], $_POST['check']);
$query->execute();
$result = $query->get_result();
while ($row = $result->fetch_assoc()) {
...
}

使用PDO时,您需要的代码少两倍,始终保证可以正常工作

$query = $pdo->prepare('SELECT * FROM users WHERE id = ? AND check = ?');
$query->execute([$_GET['id'], $_POST['check']]);
while ($row = $query->fetch()) {
...
}

更不用说其他PDO的精彩功能了

  

其他使用trim(),intval()等

的人

这些东西与SQL无关,你可以出于其他原因使用它们。