我最近在MySQL中看到了一些我觉得很奇怪的东西,但是,我不确定它是MySQL这样做还是PHP。
基本上我使用PDO库进行此查询:
SELECT * FROM users WHERE id=:id OR email=:id
将xxx@gmail.com
的绑定参数用作:id
。它能够找到email
为NULL
且id
为0
的记录。经过一番调查后,我发现这是因为有一些失败的投射,这意味着xxx@gmail.com
被投射为0
(如在PHP中)与id
进行比较。 id
字段为INT
。
这是MySQL还是PHP?有没有办法停止使用PHP PDO驱动程序在MySQL中进行松散的转换和比较?
如果重要的是我的桌子是MyISAM。
使用的确切代码是:
$result = database::getInstance()->query("
SELECT * FROM users WHERE partner_id = :id OR email = :id LIMIT 1",
array(':id'=>$id)
);
其中database
是一个将查询路由到PDO库的单例实例。除了为我运行之外,它不会对查询进行任何更改。我知道这部分是有效的,因为它是经过单元测试的,它适用于应用程序中的每个其他查询,这是唯一出现故障的查询。
查询函数中的代码:
if($params===array()){
$command=$this->_connection->prepare($sql);
}else{
$paramCount=0;
// Then arguments have been supplied
foreach($params as $field => $param){
if(is_array($param)){
$values = $params[$field];
unset($params[$field]);
$fparams=array();
foreach($values as $value){
$fparams[]=$this->paramPrefix.$paramCount;
$params[$this->paramPrefix.$paramCount++]=$value;
}
$sql=str_replace($field,'('.implode(', ',$fparams).')',$sql);
}
}
$command=$this->_connection->prepare($sql);
}
$command->setFetchMode(PDO::FETCH_ASSOC);
foreach($params as $field=>$param)
$command->bindValue($field,$param);
$command->execute();
return $command;
答案 0 :(得分:2)
只需运行SELECT 'string' = 0;
即可回答您的问题。
(如需进一步参考:它返回1
)
答案 1 :(得分:0)
好的尝试一下。注意(字符串)强制转换如果有效,PDO正在使用某种类型检查并在函数bindValue中重铸
$result = database::getInstance()->query("
SELECT * FROM users WHERE partner_id = :id OR email = :id LIMIT 1",
array(':id'=>((string)$id))
);