15

I have tried the following code but getting some errors. Here I can read the input file but I am getting the following error:Deprecated: Function split() is deprecated in C:\wamp\www\aaj2\index.php on line 63. O/P: Found a total of 5124 records in this csv file.

<?php
$databasehost = "localhost"; 
$databasename = "test"; 
$databasetable = "sample"; 
$databaseusername="test"; 
$databasepassword = ""; 
$fieldseparator = ","; 
$lineseparator = "\n";
$csvfile = "filename.csv";
$addauto = 0;
$save = 1; 
$outputfile = "output.sql";        

        if(!file_exists($csvfile)) {    echo "File not found. Make sure you specified the correct path.\n";     exit; }

        $file = fopen($csvfile,"r");

        if(!$file) {    echo "Error opening data file.\n";  exit; }

        $size = filesize($csvfile);

        if(!$size) {    echo "File is empty.\n";    exit; }

        $csvcontent = fread($file,$size);

        fclose($file);

        $con = @mysql_connect($databasehost,$databaseusername,$databasepassword) or die(mysql_error()); @mysql_select_db($databasename) or die(mysql_error());

        $lines = 0; $queries = ""; $linearray = array();

        foreach(split($lineseparator,$csvcontent) as $line) {

            $lines++;

            $line = trim($line," \t");      $line = str_replace("\r","",$line);         /************************************   This line escapes the special character. remove it if entries are already escaped in the csv file   ************************************/   $line = str_replace("'","\'",$line);    /*************************************/         $linearray = explode($fieldseparator,$line);        $linemysql = implode("','",$linearray);         if($addauto)        $query = "insert into $databasetable values('','$linemysql');";     else        $query = "insert into $databasetable values('$linemysql');";        $queries .= $query . "\n";

            @mysql_query($query); }

        @mysql_close($con);

        if($save) {         if(!is_writable($outputfile)) {         echo "File is not writable, check permissions.\n";  }       else {      $file2 = fopen($outputfile,"w");
                        if(!$file2) {           echo "Error writing to the output file.\n";         }       else {          fwrite($file2,$queries);            fclose($file2);         }   }    }

        echo "Found a total of $lines records in this csv file.\n";


        ?>

EDIT : Error : File is not writable, check permissions. Found a total of 5124 records in this csv file.

