我的LOAD DATA INFILE语法有什么问题?

 lrz76597 发布于 2023-02-04 13:10

我正在尝试将CS​​V文件导入MySQL数据库,但它无法正常工作.

我的数据库中有5列:

id,userID,movieID,rate,timestamp

在我的CSV文件中,我只有4列用两个冒号'::'分隔.
这是样本数据:

1 :: 1193 :: 5 :: 978300760

这是我的查询

$ query ="LOAD DATA INFILE'$ uploadfile'INTO TABLE rating_table FIELDS终止于'::'LINESATED by'\n'(userID,movieID,rate,timestamp)";

而我正在使用PDO_MySQL这是附加代码,以便您可以理解.

$stmt = $dbh->prepare($query);

try{
        if($stmt->execute()){
                echo "Sucessful importing of CSV file into the MySQL database!";
            }

    }
catch (PDOException $e) {
    echo "Error importing of CSV file into the MySQL database!";
    echo "Error!: " . $e->getMessage() . "
"; die(); } echo "

";

我已经尝试了很多次,但是当我检查了我的数据库时,它仍然是空的.
我似乎无法弄清楚出了什么问题,你能帮助我吗?谢谢!

这是我得到的错误.

致命错误:带有消息'SQLSTATE [HY000]的未捕获异常'PDOException':常规错误:2014在其他未缓冲的查询处于活动状态时无法执行查询.考虑使用PDOStatement :: fetchAll().或者,如果您的代码只是针对mysql运行,则可以通过设置PDO :: MYSQL_ATTR_USE_BUFFERED_QUERY属性来启用查询缓冲.在C:\ xampp\htdocs\movie\php\upload_file.php:57堆栈跟踪:#0 C:\ xampp\htdocs\movie\php\upload_file.php(57):PDOStatement-> execute()1 {main}在第57行的C:\ xampp\htdocs\movie\php\upload_file.php中抛出

这是我的连接设置:

$ dbh = new PDO('mysql:host = localhost; dbname = movie','root','',array(PDO :: MYSQL_ATTR_INIT_COMMAND =>"SET NAMES UTF8",PDO :: ATTR_EMULATE_PREPARES => FALSE,PDO :: MYSQL_ATTR_USE_BUFFERED_QUERY => TRUE,PDO :: ATTR_ERRMODE => PDO :: ERRMODE_EXCEPTION,PDO :: MYSQL_ATTR_LOCAL_INFILE => TRUE));

Ilia Rostovt.. 5

要在输出中查看错误消息,只需初始化您的PDO PDO::ERRMODE_EXCEPTION,如下所示:

$db = new PDO('mysql:host=' . $config['db_host'] . ';dbname=' . $config['db_name'], $config['db_username'], $config['db_password'],
    array(
        PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES UTF8",
        PDO::ATTR_EMULATE_PREPARES => FALSE,
        PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => TRUE,
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
        ));

之后您将能够看到错误.在更新中发布它我/我们将能够帮助你!

编辑1:

看一下PDO_MYSQL上的手册.

您可能还需要:

PDO::MYSQL_ATTR_LOCAL_INFILE => TRUE

注意,在构造新的数据库句柄时,此常量只能在driver_options数组中使用.

编辑2:

根据MySQL手册,MySQL必须编译为--enable-local-infile:

您必须使用MySQL的完整路径编译PHP,否则它将使用它的内部处理程序,它不能与"新"LOAD DATA一起使用.

--with-mysql =/usr/local/mysql(假设你的MySQL位于这里)

你必须使用选项'--local-infile = 1'启动MySQL守护进程

或通过添加到您的启用它/etc/my.cnf:

[mysql]
local-infile=1

[mysqld]
local-infile=1

mysqld之后通过运行重新启动service mysqld restart.

编辑3:

引号用于字符串文字,用于列和表名称的后退.正确地转义变量.将您的查询更改为:

$query = "LOAD DATA INFILE ' . $uploadfile . ' INTO TABLE `rating_table` FIELDS TERMINATED BY '::' LINES TERMINATED BY '\n' ( `userID`, `movieID`, `rate`, `timestamp`)";

编辑4:

当您同时有多个查询open时,通常会导致此错误.例如,您调用fetch(),但在完成之前不调用它,然后尝试执行第二个查询.

通常,这个问题的解决方案是调用closeCursor() PHP:PDOStatement :: closeCursor - Manual.试着调用:

/* The following call to closeCursor() may be required by some drivers */
$stmt->closeCursor();

/* Now we can execute the second statement */
$otherStmt->execute();

看看这是否会改变你的一切.

编辑5:

尝试使用其他语法来转义变量.使用以下内容:

$stmt = $dbh->prepare("
       LOAD DATA INFILE 
          '" . $uploadfile . "' 
       INTO TABLE 
          `rating_table`
       FIELDS TERMINATED BY 
          '::' 
       LINES TERMINATED BY 
          '\n' ( `userID`, `movieID`, `rate`, `timestamp`)
");
$stmt->execute();

编辑6:

PDO占位符只能用于值,而不能用于数据库,表或列名称!我认为错误来自于使用'::'.'::'比方说,将文件中的数据分隔符更改为'.'.

作为检查的快速解决方法,您可以直接使用查询而无需准备:

$stmt = $dbh->query("
       LOAD DATA INFILE 
          '" . $uploadfile . "' 
       INTO TABLE 
          `rating_table`
       FIELDS TERMINATED BY 
          '::' 
       LINES TERMINATED BY 
          '\n' ( `userID`, `movieID`, `rate`, `timestamp`)
");

如果它不起作用尝试更改数据分隔符或尝试::以某种方式转义现有的delemiter().

1 个回答
  • 要在输出中查看错误消息,只需初始化您的PDO PDO::ERRMODE_EXCEPTION,如下所示:

    $db = new PDO('mysql:host=' . $config['db_host'] . ';dbname=' . $config['db_name'], $config['db_username'], $config['db_password'],
        array(
            PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES UTF8",
            PDO::ATTR_EMULATE_PREPARES => FALSE,
            PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => TRUE,
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
            ));
    

    之后您将能够看到错误.在更新中发布它我/我们将能够帮助你!

    编辑1:

    看一下PDO_MYSQL上的手册.

    您可能还需要:

    PDO::MYSQL_ATTR_LOCAL_INFILE => TRUE
    

    注意,在构造新的数据库句柄时,此常量只能在driver_options数组中使用.

    编辑2:

    根据MySQL手册,MySQL必须编译为--enable-local-infile:

    您必须使用MySQL的完整路径编译PHP,否则它将使用它的内部处理程序,它不能与"新"LOAD DATA一起使用.

    --with-mysql =/usr/local/mysql(假设你的MySQL位于这里)

    你必须使用选项'--local-infile = 1'启动MySQL守护进程

    或通过添加到您的启用它/etc/my.cnf:

    [mysql]
    local-infile=1
    
    [mysqld]
    local-infile=1
    

    mysqld之后通过运行重新启动service mysqld restart.

    编辑3:

    引号用于字符串文字,用于列和表名称的后退.正确地转义变量.将您的查询更改为:

    $query = "LOAD DATA INFILE ' . $uploadfile . ' INTO TABLE `rating_table` FIELDS TERMINATED BY '::' LINES TERMINATED BY '\n' ( `userID`, `movieID`, `rate`, `timestamp`)";
    

    编辑4:

    当您同时有多个查询open时,通常会导致此错误.例如,您调用fetch(),但在完成之前不调用它,然后尝试执行第二个查询.

    通常,这个问题的解决方案是调用closeCursor() PHP:PDOStatement :: closeCursor - Manual.试着调用:

    /* The following call to closeCursor() may be required by some drivers */
    $stmt->closeCursor();
    
    /* Now we can execute the second statement */
    $otherStmt->execute();
    

    看看这是否会改变你的一切.

    编辑5:

    尝试使用其他语法来转义变量.使用以下内容:

    $stmt = $dbh->prepare("
           LOAD DATA INFILE 
              '" . $uploadfile . "' 
           INTO TABLE 
              `rating_table`
           FIELDS TERMINATED BY 
              '::' 
           LINES TERMINATED BY 
              '\n' ( `userID`, `movieID`, `rate`, `timestamp`)
    ");
    $stmt->execute();
    

    编辑6:

    PDO占位符只能用于值,而不能用于数据库,表或列名称!我认为错误来自于使用'::'.'::'比方说,将文件中的数据分隔符更改为'.'.

    作为检查的快速解决方法,您可以直接使用查询而无需准备:

    $stmt = $dbh->query("
           LOAD DATA INFILE 
              '" . $uploadfile . "' 
           INTO TABLE 
              `rating_table`
           FIELDS TERMINATED BY 
              '::' 
           LINES TERMINATED BY 
              '\n' ( `userID`, `movieID`, `rate`, `timestamp`)
    ");
    

    如果它不起作用尝试更改数据分隔符或尝试::以某种方式转义现有的delemiter().

    2023-02-04 13:11 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有