如何在使用PHP导入CSV之前清除该表?
我不是最熟练的开发人员,但是我和我的朋友组织了一个项目,创建了一个植物自动浇水系统。我的职责是让网站正常工作并显示系统创建的统计数据 在从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>
<!-- 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文件