我正在尝试将一个(简单的)CSV文件导入到MySQL表中。
我可以很好地连接,并且我已经使用一些伪数据测试了该语句,并验证了该语句正确地写入了表。当我尝试在语句中使用变量时,出现了我的问题。示例:
$sql = "INSERT into `link_titles` (`title_id`, `title`, `description`) VALUES ('$data[0]', '$data[1]', '$data[2]')";
$conn->exec($sql);
这会产生错误:
未捕获的PDOException:SQLSTATE [HY000]:常规错误:1366不正确 整数值:第1行的“ title_id”列为“ 5”
因此,我认为第一个变量有问题,并且从第一个变量($data[0]
)中删除了单引号:
$sql = "INSERT into `link_titles` (`title_id`, `title`, `description`) VALUES ($data[0], '$data[1]', '$data[2]')";
$conn->exec($sql);
但是,如果我手动输入整数“ 5”(正在读取的值),它将起作用。
$sql = "INSERT into `link_titles` (`title_id`, `title`, `description`) VALUES (5, '$data[1]', '$data[2]')";
$conn->exec($sql);
我已经研究过将字符串转换为整数(PHP是应该来处理的),但是当我尝试这样做时,它会转换为0
echo (int)$data[0]; <------ Results in 0
我很茫然。朝着正确的方向前进,我们会很棒
这是我用来创建link_titles
表的mySQL命令:
CREATE TABLE link_titles( id int not null auto_increment primary key, title_id int(10) unsigned not null, title varchar(120) default null, description varchar(512) default null, FOREIGN KEY fk_id(title_id) REFERENCES links(id) ON UPDATE CASCADE ON DELETE RESTRICT );
此表中的结果:
desc link_titles;
+-------------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+------------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| title_id | int(10) unsigned | NO | MUL | NULL | |
| title | varchar(120) | YES | | NULL | |
| description | varchar(512) | YES | | NULL | |
+-------------+------------------+------+-----+---------+----------------+
根据评论和@Ligemar提供的答案,我对PHP代码进行了如下修改:
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = $conn->prepare("INSERT into link_titles (title_id, title, description)
VALUES (:tid, :title, :description)");
$sql->bindParam(':tid', $tid);
$sql->bindParam(':title', $title);
$sql->bindParam(':description', $description);
//while loop to parse CSV file excluded for brevity
$tid = $data[0];
$title = $data[1];
$description = $data[2];
$sql->execute();
和以前一样,我仍然遇到相同的错误:
Uncaught PDOException: SQLSTATE[HY000]: General error: 1366 Incorrect integer value: '5' for column 'title_id' at row 1
答案 0 :(得分:1)
由于您使用的是->exec
方法,因此我假设您是从PDO进行编码的。
请使用参数: docs
特别是如果您刚开始使用PHP,那么执行SQL注入将使您成为不良的开发人员并养成不良的习惯。使用准备好的SQL语句是正确的方法,因为查询将免受注入攻击的侵害,您可以更轻松地更改数据库后端,通过更好的调试提交事务,并可以提供缓存和“服务器端”其他功能。 / p>
尝试这样的事情:
<?php
$sql = 'INSERT into `link_titles` (`title_id`, `title`, `description`)
VALUES (:first, :second, :somethingelse)';
$sth = $dbh->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
$result = $sth->execute(
[
':first' => $data[0],
':second' => $data[1],
':somethingelse' => $data[2]
]
);
var_dump($result);
答案 1 :(得分:0)
在进行了很多研究之后,我很困惑。我能够找出问题所在:文件开头的UTF-8字节序标记(BOM)。 1
$ file test.csv
test.csv: UTF-8 Unicode (with BOM) text, with very long lines, with CRLF, LF line terminators
修复文件后,我能够毫无问题地运行代码,从而成功导入了文件。
file test-nobom.csv
test-nobom.csv: UTF-8 Unicode text, with very long lines, with CRLF, LF line terminators
显然,Windows操作系统(尽管这是在Excel for Mac中完成的)将此伪造的字符添加到这些文本文件的前面。我发现了多种修复方法
使用sed
2 :
sed '1s/^\xEF\xBB\xBF//' < foo-withBOM > foo-withoutBOM.txt
使用dos2unix
命令 3
使用tail
命令 4
tail -c +4 foo-withBOM.txt > foo-withoutBOM.txt
1 Getting error “1366 Incorrect integer value: '1'” when importing file
2 https://unix.stackexchange.com/a/381263/107777
答案 2 :(得分:-1)
try this function ==> intval($data[0]);