Готовая выписка дает разные результаты для запроса в клиенте - PullRequest
0 голосов
/ 06 августа 2011

Обновление: Если я остановлю предложение 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

Создав некоторый отладочный вывод в моем классе базы данных, я получил следующую информацию о запросе, который он производит и выполняет (с 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. Помещение имени таблицы / столбца в запрос и запуск его в консоли дает мне следующий правильный вывод:

///

Как вы можете видеть, имя_группы пользователей отличается для каждого идентификатора_группы пользователей. Однако следующий код не работает:

// 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

Я в полном недоумении! Сначала я подумал, что это проблема с моим классом абстракции базы данных, но я больше не уверен в этом, поскольку я по существу удалил всю абстракцию и все еще получаю проблему. Я не уверен, какую другую информацию предоставить, но если вы хотите получить более подробную информацию о чем-либо, я с удовольствием предоставлю их.

1 Ответ

0 голосов
/ 06 августа 2011

В вашем запросе есть проблема:

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

Вы никогда не присоединяетесь к своим таблицам по некоторым идентификаторам, вы должны сделать что-то вроде этого

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 users
LEFT JOIN 5c9_dpd_usergroups_cms cms ON cms.id = users.cms_usergroup_id
WHERE 5c9_dpd_usergroups_cms.id = ? ORDER BY username asc

Вы должны присоединиться к своей группетаблицу и пользовательскую таблицу см .: http://en.wikipedia.org/wiki/Join_%28SQL%29

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