我正在网站上工作,希望管理员能够上传一个包含员工ID和姓名的.txt文件。我需要解析.txt文件并将信息插入数据库,但我在解析时不断收到错误。
我尝试遵循PHP - parsing a txt file的格式,但在我的第一个$ row explode()之后,我开始收到几个非法或未定义的偏移错误。
.txt:
186298 "Cushing,Kathy N"
167876 "Roberts,Joseph Allen"
109876 "Smith,Sarah Quinn"
118679 "Hernandez,Juan"
187568 "Freeman,Colby Matthew"
.php功能:
function updateMemberList()
{
global $db_handle;
$tmpName = $_SESSION['filename'];
//$include_once ($_SERVER['DOCUMENT_ROOT'] . "../../uploads/updates/'$tmpName'");
$txt_file = file_get_contents("../../uploads/updates/$tmpName");
$rows = explode("\n", $txt_file);
foreach($rows as $row => $data)
{
//Splits data into employee ID and full name
$row_data = explode(' ', $data);
$info[$row]['empid'] = $row_data[0];
$info[$row]['name'] = $row_data[1]; //AFTER this line is where I start having errors
//Splits name into last name and first name
$row_name = explode(',', $info[$row]['name']);
$info[$row_name]['lname'] = $row_name[0];
$info[$row_name]['fname'] = $row_name[1];
//Cleans " off last name
$row_lname = explode('"', $info[$row_name]['lname']);
$info[$row_lname]['lname'] = $row_lname[1];
//Cleans middle name and " off first name
$row_fname1 = explode(' ', $info[$row]['fname']);
$info[$row]['fname'] = $row_fname1[0];
$row_fname2 = explode('"', $info[$row]['fname']);
$info[$row]['fname'] = $row_fname2[0];
//Declares variables
$uname = $info[row]['fname'] + "." + $info[$row]['lname'];
$fname = $info[row]['fname'];
$lname = $info[$row]['lname'];
$empid = $info[$row]['empid'];
//Checks to see if user is already in db
$query = ("SELECT * FROM user WHERE username = '$uname'");
$check = mysqli_query($db_handle, $query);
$num_rows = $check->num_rows;
//If user isn't in db, generates a password and adds them
if ($num_rows < 1)
{
//Generates random 8 character password
$length = 8;
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$charactersLength = strlen($characters);
for ($i = 0; $i < $length; $i++)
{
$randomString[$i] = $characters[rand(0, $charactersLength - 1)];
}
$temppass = implode($randomString);
$pword = password_hash($temppass, PASSWORD_DEFAULT);
$addto = "INSERT INTO `user`(`username`, `first_name`, `last_name`, `employee_id`, `password_hash`, `isActive`, `firstLogin`) VALUES ('$uname', '$fname', '$lname', '$empid', '$pword', 1, 1)";
mysqli_query($db_handle, $addto);
}
}
}
有没有办法在选项卡之后进行解析,这样可以更简单地获取名字和姓名而不会对我大喊大叫?
编辑:通过交换为.csv代替.txt来解决问题
答案 0 :(得分:3)
使用正则表达式使它更简单,你也不需要爆炸('\ n')只是file()函数
foreach($rows as $row => $data) {
$matches = array();
preg_match('#([0-9]+).*? "([^""]+?)"#', $data, $matches);
echo $matches[1]; //id
echo $matches[2]; //name
}
你也可以改变
$txt_file = file_get_contents("../../uploads/updates/$tmpName");
$rows = explode("\n", $txt_file);
到
$rows = file("../../uploads/updates/$tmpName");
Morover,生成随机8长度字符串使用
$temppass = bin2hex(openssl_random_pseudo_bytes(4));
它更安全。
答案 1 :(得分:0)
试试这个。 while循环的第一行:
//Splits data into employee ID and full name
$row_data = array_map("trim", array_filter(explode('"', $data)));
$names = explode(",", $row_data[1]);
$result = array(
"id" => $row_data[0],
"forname" => $names[1],
"surname" => $names[0],
);
$ result应如下所示:
Array
(
[id] => 186298
[forname] => Kathy N
[surname] => Cushing
)
希望这有用。
答案 2 :(得分:0)
https://stackoverflow.com/users/1552594/mike-miller的后续建议,并从.txt到.csv文件交换。这使得一切都更容易贯穿并解决了所有错误。
答案 3 :(得分:-1)
你需要爆炸2个空格:
$row_data = explode(' ', $data);