У меня есть следующий код:
function dbPublish($status)
{
global $dbcon, $dbtable;
if(isset($_GET['itemId']))
{
$sqlQuery = 'UPDATE ' . $dbtable . ' SET active = ? WHERE id = ?';
$stmt = $dbcon->prepare($sqlQuery);
$stmt->bind_param('ii', $status, $_GET['itemId']);
$stmt->execute();
$stmt->close();
}
}
Мне нужно к mysql_real_escape_string в этом случае, или я хорошо?
Нет, вам не нужно самостоятельно экранировать значение (т.е. не нужно вызывать mysqli_real_escape_string
), когда вы используете подготовленные операторы: движок БД сделает это сам.
(На самом деле, если бы вы вызывали mysql_real_escape_string
и использовали связанные параметры, ваши строки были бы экранированы дважды - что было бы не очень хорошо: в итоге вы получили бы экранированные символы везде... )
В качестве примечания: ваши значения передаются как целые числа (на что указывает 'ii'
), поэтому вам не нужно вызывать mysql_real_escape_string
, даже если вы не используете подготовленные операторы: как видно из названия, эта функция используется для экранирования... строк.
Для целых чисел я обычно использую intval
, чтобы убедиться, что данные, которые я ввожу в SQL-запросы, действительно являются целыми числами.
(Но, поскольку вы используете подготовленные запросы, вам не нужно делать такую экранировку самостоятельно)
Нет, нельзя. Их сочетание приведет к появлению в ваших данных видимых escape-символов .
function dbPublish($status)
{
global $dbcon, $dbtable;
if(isset($_GET['itemId']))
{
$sqlQuery = 'UPDATE ' . $dbtable . ' SET active = ? WHERE id = ?';
$stmt = $dbcon->prepare($sqlQuery);
$stmt->bind_param('ii', $status, $_GET['itemId']);
$stmt->execute();
$stmt->close();
}
}