当前位置: 首页 > 知识库问答 >
问题:

我的加载数据填充语法有什么错误?

柴宏阔
2023-03-14

我正在尝试将CSV文件导入MySQL数据库,但没有成功。

我的数据库中有5列:

ID, userID, moviID,速率,时间戳

在我的CSV文件中,只有4列由两个冒号“::”分隔。
这是示例数据:

1::1193::5::978300760

这是我的问题

$query=“将数据填充“$uploadfile”到表评级\以“::”结尾的表字段中,行以“\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() . "<br/>";
    die();
}
echo "</p>";  

我尝试过很多次,但当我签入数据库时,它仍然是空的。
我似乎不知道出了什么问题,你能帮我吗?谢谢

这就是我犯的错误。

致命错误:未捕获异常“PDOException”,消息为“SQLSTATE[HY000]:一般错误:2014无法在其他未缓冲查询处于活动状态时执行查询。考虑使用pdoCalp::FutAccess()。或者,如果您的代码只在html" target="_blank">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):PDO语句中-

这是我的连接设置:

$dbh=new PDO('mysql: host=localhost; dbname=电影','根', '', 数组(PDO::MYSQL_ATTR_INIT_COMMAND=

共有2个答案

方绪
2023-03-14

您可能在LOAD DATA INFILE语句中缺少LOCAL关键字。

LOCAL表示从中加载的文件位于客户端而不是服务器上。我刚用你的桌子和文件试过这个,效果很好。

> cat infile.csv 
1::1193::5::978300760

> mysql
mysql > create table ratings (
    id int primary key auto_increment, 
    userID int, 
    movieID int, 
    rate int, 
    ts long);
Query OK, 0 rows affected (0.06 sec)

mysql > LOAD DATA LOCAL INFILE 'infile.csv' INTO TABLE ratings FIELDS TERMINATED BY '::' LINES TERMINATED BY '\n' ( userID, movieID, rate, ts);
Query OK, 1 row affected (0.00 sec)
Records: 1  Deleted: 0  Skipped: 0  Warnings: 0

mysql > select * from ratings;
+----+--------+---------+------+-----------+
| id | userID | movieID | rate | ts        |
+----+--------+---------+------+-----------+
|  1 |      1 |    1193 |    5 | 978300760 |
+----+--------+---------+------+-----------+
1 row in set (0.00 sec)
丰飞龙
2023-03-14

要查看输出上的错误消息,只需使用PDO::ERRMODE_EXCEPTION初始化PDO,如下所示:

$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
        ));

之后,您将能够看到错误。将其发布在更新中,我/我们将能够帮助您!

请看一下关于PDO_MYSQL的手册。

您可能还需要:

PDO::MYSQL_ATTR_LOCAL_INFILE => TRUE

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

根据MySQL手册,MySQL的编译必须使用——启用本地infle

您必须使用MySQL的完整路径编译PHP,否则它将使用内部处理程序,而内部处理程序不能处理“新”加载数据。

--使用mysql=/usr/local/mysql(假设您的mysql位于此处)

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

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

[mysql]
local-infile=1

[mysqld]
local-infile=1

重启mysqld之后,通过运行服务mysqld restart

引号用于字符串文字,背勾用于列和表名称。正确转义变量。将查询更改为:

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

当您同时打开多个查询时,通常会导致此错误。例如,您调用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();

看看这对你有什么影响。

尝试使用其他语法来转义变量。使用以下命令:

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

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

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

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

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

 类似资料:
  • 在我的应用程序中,我正在扫描广告BLE设备,我想在一个回收视图中显示结果。我可以很好地扫描设备,但它们没有被添加到RecyclerView中。我在主activity中创建了一个对话片段: 下面是包含RecyclerView的片段的布局文件: 以下是扫描结果项的布局: 下面是recyclerview适配器: 在函数loadScanResults中,我可以确认扫描的结果。在我心目中,它应该像在onCr

  • series(string $value,[ string $categories]) string $value $config = ['path' => './tests']; ​ $fileObject = new \Vtiful\Kernel\Excel($config); ​ $fileObject = $fileObject->fileName('tutorial.xlsx'); $

  • factory 辅助函数 必须 使用 factory 方法来做数据填充,因为是框架提倡的,并且可以同时为测试代码服务。 运行效率 开发数据填充时,必须 特别注意 php artisan db:seed 的运行效率,否则随着项目的代码量越来越大,db:seed 的运行时间会变得越来越长,有些项目多达几分钟甚至几十分钟。 原则是: Keep it lighting speed. 只有当 db:seed

  • 我正在将一个CSV文件中的20000行数据导入Mysql。 CSV中的列与MySQL表中的列的顺序不同。如何自动分配Mysql表列对应的列? 当我执行 此查询将所有数据添加到第一列。 请建议将数据导入Mysql的自动语法。

  • 问题内容: 建议使用JQuery数据表。现在,我需要用从控制器发送的一堆json对象填充网格。我如何从JS在网格上发送此数据 更新 我已经找到了这些链接,但是我不知道如何实现它。 问题答案: 您应该使用JQuery DataTable sAjaxSource属性来指定ajaxsource,在这种情况下,它将是/ HomeReturnJsonData 以下是一个例子