MySQL mysql_real_escape_string [дубликат]

Исходные типы прекрасны, когда они выражают то, что вы хотите выразить.

Например, функция десериализации может возвращать List, но она не знает тип элемента списка. Таким образом, List является подходящим типом возврата.

32
задан MPelletier 7 December 2013 в 03:04
поделиться

2 ответа

Вот как вы правильно извлекаете результат

$param = "%{$_POST['user']}%";
$stmt = $db->prepare("SELECT id,Username FROM users WHERE Username LIKE ?");
$stmt->bind_param("s", $param);
$stmt->execute();
$stmt->bind_result($id,$username);

while ($stmt->fetch()) {
  echo "Id: {$id}, Username: {$username}";
}

, или вы также можете сделать:

$param = "%{$_POST['user']}%";
$stmt = $db->prepare("SELECT id,Username FROM users WHERE Username LIKE ?");
$stmt->bind_param("s", $param);
$stmt->execute();

$result = $stmt->get_result();
while ($row = $result->fetch_array(MYSQLI_NUM)) {
  foreach ($row as $r) {
    print "$r ";
  }
  print "\n";
}

Надеюсь, вы поняли, что я получил ответ непосредственно из руководства здесь и здесь , где вы должны были пойти первым.

51
ответ дан Jeff Puckett 21 August 2018 в 03:16
поделиться
  • 1
    В защиту ОП ни одна страница руководства не упоминает о функции LIKE «сравнение». – Brad Kent 22 August 2017 в 00:12

Обновлено

Из комментариев обнаружено, что подстановочные символы LIKE (_ и %) по умолчанию не выполняются по параметризованным запросам и поэтому могут вызвать неожиданные результаты.

Поэтому при использовании операторов «LIKE» используйте это «отрицательный lookahead» Regex для обеспечения того, чтобы эти символы были экранированы:

$param = preg_replace('/(?<!\\\)([%_])/g', '\\\$1',$param);

As альтернатива данному ответу выше, вы также можете использовать функцию MySQL CONCAT :

$stmt = $db->prepare("SELECT id,Username FROM users WHERE Username LIKE CONCAT('%',?,'%') ");
$stmt->bind_param("s", $param);
$stmt->execute();

Это означает, что вам не нужно редактировать значение $param, но это делает для немного более длинных запросов.

23
ответ дан Martin 21 August 2018 в 03:16
поделиться
  • 1
    Привет - это безопасно от SQL-инъекции? Я спрашиваю, потому что у него есть цитаты. благодаря – mike vorisis 16 February 2017 в 00:29
  • 2
    @mikevorisis Да, это безопасно, потому что запрос все еще параметризуется ( с помощью ? ). цитаты из-за того, что MySQL CONCATenate три строки. – Martin 16 February 2017 в 10:52
  • 3
    ok Спасибо @Martin – mike vorisis 16 February 2017 в 10:53
  • 4
    @MikeVorisis, CONCAT в подготовленных операторах являются безопасными от инъекции, но вы должны быть осторожны при использовании предложения LIKE в подготовленных операциях. Рассмотрим это: $stmt=$db->prepare("SELECT customer` as suggestion WHERE customername LIKE CONCAT ('cust_',?, '%'); & Quot;); `, а затем $key='J%'; (или даже $key='';), $stmt->bind_param('s', $key);. Теперь $stmt->execute(); вернет ВСЕ записи . Таким образом, при работе с подготовленными утверждениями, имеющими предложение LIKE, вам все равно нужно обрабатывать _ и % надлежащим образом. Даже если вы используете подготовленные инструкции, требуется ускорение, подобное $key='J\%';. – Jay Dadhania 13 July 2018 в 14:28
  • 5
    @mikevorisis Хотя я думаю, что вы, вероятно, знаете об этом и уже предприняли шаги для правильной обработки таких запросов, я подумал, что важно делиться друг с другом, поскольку это может помочь другим, кто это читает. – Jay Dadhania 13 July 2018 в 14:30
Другие вопросы по тегам:

Похожие вопросы: