如何在使用PHP导入CSV之前清除该表?

如何在使用PHP导入CSV之前清除该表?,php,mysql,arrays,import-from-csv,Php,Mysql,Arrays,Import From Csv,我不是最熟练的开发人员,但是我和我的朋友组织了一个项目,创建了一个植物自动浇水系统。我的职责是让网站正常工作并显示系统创建的统计数据 在从CSV文件添加新数据之前,如何让代码清除表? 以下是索引页面上显示的代码: <!-- Importing the CSV --> <div id="wrap"> <h2 class='sub-header'>Upload .csv to refresh data</h2>

我不是最熟练的开发人员,但是我和我的朋友组织了一个项目,创建了一个植物自动浇水系统。我的职责是让网站正常工作并显示系统创建的统计数据

在从CSV文件添加新数据之前,如何让代码清除表?

以下是索引页面上显示的代码:

<!-- Importing the CSV -->

        <div id="wrap">
        <h2 class='sub-header'>Upload .csv to refresh data</h2>
          <?php
            include("csv.php");
            $csv = new csv();
            if ( isset($_POST['sub'])) {
              $csv->import($_FILES['file']['tmp_name']);
            }
          ?>

          <form method="post" enctype="multipart/form-data">
            <input type="file" name="file" class="btn btn-info"><br>
            <input type="submit" name="sub" value="Import" class="btn btn-success"> 
          </form>
        </div>
      </div>
    </div>

上载.csv以刷新数据

以下是PHP文件:

<?php
class csv extends mysqli
{
    private $state_csv = false;
    public function __construct()
    {
        parent::__construct("localhost","root","raspberry","statistics");
        if ($this->connect_error) {
            echo "Failed to connect to the database: ". $this->connect_error;
        }
    }
    public function import($file)
    {
        $file = fopen($file, 'r');
        while ($row = fgetcsv($file)) {
            $value = "'". implode("','", $row) ."'";
            $q = "INSERT INTO data(moisture_of_soil,temperature,humidity,light_levels,last_updated) VALUES(". $value .")";
            if ( $this->query($q) ) {
                $this->state_csv = true;
            }else {
                $this->state_csv = false;
            }
        }
        if ($this->state_csv) {
            echo "<meta http-equiv='refresh' content='0'>";
        } else {
            echo "Something went wrong.";
        }
    }
}
?>

截断名称
非常快速有效,但会重置所有
自动增量
值。如果有其他表通过这些标识符引用该表,这可能会有问题,它可能会将数据链接到随机位置

DELETE FROM name
将删除所有内容,但不会重置
AUTO_INCREMENT
计数器。它的速度往往较慢,特别是在有大量争用的大型表上,但它的优点是不回收标识符


您需要确定这两个选项中的哪一个适合您的特定用例。对于没有交叉引用的表,
TRUNCATE
通常效果最好。

TRUNCATE name
非常快速有效,但会重置所有
自动增量值。如果有其他表通过这些标识符引用该表,这可能会有问题,它可能会将数据链接到随机位置

DELETE FROM name
将删除所有内容,但不会重置
AUTO_INCREMENT
计数器。它的速度往往较慢,特别是在有大量争用的大型表上,但它的优点是不回收标识符


您需要确定这两个选项中的哪一个适合您的特定用例。对于一个没有交叉引用的表,
TRUNCATE
通常效果最好。

这更多的是@tadman已经正确答案的补充,但是注释太长了

性能上的差异在于
TRUNCATE
或多或少只是删除表的数据文件并生成一个新的空文件,这是一个大的、相当连续的IO操作,您的操作系统可以非常高效地处理

另一方面,一系列的
DELETE
语句是许多微小的IO操作,它们会使磁盘陷入困境,也不会恢复备份数据文件中的任何空间

如果您必须执行
DELETE
路径,我强烈建议将所有删除都包含在事务中,这将有助于在一定程度上优化IO。然后,一旦导入了所有数据(也应该在事务中,最好是同一个事务中),就可以运行
优化表
操作,从备份数据文件中恢复任何未使用的磁盘空间,前提是数据大小存在足够大的差异

第三种选择:

  • 添加一个基本上是上次更新的字段
  • 启动事务
  • SET@start=NOW()
  • 循环:
    插入到表中。。。关于重复密钥更新
  • 从上次更新的表中删除<@start
  • COMMIT
  • 作为奖励,如果您使用这样的事务,那么您的应用程序将不会有“坏”或丢失数据集的时间点

    参考文献:


    这更多的是对@tadman已经正确答案的补充,但形式太长,无法发表评论

    性能上的差异在于
    TRUNCATE
    或多或少只是删除表的数据文件并生成一个新的空文件,这是一个大的、相当连续的IO操作,您的操作系统可以非常高效地处理

    另一方面,一系列的
    DELETE
    语句是许多微小的IO操作,它们会使磁盘陷入困境,也不会恢复备份数据文件中的任何空间

    如果您必须执行
    DELETE
    路径,我强烈建议将所有删除都包含在事务中,这将有助于在一定程度上优化IO。然后,一旦导入了所有数据(也应该在事务中,最好是同一个事务中),就可以运行
    优化表
    操作,从备份数据文件中恢复任何未使用的磁盘空间,前提是数据大小存在足够大的差异

    第三种选择:

  • 添加一个基本上是上次更新的字段
  • 启动事务
  • SET@start=NOW()
  • 循环:
    插入到表中。。。关于重复密钥更新
  • 从上次更新的表中删除<@start
  • COMMIT
  • 作为奖励,如果您使用这样的事务,那么您的应用程序将不会有“坏”或丢失数据集的时间点

    参考文献:

      • 我更喜欢这种方式:

        CREATE TABLE new LIKE real;   (or spell out the schema)
        LOAD DATA .. INTO new ...;
        RENAME TABLE real TO old, new TO real;
        DROP TABLE old;
        
        唯一慢的部分是
        加载

        重命名是原子的。
        real
        始终可用(无停机)

        我更喜欢这种方式:

        CREATE TABLE new LIKE real;   (or spell out the schema)
        LOAD DATA .. INTO new ...;
        RENAME TABLE real TO old, new TO real;
        DROP TABLE old;
        
        唯一慢的部分是
        加载

        重命名是原子的。

        real
        始终可用(无停机)

        TRUNCATE tablename
        DELETE FROM tablename
        。感谢您的快速回复。警告:使用
        mysqli
        时,您应该使用和将用户数据添加到查询中。不要使用字符串插值或串联来完成此操作,因为您已经创建了严重的错误。切勿将
        $\u POST
        $\u GET
        或任何用户数据直接放入查询中,如果有人试图利用您的错误,这可能非常有害。请记住,MySQL可以使用
        加载数据填充直接读取CSV文件