【发布时间】:2017-03-15 20:14:44
【问题描述】:
我在这里阅读了一个类似的问题,但我不确定如何使它与 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 -> 没有无符号,不允许 Null,没有 Zerofill,默认留空,之后的所有内容都留空
temp_missing
SKU -> VARCHAR -> 长度/设置:50 -> 没有无符号,不允许 Null,没有 Zerofill,没有默认值,后面的所有内容都留空
我刚刚注意到的两个表之间有一个很大的区别(我没有创建这两个表,我在以前的程序员之后有所了解)。
num 是一个 KEY。 SKU 什么都不是。
这有什么不同吗??
请让我知道这是否有意义以及是否需要更多信息,如果碰巧有一个我找不到的问题 - 相信我,几个月来我一直在努力解决这个问题有不同的解决方法,但这次我找不到——我很抱歉。
谢谢。
作为附录,我正在读取的文件 -missing.txt- 是作为一个文本选项卡创建的,它与一个格式化为具有完全文本格式的行和列的 excel 文件分隔开来。以防万一。
【问题讨论】:
-
03999.... PHP 中的前导零表示八进制数,但由于9s 是无效的八进制数,因此将转换为03或十进制3。 ...这肯定会导致问题 -
前导零不是问题,只要它被视为字符串 - 即
'03999'而不是03999。无论如何,数据库中的列是 varchar,所以这是一个字符串。 -
难道
select * from temp_missing返回的值没有预先添加“0”,所以“3999”而不是“03999”?尝试使用bindValue而不是bindParam,并使用第三个参数:$sql->bindValue(1, $fileArray[$i], PDO::PARAM_STR);。还要确保在任何时候都不要对$fileArray进行任何可能导致其值转换为数字而不是字符串的事情。 -
在循环之前执行
var_dump($fileArray),查看数组元素的数据类型。如果它不是字符串,那么就是你的问题。preg_split返回一个字符串数组,但也许您还有其他代码在该数组上工作?另外,您能确认select * from temp_missing返回的内容吗?报告的 SKU 值中是否有预填充的零? -
改用这个正则表达式:
/\s*[\t\n]\s*/:它将删除空格。请注意,您的字符串中有\n,因为您用\r分割,但换行符中最常见的是\n,即使您有一个带有\r的编码。