Обновление: Если я остановлю предложение WHERE от параметризации второго операнда, чтобы запрос PHP выполнялся так:
SELECT 5c9_dpd_users.id, 5c9_dpd_users.username, 5c9_dpd_users.cms_usergroup_id,
5c9_dpd_usergroups_cms.usergroup_name, 5c9_dpd_users.email FROM 5c9_dpd_users,
5c9_dpd_usergroups_cms WHERE 5c9_dpd_usergroups_cms.id = 5c9_dpd_users.cms_usergroup_id
ORDER BY username asc
верны правильные результаты. Однако, если предложение WHERE параметризовано следующим образом:
WHERE 5c9_dpd_usergroups_cms.id = ? ORDER BY username asc
тогда возвращаются неверные результаты; кажется, что он преобразует параметризованный аргумент в «5» и возвращает результаты с идентификатором 5. Кто-нибудь знает, почему это происходит, или как я могу найти обходной путь? Спасибо.
Исходное сообщение:
Я создал слой абстракции базы данных как часть более широкой системы, которую я пишу. В настоящее время я использую его реализацию MySQL, и возникает очень странная ошибка, когда запрос, сгенерированный приложением, выполняется правильно, если я C + P его в консоли, но выдает неправильные результаты при привязке параметров и т. Д. Через функции PHP.
Во-первых, вот соответствующая часть моей схемы БД:
![DB schema for question](https://i.stack.imgur.com/9Jf2Y.jpg)
Создав некоторый отладочный вывод в моем классе базы данных, я получил следующую информацию о запросе, который он производит и выполняет (с stmt::execute
).
SELECT 5c9_dpd_users.id, 5c9_dpd_users.username, 5c9_dpd_users.cms_usergroup_id,
5c9_dpd_usergroups_cms.usergroup_name, 5c9_dpd_users.email FROM 5c9_dpd_users,
5c9_dpd_usergroups_cms WHERE 5c9_dpd_usergroups_cms.id = ? ORDER BY username asc
Array
(
[0] => i
[1] => 5c9_dpd_users.cms_usergroup_id
)
Выше показан сгенерированный запрос, напечатанный на странице отладки, за которым следует значение (и тип) параметра placeholdered. Помещение имени таблицы / столбца в запрос и запуск его в консоли дает мне следующий правильный вывод:
![///](https://i.stack.imgur.com/pzkaw.jpg)
Как вы можете видеть, имя_группы пользователей отличается для каждого идентификатора_группы пользователей. Однако следующий код не работает:
// I have executed the statement and bound the result up to this point.
self::$stmt->bind_result($test1, $test2, $test3, $test4, $test5);
while (self::$stmt->fetch()) {
echo "ID: $test1<br>Username: $test2 <br>Usergroup ID: $test3 Usergroup Name: $test4 <br> Email: $test5<br><br>";
}
Приведенный выше код несколько упрощен, но он также иллюстрирует проблему. Если вы изучите приведенный ниже код из приведенного выше кода, то увидите, что имя группы пользователей остается идентичным, несмотря на различный идентификатор группы пользователей.
ID: 7
Username: ADD
Usergroup ID: 1 Usergroup Name: se
Email: test@test.com
ID: 1
Username: New User
Usergroup ID: 2 Usergroup Name: se
Email: test@test.com
ID: 4
Username: test user
Usergroup ID: 1 Usergroup Name: se
Email: test@test.com
ID: 2
Username: User2
Usergroup ID: 5 Usergroup Name: se
Email: p@b.com
ID: 6
Username: username here
Usergroup ID: 1 Usergroup Name: se
Email: test@test.com
ID: 5
Username: xyz
Usergroup ID: 3 Usergroup Name: se
Email: pete@pete.com
Я в полном недоумении! Сначала я подумал, что это проблема с моим классом абстракции базы данных, но я больше не уверен в этом, поскольку я по существу удалил всю абстракцию и все еще получаю проблему. Я не уверен, какую другую информацию предоставить, но если вы хотите получить более подробную информацию о чем-либо, я с удовольствием предоставлю их.