Еще один подход к возврату значения из асинхронной функции - передать объект, который сохранит результат от асинхронной функции.
Вот пример того же:
var async = require("async");
// This wires up result back to the caller
var result = {};
var asyncTasks = [];
asyncTasks.push(function(_callback){
// some asynchronous operation
$.ajax({
url: '...',
success: function(response) {
result.response = response;
_callback();
}
});
});
async.parallel(asyncTasks, function(){
// result is available after performing asynchronous operation
console.log(result)
console.log('Done');
});
Я использую объект result
для хранения значения во время асинхронной операции. Это позволяет получить результат даже после асинхронного задания.
Я использую этот подход много. Мне было бы интересно узнать, насколько хорошо этот подход работает, когда задействован результат обратно через последовательные модули.
Вот как вы правильно извлекаете результат
$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
, но это делает для немного более длинных запросов.