我有一个代码点火器控制器读取上传的记录文件(excel, csv, tsv, xml等),并将每一行作为记录写入数据库。作为文件第一列的记录ID应该是唯一的。如果它已经存在于数据库中,那么在读取文件时,我应该抛出一个警报,并根据用户的响应,我将覆盖或跳过该记录并继续处理其他记录。
但是,一旦我抛出警报并到达视图,我就失去了对控制器的控制,我不知道要保持文件指针的滴答声,以便在收到用户的响应后继续读取。
是否有解决这个问题的方法,或者我们是否有其他替代方法?
假设我有一个这样的文件:
Roll, Name, Age, Subject
1, Praveen, 25, Cloud Computing
2, Sri Ram, 25, Cloud Computing
3, Dhiwa, 23, Computer Science
4, Vennila, 25, Cloud Computing
5, Arun, 22, Computer Science
作为一个CSV文件,我将使用PHP的内置函数str_getcsv
来读取它,如下所示:
$csv = array_map('str_getcsv', file('data.csv'));
我将通过解析数组的第一个值来获取记录Roll的集合,这是一个唯一条目的集合,因此我将得到如下内容:
Array (
1,
2,
3,
4,
5
)
最后我假设数据库已经有一个类似的结构,如:
+--------+------+-----+---------+
| UserId | Name | Age | Subject |
+--------+------+-----+---------+
因此,现在我将使用SQL的GROUP_CONCAT
函数将所有UserId
组合在一起,并获得如下方式:
$UserIdsFromDB = get_first_row_value("SELECT GROUP_CONCAT(`UserId`) FROM `Users`");
我将得到解析它作为一个数组,并有$UserIdsFromDB
这样的结果:
Array (
5,
17,
22,
23,
55,
56
57
)
我可以很容易地使用PHP的内置函数array_intersect
来查找那些重复的值,这给了我:
Array (
5
)
和使用一个简单的AJAX调用,我会问我是否需要替换5
用户或所有的用户,这样:
get_user_name(5) // Gets the name of the user with ID 5.
count($Array_Intersect_Result) // Gets the number of matching users.
我希望这能使你达到一定程度的理解。