将电子表格上传到数据库
尽管 PHP 没有任何直接读取特定电子表格格式的能力(如 XLSX、ODS 等),但它有读取(CSV 逗号分隔值)文件的能力,因此,为了处理客户的电子表格,需要要求他们提供 CSV 格式的文件,或者需要自己进行转换。
准备...
当要把电子表格(即CSV文件)上传到数据库中时,有三个主要的考虑因素:
迭代一个(潜在的)庞大的文件
将每个电子表格的行提取到一个PHP数组中
在数据库中插入PHP数组
大规模的文件迭代使用前面的示例来处理,我们使用 fgetcsv() 函数将CSV行转换为PHP数组。最后,我们使用(PDO PHP Data Objects)类建立数据库连接并进行插入。
如何做...
1.首先,我们定义一个 Application\Database\Connection 类,该类根据提供给构造函数的一组参数创建一个 PDO 实例。
<?php
namespace Application\Database;
use Exception;
use PDO;
class Connection
{
const ERROR_UNABLE = 'ERROR: Unable to create database connection';
public $pdo;
public function __construct(array $config)
{
if (!isset($config['driver'])) {
$message = __METHOD__ . ' : ' . self::ERROR_UNABLE . PHP_EOL;
throw new Exception($message);
}
$dsn = $config['driver']
. ':host=' . $config['host']
. ';dbname=' . $config['dbname'];
try {
$this->pdo = new PDO($dsn,
$config['user'],
$config['password'],
[PDO::ATTR_ERRMODE => $config['errmode']]);
} catch (PDOException $e) {
error_log($e->getMessage());
}
}
}2.然后,我们加入一个 Application\Iterator\LargeFile 的实例。我们在这个类中添加了一个新的方法,这个方法被设计用来迭代 CSV 文件:
3.我们还需要将 Csv 添加到允许的迭代器方法列表中:
如何运行...
首先我们定义一个配置文件, /path/to/source/config/db.config.php ,其中包含数据库连接参数:
接下来,我们利用第一章 《建立基础》 中定义的自动加载类,获得 Application\Database\DatabaseConnection 和 Application\Iterator\LargeFile 的实例,定义一个调用程序,chap_02_uploading_csv_to_database.php 。
之后,我们设置了一个 try {...} catch () {...} 块,它可以捕获 Throwable 。这样我们就可以同时捕获异常和错误:
在 try {...} catch () {...} 块里面,我们得到一个连接和大文件迭代器类的实例:
然后我们利用PDO的 prepare/execute 功能。准备语句 SQL 中的 ? 表示参数标记,参数在SQL执行时会被替换:
然后我们使用 foreach() 来循环执行文件迭代器。每一条 yield 语句都会产生一个代表数据库中一行值的数组。然后,我们可以使用这些值与 PDOStatement::execute() 来执行准备好的语句,将该行的值插入到数据库中。
然后可以检查数据库,以验证数据是否已成功插入。
最后更新于