Как я могу привязать одно значение ко всем параметрам просто в PHP PDO? - PullRequest
4 голосов
/ 16 мая 2019

Итак, у меня есть следующее 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, но я не знаю, как это должно выглядеть.

Спасибо за помощь!

Ответы [ 2 ]

2 голосов
/ 16 мая 2019

В то время как другой ответ технически верен и то, что вы просите;в контексте вашего вопроса и предоставленного кода это не лучшее решение, так как обычно не рекомендуется использовать цикл для привязки параметров.

Вместо этого я бы рекомендовал вам просто использовать тот же параметр ипривязать его один раз (или изменить свой вопрос).

Для этого используйте именованные параметры: вместо ? используйте :parameterName

Затем bindparam('parameterName', $yourVariable).(см. официальные документы ).

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

2 голосов
/ 16 мая 2019
for($i=0; $i<11; $i++){
    $result->bindparam($i,$username);
}
return $result->fetchall();

Поскольку вы знаете, что существует 11 параметров связывания, вы можете просто использовать счетчик.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...