PHP mySQL INSERT语句使用具有整数值的变量

时间:2018-06-28 21:46:57

标签: php mysql

我正在尝试将一个(简单的)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

我很茫然。朝着正确的方向前进,我们会很棒

更新#1:

这是我用来创建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    |                |
+-------------+------------------+------+-----+---------+----------------+

更新#2

根据评论和@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

3 个答案:

答案 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)

在进行了很多研究之后,我很困惑。我能够找出问题所在:文件开头的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

从文件中删除BOM

显然,Windows操作系统(尽管这是在Excel for Mac中完成的)将此伪造的字符添加到这些文本文件的前面。我发现了多种修复方法

  • Windows GUI编辑器:(Notepad ++
  • 使用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

3 https://unix.stackexchange.com/a/381237/107777

4 https://unix.stackexchange.com/a/381231/107777

答案 2 :(得分:-1)

其变量$ data [0]不是整数

try this function ==> intval($data[0]);

http://php.net/manual/pt_BR/function.intval.php