【问题标题】:Import CSV file directly into MySQL database [duplicate]将CSV文件直接导入MySQL数据库[重复]
【发布时间】:2012-07-12 21:55:43
【问题描述】:

可能重复:
Import CSV to mysql

是的,我需要一些帮助:

我正在尝试使用 php 将 .csv 文件导入 mysql 数据库,而不是通过 phpmyadmin 手动执行。

这是我目前的代码:

if($_REQUEST['func'] == "iid"){
    $db->conn = new mysqli(DB_SERVER, DB_USER, DB_PASSWORD, DB_NAME) or 
                      die('There was a problem connecting to the database.');
    $csv = $_POST['csv-file'];
    $path = $csv;
    $row = 1;
    if (($handle = fopen($path, "r")) !== FALSE) {
        while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) {
            $row++;
            $data_entries[] = $data ;

        }
        fclose($handle);
    }
    // this you'll have to expand
    foreach($data_entries as $line){
        $sql = $db->conn->prepare('INSERT INTO `bd_results`');

        $db->execute($line);
    }
}

但是我收到以下错误:

Fatal error: Call to undefined method stdClass::execute() in /homepages/19/d372249701/htdocs/business-sites/bowlplex-doubles-new/admin/scores.php on line 44

作为参考,我使用的代码取自:Here

我不精通$db->conn 业务我习惯mysql_connect!!所以任何帮助将不胜感激。

【问题讨论】:

  • 如果你使用 $db->conn->execute() 会得到什么? - 改写 - 是 $db 还是 $db->conn 是数据库对象?
  • @MyStream Fatal error: Call to undefined method mysqli::execute() in /homepages/19/d372249701/htdocs/business-sites/bowlplex-doubles-new/admin/scores.php on line 44
  • 这样更好 =) 这就是您需要的对象 - 但请参阅下文以了解用于查询的正确语法。
  • 您考虑过使用 LOAD DATA INFILE 吗? dev.mysql.com/doc/refman/5.1/en/load-data.html

标签: php mysql csv


【解决方案1】:

试试这个简单的。

if (($handle = fopen("google.csv", "r")) !== FALSE) {
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
        $db->conn->query("INSERT INTO values('" . implode('\',\'', $data) . "');");
    }
    fclose($handle);
}

如果 CSV 值还没有引号,您的脚本可能还需要为它们添加引号。如果您需要处理 CSV 文件中的引号和所有内容,我建议您查看我的博客文章http://www.fusionswift.com/2012/07/php-import-csv-to-mysql/

【讨论】:

  • 我得到的只是这个You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1 使用$db->conn->error
  • 我正在使用 ;作为分隔符和 "" 作为引号我要更改什么
  • 您的 CSV 文件是什么样的?理论上新代码应该可以工作。
  • 示例第 1 行:1;"LAURA";"OBRIEN";0;"WATFORD";161;1;104836;263;"F";"14/09/1995";186;147;173;133;210;192;164;148;1353;169.1;3083
  • while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { 中,将 "," 更改为 ";" 应该可以工作
【解决方案2】:
foreach($data_entries as $line) {
    $stmt = $db->conn->prepare('INSERT INTO `bd_results` (field1, field2) VALUES (?, ?)');
    $stmt->bindParam('ss', $field1Value, $field2Value);
    list($field1Value, $field2Value) = $line
    $stmt->execute();
}

其中 $field1Value 是第一个 CSV 列,$field2Value 是第二个 CSV 列,两者都是字符串类型,在 bindParam() 方法中指定。

基本上,您需要准备整个查询,然后您可以为其分配变量,一旦变量具有所需的值,您就可以使用execute() 方法执行查询。

这就是您使用准备好的语句的方式。不过,就我个人而言,我会接受 Mahn 的建议,并避免在此类任务中使用准备好的语句,除非您需要在处理数据时对其进行处理。

mysqli_stmt::bind_param mysqli_stmt::execute

【讨论】:

    猜你喜欢
    • 2011-05-07
    • 2023-04-11
    • 1970-01-01
    • 2017-11-15
    • 1970-01-01
    • 1970-01-01
    • 2019-02-21
    • 1970-01-01
    • 2017-07-19
    相关资源
    最近更新 更多