【问题标题】:can't complete on fgetcsv in mysql无法在 mysql 中的 fgetcsv 上完成
【发布时间】:2023-03-04 12:14:02
【问题描述】:
<?php
header('Content-Type: text/html; charset=utf-8');
$servername = "localhost";
$username = "root";
$password = "abc";
$dbname = "project";

$conn = new mysqli($servername, $username, $password, $dbname);

if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
} 
$sql = "TRUNCATE TABLE datapack";
mysqli_query($conn,$sql);

if(isset($_POST['submit']))
{
     $fname = $_FILES['sel_file']['name'];
     echo 'upload file name: '.$fname.' ';
     $chk_ext = explode(".",$fname);

     if(strtolower(end($chk_ext)) == "csv")
     {
         $filename = $_FILES['sel_file']['tmp_name'];
         $handle = fopen($filename, "r");
         $head = fgetcsv($handle);
         while (($data = fgetcsv($handle, 1000, ",")) !== FALSE)
         {
            $sql= "INSERT into datapack(id,nickname,time,msg) values('$data[0]','$data[1]','$data[2]','$data[3]')";
            mysqli_query($conn,$sql);
            echo "Error: ". $conn->error;
          }
        echo "Success!";                  
     }

     else
     {
         echo "Invalid File";
     }   
}

?>
<h1>Import CSV file</h1>
<form action='<?php echo $_SERVER["PHP_SELF"];?>' method='post' enctype="multipart/form-data">
    Import File : <input type='file' name='sel_file' size='20'>
    <input type='submit' name='submit' value='submit'>
</form>

运行文件后发现一些问题:

  1. 文件不能完全导入mysql(比如csv有1000行只能导入600行),而且每次运行导入mysql的行数都不一样。

  2. 无法回显成功。

  3. 当回显错误时,有些行告诉我不正确的字符串值。我以为是uft-8的问题,但是我只得到了id和time之后,第1点的情况也一样

【问题讨论】:

    标签: php mysql fgetcsv


    【解决方案1】:

    最重要的是,您不会逃避数据。该 CSV 中可能有任何内容,会破坏该查询。此外,您正在限制行长(因此,如果有长行,它们将不会被插入)并且没有检查 CSV 文件中的正确列数。尝试更改以下内容:

    <?php
    $servername = "localhost";
    $username = "root";
    $password = "abc";
    $dbname = "project";
    
    $conn = new mysqli($servername, $username, $password, $dbname);
    
    if ($conn->connect_error) {
        die("Connection failed: " . $conn->connect_error);
    } 
    
    if(isset($_POST['submit']))
    {
        $fname = $_FILES['sel_file']['name'];
        echo "Uploaded file name: $fname";
        $chk_ext = explode(".",$fname);
    
        if(strtolower(end($chk_ext)) === "csv") {
            $sql = "TRUNCATE TABLE datapack";
            $conn->query($sql);
            $filename = $_FILES['sel_file']['tmp_name'];
            $handle = fopen($filename, "r");
            $head = fgetcsv($handle);
            $sql= "INSERT INTO datapack (id, nickname, time, msg) VALUES (?, ?, ?, ?)";
            $stmt = $conn->prepare($sql);
    
            while (($data = fgetcsv($handle)) !== FALSE) {
                if (count($data) < 4) {
                    echo "Error, not 4 columns";
                    continue;
                }
                $stmt->bind_param("isss", $data[0], $data[1], $data[2], $data[3]);
                if (!$stmt->execute()) {
                    echo "Error: ". $stmt->error;
                } else {
                    echo "Success!";
                }
            }
        else {
            echo "Invalid File";
        }
    }
    
    ?>
    
    <h1>Import CSV file</h1>
    <form action="" method="post" enctype="multipart/form-data">
        Import File : <input type='file' name='sel_file' size='20'>
        <input type='submit' name='submit' value='submit'>
    </form>
    

    注意默认的 HTML 行为是向自身发布;通过不必要地添加$_SERVER["PHP_SELF"],您将面临脚本注入攻击。

    【讨论】:

      【解决方案2】:

      在小型服务器中执行 1000 次查询可能过于昂贵。

      相反,您可以进行批量插入。

      $sql= "INSERT into datapack(id,nickname,time,msg) values";
      $sqlArray = array();
      while (($data = fgetcsv($handle, 1000, ",")) !== FALSE)
      {
          $sqlArray[] = "('$data[0]','$data[1]','$data[2]','$data[3]')";
      }
      $sql .= " " . implode(", ", $sqlArray);
      
      mysqli_query($conn,$sql);
      echo "Error: ". $conn->error;
      

      不过,在这种情况下,这将是开始使用begin_transaction 的绝佳机会。

      mysqli_begin_transaction

      开始交易。需要 MySQL 5.6 及以上版本,以及 InnoDB 引擎(默认启用)。有关如何的更多详细信息 MySQL 事务工作,请参阅 » http://dev.mysql.com/doc/mysql/en/commit.html.

      【讨论】:

        猜你喜欢
        • 2016-09-04
        • 2011-09-25
        • 1970-01-01
        • 2021-05-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-16
        • 2020-05-01
        相关资源
        最近更新 更多