Php MySQL:相同的值不相同

Php MySQL:相同的值不相同,php,mysql,Php,Mysql,我在这里读到了一个类似的问题,但我不确定如何使它适用于MySQL 我有一个数字文件,我正在把它插入一个表格中以备记录。我正在读取文件,连接到数据库,并使用PHP查询数据库。该部门一切正常,以下是我的代码: $dbh = new PDO("mysql:host=$hostname; dbname=$database", $username, $password); $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

我在这里读到了一个类似的问题,但我不确定如何使它适用于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>";
    }
}
这不会返回任何内容。没什么。如果我键入以下内容:

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->VARCHAR->Length/Set:20->No unsigned、No Allow Null、No Zerofill、默认为左空白、左空白后的所有内容

临时工失踪

SKU->VARCHAR->Length/Set:50->无未签名、不允许空值、无零填充、无默认值、之后的所有内容留空

这两个表之间有一个很大的区别,我刚刚注意到我并没有创建这两个表,我是在以前的程序员之后学习的

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

这有区别吗

请让我知道这是否有意义,如果需要更多的信息,如果碰巧有一个问题我就是找不到-相信我,我已经尝试了几个月不同的解决办法,我只是这次找不到一个-我很抱歉

多谢各位


作为附录,我从中读取的文件-missing.txt-被创建为一个文本选项卡,由一个excel文件分隔,该文件的格式为完全文本格式的行和列。如果有区别。

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

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

/\s*[\t\n]\s*/
不需要明确提及\r,因为它将包含在\s中。仍然需要明确提及\t和\n,否则您也会被单个字段中出现的空格分割

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

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

03999.... PHP中的前导零表示一个八进制数,但由于9是无效的八进制数,因此将转换为03或十进制3。。。。这肯定会导致问题前导零不是问题,只要它被视为字符串-即“03999”而不是03999。数据库中的列无论如何都是varchar,所以这是一个字符串。可能是select*from temp_missing返回的值没有添加0,所以是3999而不是03999?尝试使用bindValue而不是bindParam,并使用第三个参数:$sql->bindValue1,$fileArray[$i],PDO::PARAM_STR;。另外,请确保在任何时候都不要对$fileArray执行可能导致其值转换为数字而不是字符串的操作。在循环之前执行var_dump$fileArray,然后查看数组元素的数据类型。如果不是字符串,那么就是您的问题。preg_split返回一个字符串数组,但是您可能有其他代码处理该数组?另外,你能确认一下从temp_missing returns中选择*是什么吗?报告的SKU值中是否有预先填充的零?请改用此正则表达式:/\s*[\t\n]\s*/:它将删除空格。请注意,您的字符串中有\n个字符,因为您是按\r拆分的,但是换行符中\n个字符最多,即使您有\r当前的编码。
$fileArray = array_map('trim', $fileArray);