Подготовленный оператор с% [duplicate]

Я уверен, что путь к классам и путь поиска разделяемой библиотеки имеют мало общего с друг другом. Согласно JNI Book (который, по общему признанию, старый), в Windows, если вы не используете системное свойство java.library.path, DLL должна находиться в текущем рабочем каталоге или в каталоге, указанном в Windows PATH.


Обновление:

Похоже, что Oracle удалил PDF со своего веб-сайта. Я обновил ссылку выше, чтобы указать на экземпляр PDF, который живет в Техасском университете в Арлингтоне.

Кроме того, вы также можете прочитать HTML-версию Oracle спецификации JNI , Это живет в разделе Java 8 веб-сайта Java и, надеюсь, будет некоторое время.


Обновление 2:

По крайней мере, в Java 8 (я не знаю, t проверены более ранние версии), вы можете сделать:

java -XshowSettings:properties -version

, чтобы найти путь поиска совместно используемой библиотеки. Посмотрите на значение свойства java.library.path в этом выходе.

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 22 August 2018 в 14:32
поделиться
  • 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 22 August 2018 в 14:32
поделиться
  • 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
Другие вопросы по тегам:

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