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 ...
随机推荐
- 基于pandas的数据清洗 -- 异常值的清洗
博客地址:https://www.cnblogs.com/zylyehuo/ 开发环境 anaconda 集成环境:集成好了数据分析和机器学习中所需要的全部环境 安装目录不可以有中文和特殊符号 jup ...
- linux怎么关闭selinux
关闭方法:1.临时关闭,只需执行"setenforce 0"命令即可.2.永久关闭,需要执行"vi /etc/selinux/config"命令打开config ...
- linux服务器通过X11实现图形化界面显示 1 背景描述
有些LINUX服务器出于性能和效率的考虑,通常都是没有安装图形化界面的,那么图形化程序在服务器上压根儿就跑不起来,或者无法直接显示出来,这就很尴尬了!那么如何解决这个问题呢?可以基于X11 Forwa ...
- Linux性能分析-平均负载
平均负载的理解 一般系统变慢时,我们会使用top或uptime命令来查看下系统的负载情况 [root@localhost shell]# uptime 13:51:08 up 5 days, 21:5 ...
- 【Git】基本操作
一.Git 基础 1.Git 介绍 Git 是目前世界上最先进的分布式版本控制系统. 版本控制系统: 设计师在设计的时候做了很多版本 经过了数天去问设计师每个版本都改了些啥,设计师此时可能就说不上来了 ...
- Oracle return exit continue
常在循环体中看到下面3种语句: return exit continue 举例说明 啥都没有 -- none begin for i in 1 .. 10 loop if i < 5 then ...
- Spring Bean的声明方式
一.环境说明 项目结构 StudentService package com.cookie.service; /** * @author cxq * @version 1.0 * @date 2020 ...
- 改进NeteaseCloudMusicGtk4:添加移除歌曲按钮
之前已经发了一篇博客简述了如何阅读这个项目,尽管这个项目已经开源很久了,但我找了很久都没有找到怎么从播放列表移除歌曲,那就自己动手实现,再提个 PR 吧. 运行起来应用后通过 Inspector(Ct ...
- 【笔记】用伽马函数证明标准正态分布EX4的值为3
2020-11-13 看了博客标准正态分布的E(X^4)积分求解的极坐标变换证明方法,已经叹服不已,然后看了底下老哥的评论,用伽马函数可以口算出来,遂去查了一下,真香!发篇博客记录一下. 现在的问题, ...
- rust引入含有openssl相关包报错(openssl未找到和编译运行报错等相关问题)解决方案
1. 问题描述 某天在我的rust程序里引入了actix-proxy = "0.2"这个包,我的程序编译通不过了,rust-analyser也罢工了,错误也提示不出来了,查看错误提 ...