Php 使用LOAD DATA LOCAL Infle从CSV添加数据库行,并添加每行唯一的字段
我创建了一个查询,从.csv文件中插入数据库行,然后用随机生成的字符串填充一个字段。这是我正在使用的代码:Php 使用LOAD DATA LOCAL Infle从CSV添加数据库行,并添加每行唯一的字段,php,mysql,sql,Php,Mysql,Sql,我创建了一个查询,从.csv文件中插入数据库行,然后用随机生成的字符串填充一个字段。这是我正在使用的代码: $sql = "LOAD DATA LOCAL INFILE '".$_FILES["file"]["tmp_name"]."' INTO TABLE mailinglist FIELDS TERMINATED BY ';' LINES TERMINATED BY '\r' (name, email) SET
$sql = "LOAD DATA LOCAL INFILE '".$_FILES["file"]["tmp_name"]."'
INTO TABLE mailinglist
FIELDS TERMINATED BY ';'
LINES TERMINATED BY '\r'
(name, email)
SET unsubscribe = '".substr(sha1(mt_rand()),0,30)."'";
$db = dbConnection();
$q = $db->prepare($sql);
$q->execute();
我遇到的问题是,unsubscribe字段在每一行中填充相同的随机生成字符串,而它应该为每一新行生成另一个字符串。我怎样才能修复它,使它这样做呢?使用str_random('dddd CC');功能。您可以使用以下功能:
concat(
substring('abcdefghijklmnopqrstuvwxyz0123456789',rand(@seed:=round(rand(LAST_INSERT_ID())*4294967296))*3 6+1, 1),
substring('abcdefghijklmnopqrstuvwxyz0123456789', rand(@seed:=round(rand(@seed)*4294967296))*36+1, 1),
substring('abcdefghijklmnopqrstuvwxyz0123456789', rand(@seed)*36+1, 1)
)
它将生成一个长度为3的随机字符串。只需多次重复使用中间的子字符串即可前进
编辑:
如果您不需要真正的随机性,您可以使用内置函数让mysql代替php来完成这项工作:
$sql = "LOAD DATA LOCAL INFILE '".$_FILES["file"]["tmp_name"]."'
INTO TABLE mailinglist
FIELDS TERMINATED BY ';'
LINES TERMINATED BY '\r'
(name, email)
SET unsubscribe = SUBSTRING(REPLACE(UUID(),"-",""),0,30)";
或者最好是:
SET unsubscribe = UUID()";
@弗兰克卢伊特:欢迎你;请注意,此UUID函数具有随机性,但并非真正的不可预测性;所以我认为你的方案是安全的,但要记住这一点。