1

我最近在 MySQL 中看到了一些我认为很奇怪的东西,但是,我不确定是 MySQL 还是 PHP。

基本上我有这个使用 PDO 库的查询:

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

使用xxx@gmail.comas的绑定参数:id。它能够找到 where emailisNULLidis的记录0。经过一番调查,我发现这是因为进行了一些丢失的转换,这意味着xxx@gmail.com被转换为0(如在 PHP 中)以与id. idINT是。

这是 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;
4

2 回答 2

2

只需运行SELECT 'string' = 0;,这应该可以回答您的问题。

(供进一步参考:它返回1

于 2013-08-21T10:42:45.080 回答
0

好的试试这个。请注意(字符串)转换,如果这有效,PDO 正在使用一些类型检查并在函数 bindValue 中重新转换

$result = database::getInstance()->query("
    SELECT * FROM users WHERE partner_id = :id OR email = :id LIMIT 1",
    array(':id'=>((string)$id))
);
于 2013-08-21T12:34:46.283 回答