MySQL在INT字段上的松散比较

时间:2013-08-21 09:51:28

标签: php mysql

我最近在MySQL中看到了一些我觉得很奇怪的东西,但是,我不确定它是MySQL这样做还是PHP。

基本上我使用PDO库进行此查询:

SELECT * FROM users WHERE id=:id OR email=:id

xxx@gmail.com的绑定参数用作:id。它能够找到emailNULLid0的记录。经过一番调查后,我发现这是因为有一些失败的投射,这意味着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;

2 个答案:

答案 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))
);