PHP和SQL带来了不同的结果

时间:2014-02-03 17:33:35

标签: php mysql sql csv

我正在尝试从CSV文件中读取项目列表,将其与数据库中的项目进行比较,然后生成一个不在我基础中的项目。从具有一千个结果的CSV中,只有26个不在db中。但是,我的新CSV中的第一项存在于我的数据库中,这意味着它是误报。只有第一个项目是错误的,其他所有项目都没问题(我已经查询了所有项目)。

这是我的代码:

<?php 
   function generate_diff_csv() {

   $conn = new mysqli("localhost","rcpp","*********", "items");      
   $key_ref = fopen("INV14.csv", "r");
   $not_in = fopen("not_in.csv","w");

   [...]

    fclose($key_ref);


    $keys = array();    
    foreach ($custom1 as $custom) {
        $trimmed_custom = trim($custom);
        $result = $conn->query("SELECT custom1 FROM products WHERE custom1 = '{$trimmed_custom}'");

        if($result->num_rows == 0) {
            $keys[] = array("key" => $trimmed_custom); 
            echo "adicionado ao csv... \n";
        }
    }



    foreach($keys as $key) {           
        fputcsv($not_in, $key);
    }

    fclose($not_in);
    $conn->close();

}

generate_diff_csv();

为了确保我的一切正常,我创建了一个临时表,其中包含我需要比较的数据。当我用SQL查询它时,我得到了25个结果。将它们(PHP x SQL)并排放在一个文件中,只有第一个不匹配,这意味着它确实是唯一错误的结果。

SELECT ref FROM refs WHERE ref NOT IN (SELECT custom1 FROM products);

为什么?为什么PHP会在我的查询中返回第一个键?

PHP正在从命令行PHP 5.4.12(Windows)执行。我没有在Linux生产环境中进行过测试,但我不认为这是一个特定于平台的问题。

提前谢谢。

2 个答案:

答案 0 :(得分:0)

首先,根据数据库,表和字段中的排序规则,SQL可能会忽略字母大小写,因此对于SQL,“something”与“SoMEthIng”相同。此外,由于我使用SQL CHAR()值类型的练习,我注意到后缀空格在比较时也被忽略,至少在CHAR()方面是这样。

答案 1 :(得分:0)

我已经解决了这个问题。这是一个平台问题,但与PHP无关(我认为)。

我通过cmd运行脚本,而不是Powershell,第一项是在第一个字符上获得额外的UTF BOM表头。我的错是不注意第一个输出,认为它只是cmd pritting一些垃圾字符。但是当我使用var_dump($ custom1)时,我可以看到这些字符被放入变量中并且trim没有清理它。

解决方案是从CSV输入文件中删除BOM。

链接参考(针对BOM字符问题):https://superuser.com/questions/601282/is-not-recognized-as-an-internal-or-external-command ---第一个答案解释了为什么'cmd'输出这些字符。