Экранирование плохих символов все еще необходимо, но библиотека делает это автоматически для всех параметров, которые вы связываете.Это немного более удобно и не позволяет программисту забыть очистить значение.
Однако учтите, что этот автомат ограничен параметрами!
Следующий запрос безопасен, поскольку bind_param()
заботится о экранировании:
$code = $_GET["code"];
$name= $_GET["name"];
$percentage= $_GET["percentage"];
$stmt = $mysqli->prepare("INSERT INTO items VALUES (?, ?, ?)");
$stmt->bind_param('iss', code, $name, $percentage);
$stmt->execute();
следующий запрос небезопасен , потому что все, что вы поместите непосредственно в запрос, не будет автоматически экранировано :
$tablename = $_GET["prefix"]."_items";
$code = $_GET["code"];
$name= $_GET["name"];
$percentage= $_GET["percentage"];
---- UNSAFE! ----
$stmt = $mysqli->prepare("INSERT INTO `$tablename` VALUES (?, ?, ?)");
$stmt->bind_param('iss', $code, $name, $percentage);
$stmt->execute();
сказал, что не следует использовать имена динамических таблиц, как показано в этом примере в любом случае.Но точка зрения такова: Будьте осторожны, даже с параметризованными запросами!
Единственный недостаток, о котором я могу подумать, это то, что вы больше не видите окончательный запрос для отладки (потому что он получаетсобран только на стороне сервера).