MySQL:相同的值不相同

时间:2017-03-15 20:14:44

标签: php mysql

我在这里读到了类似的问题,但我不确定如何使它与MySQL相关。

我已经收到了一个数字文件,我将其插入表中以保存记录。我正在读取文件,连接到我的数据库,并使用PHP查询数据库。这个部门的一切都运转正常,这是我的代码:

$dbh = new PDO("mysql:host=$hostname; dbname=$database", $username, $password);

$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // <== add this line
print "Connected to Database\n\n\n";

$file = "missing.txt";
$fileArray = preg_split("/[\t\r]/", file_get_contents($file));

for ($i = 0; $i < count($fileArray); $i++) {
    if ($i == 0 || $i % 7 == 0) {
        $sql = $dbh->prepare("INSERT INTO temp_missing SET SKU = ?;");

        $sql->bindParam(1, $fileArray[$i]);

        $sql->execute();
        echo $fileArray[$i] . "</br>";
    }
}

现在看来,发送到MySQL的数据很好。第1行包含值03999.我知道这个值存在于我们的另一个表中,因此我将输入一个select命令,根据这个新表中存在的这些数字从一个表中获取特定信息。

SELECT num, name, description FROM table1 WHERE num IN (SELECT SKU FROM temp_missing);

这不会返回任何内容。不是一件事。如果我输入以下内容:

SELECT * FROM temp_missing WHERE SKU = 03999;
SELECT * FROM table1 WHERE num = 03999;
SELECT * FROM table1 WHERE num = '03999';

他们都归还了一些东西。它们都返回一行,其中num或SKU是03999.但是以下内容不返回任何内容:

SELECT * FROM temp_missing WHERE SKU = '03999';

什么都不返回,我似乎无法在互联网上找到任何东西(或者至少我无法正确地说出我的问题)来弄清楚为什么它们不相同,以及如何使它们一样。

以下是这两个字段的设置方式:

表1

num - &gt; VARCHAR - &gt;长度/设定:20 - >没有未签名,不允许空,没有Zerofill,默认留空,留空后的所有内容

temp_missing

SKU - &gt; VARCHAR - &gt;长度/设定:50 - &gt;没有未签名,不允许空,没有Zerofill,没有默认,留空后的所有内容

我刚才注意到的两者之间有一个很大的区别(我没有创建这两个表,我之前的程序员已经找到了)。

num 是一个关键。 SKU 什么都不是。

这会有所不同吗?

请告诉我这是否有意义,如果需要更多信息,如果碰巧有问题,我就无法找到 - 相信我,我一直试图去这几个月有不同的解决方法,我这次也找不到 - 我道歉。

谢谢。

作为附录,我正在读取的文件 - missing.txt-是作为文本标签创建的,该文件标签是从格式化为具有完全文本格式的行的excel文件分隔的列。如果有所作为。

1 个答案:

答案 0 :(得分:1)

不匹配的原因是您的正则表达式测试\r,但不测试\n。由于您的文件可能包含用于表示换行符的\r\n个序列,因此您最终会得到以\n开头的字符串。如果您的行在制表符分隔符旁边也有空格,那么这些也会出现在您的数据中。

要解决此问题,请将正则表达式更改为:

/\s*[\t\n]\s*/

\r不需要明确提及,因为它将由\s涵盖。明确提及\t\n仍然是必需的,否则您也会被单个字段中出现的空格拆分。

或者,您也可以在拆分后删除值周围的空白区域,并使用以下映射:

$fileArray = array_map('trim', $fileArray);