【问题标题】:PHP and SQL brings different resultsPHP和SQL带来不同的结果
【发布时间】:2014-02-03 17:33:34
【问题描述】:

我正在尝试从 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 生产环境上测试过,但我不相信这会是一个特定于平台的问题。

提前谢谢你。

【问题讨论】:

  • 首先,你使用fputcsv($not_in... 然后fclose($not_inlist) 很奇怪——这是故意的,你没有关闭文件$not_in,或者这是一个错字?
  • 失败的名称是什么 - 例如,它可能被 trim 破坏。在这种情况下,它不会出现,因为$trimmed_custom 不存在,尽管$custom 存在。
  • zebediah49,这是在发布前编辑代码时出现的拼写错误。我已经纠正了。谢谢你。并且 $trimmed_custom 不存在,即使它正在接收修剪后的 $custom ($trimmed_custom = trim($custom); )?键都是用点分隔的数字(即:01.04.0632)。

标签: php mysql sql csv


【解决方案1】:

嗯,首先,根据数据库、表和字段中的排序规则,SQL 可能会忽略字母大小写,因此对于 SQL,“something”与“SoMEthIng”相同。此外,自从我对 SQL CHAR() 值类型的实践以来,我注意到后缀空格相比之下也被忽略了,至少在 CHAR() 方面是这样。

【讨论】:

  • 这不是字母大小写的问题,因为这些键上没有任何字母,只有数字和点。查看我的答案以了解我是如何解决的。
【解决方案2】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多