У меня есть следующее function
function searchusers($username){
$result=$this->conn->prepare("SELECT username,
profilimg,
(SELECT COUNT(title) FROM animelist WHERE mystatus='Watching' AND addedby LIKE CONCAT('%','?','%')) AS watching,
(SELECT COUNT(title) FROM animelist WHERE mystatus='Completed' AND addedby LIKE CONCAT('%','?','%')) AS completed,
(SELECT COUNT(title) FROM animelist WHERE mystatus='On-hold' AND addedby LIKE CONCAT('%','?','%')) AS onhold,
(SELECT COUNT(title) FROM animelist WHERE mystatus='Dropped' AND addedby LIKE CONCAT('%','?','%')) AS dropped,
(SELECT COUNT(title) FROM animelist WHERE mystatus='Plan to watch' AND addedby LIKE CONCAT('%','?','%')) AS plantowatch,
(SELECT COUNT(title) FROM animelist WHERE addedby LIKE CONCAT('%','?','%')) AS all,
(SELECT COUNT(title) FROM animelist WHERE addedby LIKE CONCAT('%','?','%') AND favourite='1') AS favourites,
(SELECT COUNT(subject) FROM comments WHERE name LIKE CONCAT('%','?','%')) AS allcomments,
(SELECT COUNT(review) FROM reviews WHERE addedby LIKE CONCAT('%','?','%')) AS allreviews,
(SELECT AVG(myscore) FROM animelist WHERE addedby LIKE CONCAT('%','?','%')) AS meanscore
FROM user WHERE username LIKE CONCAT('%','?','%') LIMIT 120");
$result->bindparam(1,$username);
$result->bindparam(2,$username);
$result->bindparam(3,$username);
$result->bindparam(4,$username);
$result->bindparam(5,$username);
$result->bindparam(6,$username);
$result->bindparam(7,$username);
$result->bindparam(8,$username);
$result->bindparam(9,$username);
$result->bindparam(10,$username);
$result->bindparam(11,$username);
$result->execute();
return $result->fetchall();
}
Как видите, я привязываю одно и то же значение к 11 параметрам, но делаю это, повторяя $result->bindparam(1,$username); 11 раз, что выглядит довольно ужасно.
Я спрашиваю, есть ли лучшее решение для привязки одного значения ко всем параметрам вместо многократного повторения bindparam?
Вероятно, я мог бы решить эту проблему проще с именованными заполнителями вместо вопросительных знаков, но это не то решение, которое я ищу сейчас.
Я думаю, что есть способ решить эту проблему с помощью for/foreach, но я не знаю, как это должно выглядеть.






for($i=0; $i<11; $i++){
$result->bindparam($i,$username);
}
return $result->fetchall();
Поскольку вы знаете, что существует 11 параметров привязки, вы можете просто использовать счетчик.
В то время как другой ответ технически правильный и то, о чем вы просите; в контексте вашего вопроса и предоставленного кода это не лучшее решение, так как обычно не рекомендуется использовать цикл для привязки параметров.
Вместо этого я бы рекомендовал вам просто использовать один и тот же параметр и привязать его один раз (или изменить свой вопрос).
Для этого используйте именованные параметры: вместо ? используйте :parameterName
Тогда bindparam('parameterName', $yourVariable). (см. официальный документы).
Возможно, вы могли бы расширить свой вопрос, чтобы сделать вариант использования более понятным. До тех пор именованные параметры являются лучшим решением.
Он работал бы только если включен режим эмуляции, но в настоящее время он в основном отключен.