我最近在 MySQL 中看到了一些我认为很奇怪的东西,但是,我不确定是 MySQL 还是 PHP。
基本上我有这个使用 PDO 库的查询:
SELECT * FROM users WHERE id=:id OR email=:id
使用xxx@gmail.com
as的绑定参数:id
。它能够找到 where email
isNULL
和id
is的记录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;