用PHP将CSV导入MYSQL

4

我正在将CSV文件导入到我的管理区域,想要将文件添加到我的数据库中。我的import.php PHP代码如下:

<?php 

include_once('../include/connection.php');

if ($_FILES[csv][size] > 0) {

    //get the csv file
    $file = $_FILES[csv][tmp_name];
    $handle = fopen($file,"r");

    //loop through the csv file and insert into database
    do {
        if ($data[0]) {
             mysql_query("INSERT INTO mobi(promo_title, promo_content, promo_image, promo_link, promo_cat, promo_name) VALUES
                (
                    '".addslashes($data[0])."',
                    '".addslashes($data[1])."',
                    '".addslashes($data[2])."',
                    '".addslashes($data[3])."',
                    '".addslashes($data[4])."',
                    '".addslashes($data[5])."'
                )
            ");
        }
    } while ($data = fgetcsv($handle,1000,",","'"));
    //

    //redirect
    header('Location: import.php?success=1'); die;

}

?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Import a CSV File with PHP & MySQL</title>
</head>

<body>

<?php if (!empty($_GET[success])) { echo "<b>Your file has been imported.</b><br><br>"; } //generic success notice ?>

<form action="" method="post" enctype="multipart/form-data" name="form1" id="form1">
  Choose your file: <br />
  <input name="csv" type="file" id="csv" />
  <input type="submit" name="Submit" value="Submit" />
</form>

</body>
</html> 

代码显示正确,但当我选择我的测试文件并点击提交时,遇到了这些问题:
Warning: mysql_query() [function.mysql-query]: Access denied for user 'root'@'localhost' (using password: NO) in admin/import.php on line 23

Warning: mysql_query() [function.mysql-query]: A link to the server could not be established in admin/import.php on line 23

Warning: mysql_query() [function.mysql-query]: Access denied for user 'root'@'localhost' (using password: NO) in admin/import.php on line 23

Warning: mysql_query() [function.mysql-query]: A link to the server could not be established in admin/import.php on line 23

Warning: mysql_query() [function.mysql-query]: Access denied for user 'root'@'localhost' (using password: NO) in admin/import.php on line 23

Warning: mysql_query() [function.mysql-query]: A link to the server could not be established in admin/import.php on line 23

Warning: mysql_query() [function.mysql-query]: Access denied for user 'root'@'localhost' (using password: NO) in admin/import.php on line 23

Warning: mysql_query() [function.mysql-query]: A link to the server could not be established in admin/import.php on line 23

Warning: Cannot modify header information - headers already sent by (output started at admin/import.php:1) in admin/import.php on line 29

有人能看出问题所在吗?

我的connection.php代码如下:

<?php

try {
$pdo = new PDO('mysql:host=localhost;dbname=*********', '*********', '*********');
}catch (PDOException $e){
  exit('Database Error.');
}

?>

请注意,我的其他页面,如add.php、delete.php、edit.php等都使用相同的include_once连接到connection.php,因此我的数据库连接没有问题。谢谢。

2
请检查您的 connection.php 文件以修正数据库连接。 - Vahid Hallaji
嗨。我正在使用以下代码进行连接:try { $pdo = new PDO 这需要在上面的代码中反映出来吗? - kevstarlive
看起来你的数据库有一个“密码”,但你却把它留空了。 - Vahid Hallaji
我把哪儿空着了?我是怎么空着的?你能指出来吗?我的管理员中每个其他文件都使用相同的包含代码连接到这个文件,所以我如何在这一个文件上做错了什么,因为它正在读取同一页。 - kevstarlive
请阅读我的更新帖子。 - kevstarlive
请在答案部分查看翻译后的文本。 - Vahid Hallaji
4个回答

1
你正在使用 PDO 建立数据库连接。但是 $pdo 实例不再使用!
要执行 SQL 语句,需要像这样使用 $pdo->query("INSERT INTO mobi ...") 相反,你正在使用 mysql_query 发送 MySQL 查询。所以你会得到以下警告: Access denied for user 'root'@'localhost' (using password: NO) A link to the server could not be established 还要确保在你的 header() 函数之前没有输出任何字符串等内容,以消除此警告:headers already sent

好的,所以我用$pdo->query替换了mysql_query。这解决了所有第一个问题,但最后一个关于标题的问题还没有解决。 - kevstarlive
请确保代码顶部的 <?php 前面没有任何空格。如果有,请将其删除。 - Vahid Hallaji
Vahid Hallaji - 非常感谢。这个很好用。再次感谢你。 - kevstarlive

0

您的数据库凭据可能不正确。 请检查服务器是否可访问。

而已发送的头信息是由于 PHP 代码前的空格造成的。

 <?php 

include_once('../include/connection.php');

使用

<?php 

include_once('../include/connection.php');

嗯,<?php 前面多了一个空格。 - Ajmal M Sali

0

你尝试过使用PHP加载文件,这样就不必循环遍历它了吗?

我建议使用require_once而不是include_once。在你的包含路径前面加上__DIR__也总是一个好习惯。这样你可以指定文件相对于当前文件的位置,而不是当前运行脚本的位置。

代码应该长这样:

<?php
require_once __DIR__ . '/../include/connection.php';

if ($_FILES[csv][size] > 0) {

    //get the csv file
    $file = $_FILES[csv][tmp_name];

    mysql_query("
        LOAD DATA LOW_PRIORITY LOCAL 
        INFILE '$file'
        REPLACE INTO TABLE mobi 
        FIELDS TERMINATED BY ',' 
        OPTIONALLY ENCLOSED BY '\"' 
        ESCAPED BY '\"' 
        LINES TERMINATED BY '\n' 
        (promo_title, promo_content, promo_image, promo_link, promo_cat, promo_name)
        SET promo_name = TRIM(BOTH '\r' FROM promo_name);
    ");
}

0

您的数据库凭据不正确。您还应该考虑使用mysqli面向对象的方法来处理数据库,并应该使用mysqli_real_escape_string而不是addslashes。页眉错误是由于mysql错误被抛出并输出到页面。


嗨。对于我的连接,我正在使用以下代码:try { $pdo = new PDO 这需要在上面的代码中体现吗? - kevstarlive
使用PDO,您需要执行类似于$pdo->query(YOURQUERY);的操作,但是您仍然应该检查用于建立连接的凭据。 - Wayne Weibel
每个页面都使用相同的包含页面,而我的add.php页面和其他页面一样可以正常工作。 - kevstarlive

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接