我最近在 MySQL 中看到一些我认为很奇怪的东西,但是,我不确定是 MySQL 还是 PHP 这样做。
基本上我有这个使用 PDO 库的查询:
SELECT * FROM users WHERE id=:id OR email=:id
使用xxx@gmail.com
的绑定(bind)参数作为: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;
最佳答案
只需运行 SELECT 'string' = 0;
即可回答您的问题。
(进一步引用:它返回 1
)
关于php - MySQL 对 INT 字段进行松散比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18354224/