php 读取文件,批量构造sql语句写入数据库
需求读取文件,构造sql,批量写入数据库,批量是构建设置 $num 值的大小进行批量构建sql语句
test.txt 文件内容为
1
2
3
4
5
6
7
8
9
10
<?php
class batchInsertController {
private $num = 3;
private $table = 'test.t';
public function batchInsert()
{
// read file
ini_set('memory_limit', -1);
$fh = fopen("./test.txt", "r");
$i = 0;
while (!feof($fh)) {
$str = fgets($fh);
if (!empty($str)) {
$arr[] = $str;
$i++;
if ($i == $this->num) {
echo $i . PHP_EOL;
// 批量构造sql
$sql = $this->buildSql($arr);
print_r($arr);
//unset($arr); 有bug的地方就是在这里
if (!empty($sql)) {
// 提交sql
echo $sql;
}
$i = 0;
}
}
}
}
protected function buildSql($arr)
{
if (!empty($arr)) {
$sql = "INSERT INTO {$this->table} VALUES ";
foreach ($arr as $key => $value) {
$value = trim($value);
$sql .= "('column1','$value','column3')";
if ($key != count($arr) - 1) {
$sql .= ',';
}
}
}
return $sql;
}
}
$a = new batchInsertController();
$a->batchInsert();
目标实现:
读取文件三行内容构建一条sql语句,然后写入数据库,那么数组的大小应该也应该是3个为一组
执行的结果为:
Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
[4] => 5
[5] => 6
[6] => 7
[7] => 8
[8] => 9
)
数组为什么是这么大呢?不应该是3个一组么,应该每次进来初始化的
<?php
class batchInsertController {
private $num = 3;
private $table = 'test.t';
public function batchInsert()
{
// read file
ini_set('memory_limit', -1);
$fh = fopen("./test.txt", "r");
$i = 0;
while (!feof($fh)) {
$str = fgets($fh);
if (!empty($str)) {
$arr[] = $str;
$i++;
if ($i == $this->num) {
echo $i . PHP_EOL;
// 批量构造sql
$sql = $this->buildSql($arr);
print_r($arr);
//有bug的地方就是在这里
unset($arr);
if (!empty($sql)) {
// 提交sql
echo $sql;
}
$i = 0;
}
}
}
}
protected function buildSql($arr)
{
if (!empty($arr)) {
$sql = "INSERT INTO {$this->table} VALUES ";
foreach ($arr as $key => $value) {
$value = trim($value);
$sql .= "('column1','$value','column3')";
if ($key != count($arr) - 1) {
$sql .= ',';
}
}
}
return $sql;
}
}
$a = new batchInsertController();
$a->batchInsert();
这次就对了,$arr 数组没有被unset 掉,结果一直往数组里面写入元素,这也是会造成内存泄漏的地方
Array
(
[0] => 1
[1] => 2
[2] => 3
)
INSERT INTO test.t VALUES ('column1','1','column3'),('column1','2','column3'),('column1','3','column3')3
Array
(
[0] => 4
[1] => 5
[2] => 6
)
INSERT INTO test.t VALUES ('column1','4','column3'),('column1','5','column3'),('column1','6','column3')3
Array
(
[0] => 7
[1] => 8
[2] => 9
)
INSERT INTO test.t VALUES ('column1','7','column3'),('column1','8','column3'),('column1','9','column3')
这就完了,并没有,文件中是10条记录,你这里只处理了9条,剩下一条不能丢掉呀
最后执行完批量以后,如果$arr 数组中还有元素,将剩余元素也写入到数据库中
<?php
class batchInsertController {
private $num = 3;
private $table = 'test.t';
public function batchInsert()
{
// read file
ini_set('memory_limit', -1);
$fh = fopen("./test.txt", "r");
$i = 0;
while (!feof($fh)) {
$str = fgets($fh);
if (!empty($str)) {
$arr[] = $str;
$i++;
if ($i == $this->num) {
echo $i . PHP_EOL;
// 批量构造sql
$sql = $this->buildSql($arr);
print_r($arr);
// 有bug的地方
unset($arr);
if (!empty($sql)) {
// 提交sql
echo $sql;
}
$i = 0;
}
}
}
if (!empty($arr)) {
$sql = $this->buildSql($arr);
print_r($arr);
unset($arr);
if (!empty($sql)) {
// 提交sql
echo $sql;
}
}
}
protected function buildSql($arr)
{
if (!empty($arr)) {
$sql = "INSERT INTO {$this->table} VALUES ";
foreach ($arr as $key => $value) {
$value = trim($value);
$sql .= "('column1','$value','column3')";
if ($key != count($arr) - 1) {
$sql .= ',';
}
}
}
return $sql;
}
}
$a = new batchInsertController();
$a->batchInsert();
总结:
以前一直觉得php简单,发现自己用php写个小程序bug都很多,原来不是php简单,是用php的人"简单",推而广之,无论你用那种语言,如果不持续学习和主动学习,你还是写不出好的代码(优雅,可扩展,可维护,可读性高)
越来越明白基础扎实是有多么重要了,有扎实的数据结构和算法知识,才能更好更快的解决业务中遇到的问题
写代码前要思考和设计,然后要动手写,写完以后看下有没有可以改进和优化的,这个过程没有捷径,只有不断练习和学习,才能有所长进
php 读取文件,批量构造sql语句写入数据库的更多相关文章
- C# 读取文件中的sql语句 创建数据库以及表结构
大概思路是: 读取文件 根据文件中行内容为GO 作为分割 一条条放到list中 然后在程序中逐条执行sql语句; 值得一提的是 创建数据库的语句是不允许放到程序事务中执行的 所以目前我是分了两个文本 ...
- java实现将资源文件转化成sql语句导入数据库
文档结构
- SQL*PLUS中批量执行SQL语句
SQL*PLUS中批量执行SQL语句 今天由于工作的需要,要在CMD中批量执行大量的SQL语句,对于Oracle学习还处在入门阶段的我,只能硬着头皮到处去寻找资料(主要是网络资料,也包括自己的电子书) ...
- 如何通过SQL语句写入webshell
在web应用场景下,经常会碰到SQL注入场景,如页面能够执行SQL语句,那么可能会有直接通过SQL语句写入webshell的风险,常见的phpmyadmin环境下,通过几个语句可以轻松将一句话木马写入 ...
- 批量生成sql语句,难得
在工作我们常常要批量生成sql文件,因为业务部门经常给我们的是excel文件,根据我的经验,推荐两种批量生成sql文件方式 1.excel批量生成sql ,sql语句如下 INSERT INTO Ta ...
- 带参方法的执行:普通方法的查询,可为空方法的查询。批量处理SQL语句。
普通方法的查询: @Override public List<Map<String, Object>> selectSpentAmount(Integer MAT_TYPE_, ...
- 批量执行sql语句
基本使用 $sqls="sql语句1;sql语句2;sql语句n"; 或 $sqls="insert into xx;"; $sqls.="inse ...
- c#实现用SQL池(多线程),定时批量执行SQL语句 【转】
在实际项目开发中,业务逻辑层的处理速度往往很快,特别是在开发Socket通信服务的时候,网络传输很快,但是一旦加上数据库操作,性能一落千丈,数据库操作的效率往往成为一个系统整体性能的瓶颈.面对这问题, ...
- Mysql 将结果保存到文件 从文件里运行sql语句 记录操作过程(tee 命令的使用)
1. 有时候我们可能须要记录我们对mysql的操作过程,这时我们能够使用mysql的tee命令 1)第一种情况是在链接数据库的时候使用tee >mysql -u root -p --te ...
- PHP mysqli 增强 批量执行sql 语句的实现代码
本篇文章介绍了,在PHP中 mysqli 增强 批量执行sql 语句的实现代码.需要的朋友参考下. mysqli 增强-批量执行sql 语句 <?php //mysqli 增强-批量执行sql ...
随机推荐
- AI与.NET技术实操系列(七):使用Emgu CV进行计算机视觉操作
引言 计算机视觉(Computer Vision, CV)是人工智能领域中最为引人注目的分支之一.从自动驾驶汽车到医疗影像分析,从智能安防系统到虚拟现实体验,计算机视觉的应用无处不在,深刻地改变着我们 ...
- 如何写自己的springboot starter?自动装配原理是什么?
如何写自己的springboot starter?自动装配原理是什么? 官方文档地址:https://docs.spring.io/spring-boot/docs/2.6.13/reference/ ...
- Python 加上颜色进行输出
博客地址:https://www.cnblogs.com/zylyehuo/ print(f"\033[42m文本内容\033[0m")
- SpringBoot前后端接口加解密--解决方案
开放接口 - 通信方式采用HTTP+JSON或消息中间件进行通信. - 调用接口之前需要使用登录鉴权接口获得token. - 当鉴权成功之后才能调用其他接口(携带Token). 登录接口: Code ...
- SpringBoot+Thymeleaf渲染下拉框异常解决
常规方式 <select class="form-control" name="operationType" th:field="${itemT ...
- docker clean images
docker ps | grep portal | awk '{print $2}' | cut -d ":" -f3 used=`docker ps | grep portal ...
- Delphi 多线程使用
1. 定义线程类 type TMyThread = class(TThread) private { Private declarations } fPos:Integer; // 变量 protec ...
- pycharm-pip安装scrapy、pywifi等模块报错解决方法
之前学Python时,使用pycharm安装一些不常用的模块时,报错,安装不成功.找了很多方法,总算好了,总结一下: 一.大部分安装不成功的原因,都是原因pip安装源地址问题. 1.在项目pip.ex ...
- unity手机花屏
关于Camera组件中Clear Flags的理解 - 知乎 (zhihu.com) https://blog.csdn.net/yanchezuo/article/details/77337755 ...
- RocketMQ的Producer是如何发送消息的
RocketMQ 的 Producer 发送消息过程涉及多个步骤,包括初始化.消息创建.发送方式选择 1.Producer初始化 首先,我们需要创建并初始化一个Producer示例 这段代码完成了以下 ...