我在这里读到了类似的问题,但我不确定如何使它与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文件分隔的列。如果有所作为。
答案 0 :(得分:1)
不匹配的原因是您的正则表达式测试\r
,但不测试\n
。由于您的文件可能包含用于表示换行符的\r\n
个序列,因此您最终会得到以\n
开头的字符串。如果您的行在制表符分隔符旁边也有空格,那么这些也会出现在您的数据中。
要解决此问题,请将正则表达式更改为:
/\s*[\t\n]\s*/
\r
不需要明确提及,因为它将由\s
涵盖。明确提及\t
和\n
仍然是必需的,否则您也会被单个字段中出现的空格拆分。
或者,您也可以在拆分后删除值周围的空白区域,并使用以下映射:
$fileArray = array_map('trim', $fileArray);