PHP parses .txt
I am working on a website and want admins to be able to upload a .txt file with employee ID and names. I need a .txt file to parse and insert information into the database, but I keep getting errors while parsing.
I tried following the PHP format - parsing the txt file , but after my first $ row explode (), I started getting a few illegal or undefined offset errors.
.txt:
186298 "Cushing,Kathy N"
167876 "Roberts,Joseph Allen"
109876 "Smith,Sarah Quinn"
118679 "Hernandez,Juan"
187568 "Freeman,Colby Matthew"
Php function:
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);
}
}
}
Is there a way to parse after the tab that would be easier to grab the first and last name and not yell at me?
EDIT: Solved problems by replacing with .csv instead of .txt
source to share
Follow the advice at https://stackoverflow.com/users/1552594/mike-miller and replace them from .txt with a CSV file. This made it much easier to follow through and fix all errors.
source to share
Use regex, it simplifies and you don't need to blow up ('\ n') just the file () function
foreach($rows as $row => $data) {
$matches = array();
preg_match('#([0-9]+).*? "([^""]+?)"#', $data, $matches);
echo $matches[1]; //id
echo $matches[2]; //name
}
also you can change
$txt_file = file_get_contents("../../uploads/updates/$tmpName");
$rows = explode("\n", $txt_file);
to
$rows = file("../../uploads/updates/$tmpName");
Morover to generate random string length
$temppass = bin2hex(openssl_random_pseudo_bytes(4));
it is much safer.
source to share
Try it. The first line of the while loop:
//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],
);
And the result should look like this:
Array
(
[id] => 186298
[forname] => Kathy N
[surname] => Cushing
)
Hope this is helpful.
source to share