准备好的声明给客户端查询提供不同的结果

时间:2011-08-05 22:03:01

标签: php mysql mysqli prepared-statement abstraction

更新:如果我停止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'并返回ID为5的结果。是否有人知道为什么会发生这种情况,或者我如何找到解决方法?谢谢。

原帖:

我创建了一个数据库抽象层,作为我正在编写的更广泛系统的一部分。我目前正在使用它的MySQL实现,并且发生了一个非常奇怪的错误:如果我在控制台中使用C + P它,那么应用程序生成的查询会正确运行,但是当参数绑定等时,通过PHP函数会产生不正确的结果。 / p>

首先,这是我的数据库架构的相关部分:

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参数的值(和类型)。将表/列名称放入查询并在控制台中运行它会给出以下正确的输出:

///

正如您所看到的,每个usergroup_id的usergroup_name都不同。但是,以下代码不起作用:

// 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不同,用户组名称仍然相同。

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 :(得分:0)

您的查询存在问题:

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