我在这里读到了一个类似的问题,但我不知道如何使它与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';这没有任何回报,而且我似乎无法在互联网上找到任何东西(或者至少我不能正确表达我的问题)来找出它们为什么不一样,以及如何使它们保持不变。
以下是如何设置这两个字段:
table1
num -> VARCHAR ->长度/集: 20 ->无符号,不允许空,无零,默认左空白,左空后的所有内容
temp_missing
SKU -> VARCHAR ->长度/集: 50 ->无无符号,不允许无符号,无零零,无默认值,保留空白后的所有内容
我刚才注意到的这两个表之间有一个很大的区别(我没有创建这两个表,我是在以前的程序员之后发现的)。
num是一个关键。SKU什么都不是。
这有什么区别吗??
请告诉我这是否有意义,如果需要更多的信息,如果这个问题我只是找不到--相信我,几个月来我一直在用不同的方法来研究这个问题,我只是这次找不到一个--我真的很抱歉。
谢谢。
作为一个增编,我正在读取的文件是作为一个文本选项卡创建的,该选项卡是从一个被格式化为具有完全文本格式化行和列的excel文件中分隔的。以防万一会有什么不同。
发布于 2017-03-15 23:23:58
造成这种不匹配的原因是您的正则表达式测试了\r,而不是\n。由于您的文件可能有用于表示换行的\r\n序列,因此您将得到以\n开头的字符串。如果您的行中还有与选项卡分隔符相邻的空格,那么这些空格也将出现在您的数据中。
为了解决这个问题,将正则表达式改为:
/\s*[\t\n]\s*/不需要显式地提到\r,因为它将被\s覆盖。明确提到\t和\n仍然是必需的,否则您也会被单个字段中的空格分隔。
或者,您也可以在拆分后删除值周围的空白,使用此映射:
$fileArray = array_map('trim', $fileArray);https://stackoverflow.com/questions/42819819
复制相似问题