更新:--请看下面;我已经删除了所有抽象,创建了一个普通的脚本,但仍然得到了相同的错误。请参阅下面的“另一个更新”以获得更多信息.
原始帖子:I有一个通过数据库抽象层正确形成的查询。查询如下:
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 LEFT JOIN
5c9_dpd_usergroups_cms ON 5c9_dpd_usergroups_cms.id = 5c9_dpd_users.cms_usergroup_id
ORDER BY username asc如果生成相同的查询,但将其作为参数化WHERE子句的第二个操作数的预准备语句运行,则会得到不正确的结果。我确信语句本身是正确的,并且我正在运行MySQLi准备程序。语句按正确的顺序运行。准备好的语句查询如下:
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 LEFT JOIN
5c9_dpd_usergroups_cms ON 5c9_dpd_usergroups_cms.id = ? ORDER BY username asc这个查询似乎将参数化的5c9_dpd_users.cms_usergroup_id转换为'5',因为运行查询将从SELECT子句中检索正确的列,但对所有结果返回相同的usergroup_name --这个用户名与具有5c9_dpd_usergroups_cms.id of 5的结果的用户名匹配。
我是动态绑定参数(call_user_func_array())。在本例中,我告诉它将?参数绑定为i。我认为这可能是出于某种原因将5c9_dpd_users.cms_usergroup_id转换为5,但我尝试了所有其他三种数据类型(s、b和d),但都没有成功。
注意:我多次使用我的数据库抽象层,虽然这是第一个运行join的实例(它是最近才开发的)。重申一下,如果没有参数化,查询将通过PHP返回正确的结果,但是如果通过prepared语句函数给出了一个MySQL,则结果是不正确的,如前所述。
如果有人能帮忙,我会非常感激的。我一整晚都在谷歌上搜索这个问题的帮助,我在任何地方都找不到类似的例子。谢谢。
编辑(提供代码):
$stmt->select_prep(array('users.id', 'users.username', 'users.cms_usergroup_id', 'usergroups_cms.usergroup_name', 'users.email'), array('users'));
$stmt->left_join_prep('usergroups_cms');
$stmt->on_prep('usergroups_cms.id', '=', 'users.cms_usergroup_id', 'i');
$stmt->order($column, $asc_desc);
$stmt->execute_prep();查询现在执行,我所要做的就是调用$stmt->fetch_prep(),这是一个基本上检索结果集的包装方法。此客户端代码生成的查询作为我作为示例给出的第二个参数化查询给出。
我在$stmt->execute_prep()方法中输出了一些调试代码,绑定到查询的参数正确地显示如下:
Array
(
[0] => i
[1] => 5c9_dpd_users.cms_usergroup_id
)这意味着它将一个参数(键1)绑定为int (键0)。我也尝试将它绑定为字符串,double和blob,但没有效果。
另一个更新:
我创建了一个测试脚本来完全删除数据库抽象层,结果是相同的:不返回cms用户名。下面是脚本:
<?php
$mysqli = new mysqli('localhost', 'root', '', 'frame');
$q = "SELECT ac9_dpd_users.id, ac9_dpd_users.username, ac9_dpd_users.cms_usergroup_id,
ac9_dpd_usergroups_cms.usergroup_name, ac9_dpd_users.email
FROM ac9_dpd_users
LEFT JOIN ac9_dpd_usergroups_cms
ON ac9_dpd_usergroups_cms.id = ?
ORDER BY username asc";
$stmt = $mysqli->prepare($q);
$stmt->bind_param('i', $param);
$param = 'ac9_dpd_users.cms_usergroup_id';
$stmt->execute();
$stmt->bind_result($a, $b, $c, $d, $e);
while ($stmt->fetch()) {
echo "id: $a <br>un: $b <br>id: $c <br>cms name: $d <br>email: $e<br><br>";
}
$stmt->close();
unset($mysqli);
?>输出:
id: 7
un: ADD
id: 1
cms name:
email: test@test.com
id: 1
un: New User
id: 2
cms name:
email: test@test.com等
发布于 2011-08-06 10:34:54
也许我只是有点挑剔,但我不会用一个数字来开始一个表/字段名。使用字母或用反勾(`)包围这些奇怪的名称。应该管用的。
编辑(根据您的问题更改)
你编辑的剧本中的某个地方的声音提醒我:
...
ON ac9_dpd_usergroups_cms.id = ?
...
$stmt->bind_param('i', $param);
$param = 'ac9_dpd_users.cms_usergroup_id';正如php手册中所报告的那样,mysqli::准备接受参数进入where子句,并且不允许更改查询的列名。
此外,执行字符串的整数绑定应该在将值插入准备好的查询之前将值转换为数字,并且您的$params应该转换为0。
在执行之后发出一个辛州语句来检查查询的内容:
...
$stmt->execute();
$sqlError = $stmt->sqlstate();
if($sqlError != '00000') die($sqlError);
...一种可能的解决办法:
<?php
$mysqli = new mysqli('localhost', 'root', '', 'frame');
$q = "SELECT ac9_dpd_users.id, ac9_dpd_users.username, ac9_dpd_users.cms_usergroup_id,
ac9_dpd_usergroups_cms.usergroup_name, ac9_dpd_users.email
FROM ac9_dpd_users
LEFT JOIN ac9_dpd_usergroups_cms
ON ac9_dpd_usergroups_cms.id = ac9_dpd_users.cms_usergroup_id
ORDER BY username asc";
$stmt = $mysqli->prepare($q);
$stmt->execute();
$stmt->bind_result($a, $b, $c, $d, $e);
while ($stmt->fetch()) {
echo "id: $a <br>un: $b <br>id: $c <br>cms name: $d <br>email: $e<br><br>";
}
$stmt->close();
unset($mysqli);
?>https://stackoverflow.com/questions/6966156
复制相似问题