查看: 122|回复: 1

php插入数据的方法

[复制链接]

3

主题

7

帖子

13

积分

新手上路

Rank: 1

积分
13
发表于 2022-12-21 16:40:43 | 显示全部楼层 |阅读模式
插入数据库的两种方法


  • 创建数据表
CREATE TABLE `area` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `pid` int DEFAULT NULL COMMENT '父id',
  `shortname` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '简称',
  `name` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '名称',
  `mergename` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '全称',
  `level` tinyint DEFAULT NULL COMMENT '层级:1=省,2=市,3=区/县',
  `pinyin` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '拼音',
  `code` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '长途区号',
  `zip` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '邮编',
  `first` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '首字母',
  `lng` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '经度',
  `lat` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '纬度',
  PRIMARY KEY (`id`),
  KEY `pid` (`pid`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='地区表';


  • 通过insert语句进行数据插入 我们正常一条两条的数据是通过insert插入这样也是简单快捷,但是如果遇到大量数据需要进行插入时,insert的速度会慢不少
INSERT INTO `area` (`id`, `pid`, `shortname`, `name`, `mergename`, `level`, `pinyin`, `code`, `zip`, `first`, `lng`, `lat`) VALUES (1, 0, '北京', '北京', '中国,北京', 1, 'beijing', '', '', 'B', '116.405285', '39.904989');
INSERT INTO `area` (`id`, `pid`, `shortname`, `name`, `mergename`, `level`, `pinyin`, `code`, `zip`, `first`, `lng`, `lat`) VALUES (2, 1, '北京', '北京市', '中国,北京,北京市', 2, 'beijing', '010', '100000', 'B', '116.405285', '39.904989');

  • 通过load data local infile加载
官方文档 https://dev.mysql.com/doc/refman/5.7/en/load-data.html 总结下来就是以下语句
$fileName = 文件名,需要有权限加载到
$tableName = 表名
$flag = 文件中,每个值之间分分隔符
'\n' 换行符
$keysStr = 数据库中表字段需要和插入得数据一一对应
如果指定了REPLACE,主键冲突时,新插入的行会替代原有行

"load data concurrent infile '{$fileName}' REPLACE into table {$tableName} FIELDS TERMINATED BY '" . $flag . "' lines  terminated by '\n' ({$keysStr});"
PHP代码如下(此处使用了TP框架)
$params['type'] = Env::get('database.type', 'mysql');
$params['hostname'] = Env::get('database.hostname', '');
$params['database'] = Env::get('database.database', '');
$params['username'] = Env::get('database.rootuser', 'root');
$params['password'] = Env::get('database.rootpass', '123456');
$params['hostport'] = Env::get('database.hostport', '');
$params['prefix'] = Env::get('database.prefix', '');
$params['params'] = [\PDO::ATTR_CASE => \PDO::CASE_LOWER, \PDO::ATTR_EMULATE_PREPARES => true, \PDO::MYSQL_ATTR_LOCAL_INFILE => true];
$re = Db::connect($params)->execute($executeSql);
执行



  • 有可能出现的错误
出现报错
SQLSTATE[HY000]: General error: 1290 The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
解决方法
在数据库得配置文件中找到[mysqld] 添加secure_file_priv = ''


重启数据库即可
回复

使用道具 举报

1

主题

12

帖子

18

积分

新手上路

Rank: 1

积分
18
发表于 前天 20:58 | 显示全部楼层
珍爱生命,果断回帖。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表