Исходные типы прекрасны, когда они выражают то, что вы хотите выразить.
Например, функция десериализации может возвращать List
, но она не знает тип элемента списка. Таким образом, List
является подходящим типом возврата.
Вот как вы правильно извлекаете результат
$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";
}
Надеюсь, вы поняли, что я получил ответ непосредственно из руководства здесь и здесь , где вы должны были пойти первым.
Из комментариев обнаружено, что подстановочные символы 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
, но это делает для немного более длинных запросов.
?
i>). цитаты из-за того, что MySQL CONCATenate три строки.
– Martin
16 February 2017 в 10:52
CONCAT
в подготовленных операторах являются безопасными i> от инъекции, но вы должны быть осторожны при использовании предложения LIKE
в подготовленных операциях. Рассмотрим это: $stmt=$db->prepare("SELECT
customer` as suggestion
WHERE customername
LIKE CONCAT ('cust_',?, '%'); & Quot;); `, а затем $key='J%';
(или даже $key='';
), $stmt->bind_param('s', $key);
. Теперь $stmt->execute();
вернет ВСЕ записи i>. Таким образом, при работе с подготовленными утверждениями, имеющими предложение LIKE, вам все равно нужно обрабатывать _
и %
надлежащим образом. Даже если вы используете подготовленные инструкции, требуется ускорение, подобное $key='J\%';
.
– Jay Dadhania
13 July 2018 в 14:28