Kabir
  • 161
  • 1
  • 1
  • 7
  • 3
    possible duplicate of [PHP split alternative?](http://stackoverflow.com/questions/2813241/php-split-alternative) – Michael Berkowski Jan 02 '14 at 03:49
  • 1
    Or http://stackoverflow.com/questions/10543382/split-deprecated ... or... http://stackoverflow.com/questions/5699137/function-split-is-deprecated-in-php – Michael Berkowski Jan 02 '14 at 03:50
  • Two nitpicks, if I may: mysql_* is deprecated as well, not just split. Also, you should probably not suppress messages from the function that's doing the database connecting... – Zarathuztra Jan 02 '14 at 04:00
  • A better example: http://stackoverflow.com/a/5249971/386579 – shasi kanth Jun 27 '14 at 13:43

4 Answers4

42

Several tips:

  • Don't use the deprecated ext/mysql, when you can use ext/mysqli or PDO.

  • Don't read the entire csv file into a PHP variable. What happens when the file is 500MB?

  • Don't write custom PHP code to parse csv data, when you can use the builtin function fgetcsv().

  • Don't create a new SQL statement for every row in the data, when you can use prepared statements.

  • Don't interpolate data from an external file into SQL statements. This risks SQL injection vulnerabilities, just like when you interpolate untrusted user input.

  • Don't parse and insert csv data row by row, when you can use MySQL's LOAD DATA INFILE command. It's 20x faster than inserting row by row.

Here's a simpler solution:

<?php
$databasehost = "localhost"; 
$databasename = "test"; 
$databasetable = "sample"; 
$databaseusername="test"; 
$databasepassword = ""; 
$fieldseparator = ","; 
$lineseparator = "\n";
$csvfile = "filename.csv";

if(!file_exists($csvfile)) {
    die("File not found. Make sure you specified the correct path.");
}

try {
    $pdo = new PDO("mysql:host=$databasehost;dbname=$databasename", 
        $databaseusername, $databasepassword,
        array(
            PDO::MYSQL_ATTR_LOCAL_INFILE => true,
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
        )
    );
} catch (PDOException $e) {
    die("database connection failed: ".$e->getMessage());
}

$affectedRows = $pdo->exec("
    LOAD DATA LOCAL INFILE ".$pdo->quote($csvfile)." INTO TABLE `$databasetable`
      FIELDS TERMINATED BY ".$pdo->quote($fieldseparator)."
      LINES TERMINATED BY ".$pdo->quote($lineseparator));

echo "Loaded a total of $affectedRows records from this csv file.\n";

?>

I tested this with PHP 5.3.26 on a Mac, connecting to MySQL 5.6.14 on Linux.

Community
  • 1
  • 1
Bill Karwin
  • 538,548
  • 86
  • 673
  • 828
  • Only if I am creating a table then the data is being dumped. Else the data is not saved. Thank you! – Kabir Jan 02 '14 at 06:50
  • @Bill Karwin is that possible to load remote csv file. – ArK Feb 15 '14 at 09:39
  • @Paniyar, read the documentation for LOAD DATA LOCAL INFILE, to which I linked. It reads a CSV file that is on the same host where the PHP script runs, and it uploads it to the MySQL database. In this example the MySQL instance is on $databasehost, which certainly may be on a remote host. – Bill Karwin Feb 15 '14 at 18:54
  • @Paniyar, also read my answer to http://stackoverflow.com/questions/20226631/load-data-local-infile-does-not-work-from-php-5-5-using-pdo/21785972#21785972, to see how to configure MySQL and PDO to allow remote upload. It's not enabled by default, so you have to use some special options. – Bill Karwin Feb 15 '14 at 18:55
  • For all people who get error "ERROR 1148 (42000): The used command is not allowed with this MySQL version" using LOAD DATA LOCAL INFILE with PHP - look here: https://bugs.php.net/bug.php?id=62889 You need to install php5-mysqlnd to fix the issue. – Yavor May 28 '15 at 09:56
8

Try this:

<?php
// specify connection info
$connect = mysql_connect('localhost','root','12345');
if (!$connect)
{
   die('Could not <span id="IL_AD1" class="IL_AD">
    connect to</span> MySQL: ' . mysql_error());
}

$cid =mysql_select_db('test',$connect); //specify db name

define('CSV_PATH','C:/wamp/www/csvfile/'); // specify CSV file path

$csv_file = CSV_PATH . "infotuts.csv"; // Name of your CSV file
$csvfile = fopen($csv_file, 'r');
$theData = fgets($csvfile);
$i = 0;
while (!feof($csvfile))
{
   $csv_data[] = fgets($csvfile, 1024);
   $csv_array = explode(",", $csv_data[$i]);
   $insert_csv = array();
   $insert_csv['ID'] = $csv_array[0];
   $insert_csv['name'] = $csv_array[1];
   $insert_csv['email'] = $csv_array[2];
   $query = "INSERT INTO csvdata(ID,name,email)
     VALUES('','".$insert_csv['name']."','".$insert_csv['email']."')";
   $n=mysql_query($query, $connect );
   $i++;
}
fclose($csvfile);
echo "File data successfully imported to database!!";
mysql_close($connect); // closing connection
?>
ReNiSh AR
  • 2,782
  • 2
  • 30
  • 42
  • 1
    @renish..ThankQ for your effort but I am looking for a script that creates the table automatically using the excel sheet header fields. – Kabir Jan 03 '14 at 02:40
1

I think you need to convert CSV file in collection first. After that you can add loop and call insert queries to insert data.

Here you will get code to convert CSV file into collection array. best-way-to-upload-and-read-csv-file-in-php

1
**Data Import And Export**
**CSV To Mysql AND Mysql To CSV Using Mysqli**    
<!DOCTYPE html>
    <!--
    To change this license header, choose License Headers in Project Properties.
    To change this template file, choose Tools | Templates
    and open the template in the editor.
    -->
    <html>
        <head>
            <meta charset="UTF-8">
            <title></title>
        </head>
        <body>
            <form method="post">
                <button type="submit" name="btn_export">Data Export</button>
                <button type="submit" name="btn_import">Data Import</button>
            </form>
            <?php
            $host = "localhost";
            $uname = "root";
            $pass = "";
            $database = "demo"; //Change Your Database Name
            $conn = new mysqli($host, $uname, $pass, $database)or die("No Connection");
            echo mysql_error();
    //MYSQL MYADDMINPHP TO CSV
            if (isset($_REQUEST['btn_export']))
            {
                $data_op = "";
                $sql = $conn->query("select * from users"); //Change Your Table Name          
                while ($row1 = $sql->fetch_field())
                {
                    $data_op .= '"' . $row1->name . '",';
                }
                $data_op .="\n";
                while ($row = $sql->fetch_assoc())
                {
                    foreach ($row as $key => $value)
                    {
                        $data_op .='"' . $value . '",';
                    }
                    $data_op .="\n";
                }
                $filename = "Database.csv"; //Change File type CSV/TXT etc
                header('Content-type: application/csv'); //Change File type CSV/TXT etc
                header('Content-Disposition: attachment; filename=' . $filename);
                echo $data_op;
                exit;
            }
    //CSV To MYSQL MYADDMINPHP
            if (isset($_REQUEST['btn_import']))
            {
                $filename = 'Database.csv';
                $fp = fopen($filename, "r");
                while (($row = fgetcsv($fp, "40", ",")) != FALSE)
                {
                    $sql = "INSERT INTO users (name,pass,city,id) VALUES('" . implode("','", $row) . "')";
                    if (!$conn->query($sql))
                    {
                        echo '<br>Data No Insert<br>';
                    }
                }
                fclose($fp);
            }
            ?>
        </body>
    </html>
Patel Yatin
  • 149
  • 1
  • 3