【发布时间】:2018-03-08 11:05:02
【问题描述】:
我对编程和尝试设计一个 Web 应用程序非常陌生,该应用程序提供了一个前端来更新在线课程数据库的数据(表格,包括用户、作业、问题、答案等)。通过课程管理系统提交后,所有数据都将进入该数据库。目前正在使用虚拟数据进行开发。
这个想法是允许用户从前端进行更新,而不是从后端自动进行更新(如使用触发器)。这是因为我们的数据集比较小,不熟悉mysql的用户只需要更新的表就可以导出到数据分析程序中。
使用多个连接,我创建了一个用户已经完成的任务列表,如下所示:
+----+---------------+---------------------------------------+
| id | assignment_id | quiz_name |
+----+---------------+---------------------------------------+
| 1 | 2 | Guidance Counselors (Post-Assessment) |
| 2 | 3 | Guidance Counselors (Pre-Assessment) |
| 3 | 4 | Guidance Counselors (Pre-Assessment) |
+----+---------------+---------------------------------------+
在 PHP 中,我编写了一个基本的前端代码,用于在多选下拉列表中显示和更新这些分配,如下所示:
每当用户想要更新列表时,php 都会运行这个 if 语句(与生成上表相同):
//update assignment list when button is clicked
if(isset($_POST['updatelist'])){
//query to update the assignment list
$sql_update = "DELETE FROM assignment_list;";
$sql_update .= "TRUNCATE assignment_list;";
$sql_update .= "INSERT INTO assignment_list....
#values added from joined assignment, quizzes, and user_quizzes tables
SELECT...
INNER JOIN ...
INNER JOIN ...
...
GROUP BY assignment_id";
$update_result = mysqli_multi_query($conn,$sql_update);
//success and error messages here
}
ETA:然后反映在下拉菜单中。然后,此菜单应允许用户选择一个或多个要更新数据的作业,假设是否有新的用户提交和可用于该作业的分数(即每个作业中包含的数据——在结构上它们都是相同的)。
更新列表似乎有效,但我正在努力找出更新我们所谓的“合并数据”表的最佳方法(为每个单独的任务附加“_(assignment_id)”。所以当一个用户选择“更新数据”,上面所选分配的表中的数据应该更新。例如,consolidated_data_4 看起来像这样(为了更好的可读性省略了一些字段):
+------------------+---------+---------------+---------+-----------------------------+----------------------------+--------------------------------------+-----------+
| consolidation_id | user_id | assignment_id | quiz_id | assignment_pass_score_point | assignment_pass_score_perc | quiz_name | answer_id |
+------------------+---------+---------------+---------+-----------------------------+----------------------------+--------------------------------------+-----------+
| 1 | 34 | 4 | 50 | 5.00 | 50.00 | Guidance Counselors (Pre-Assessment) | 175973 |
| 2 | 34 | 4 | 50 | 5.00 | 50.00 | Guidance Counselors (Pre-Assessment) | 175981 |
| 3 | 34 | 4 | 50 | 5.00 | 50.00 | Guidance Counselors (Pre-Assessment) | 175985 |
| 4 | 34 | 4 | 50 | 5.00 | 50.00 | Guidance Counselors (Pre-Assessment) | 175991 |
| 5 | 34 | 4 | 50 | 5.00 | 50.00 | Guidance Counselors (Pre-Assessment) | 175995 |
| 6 | 34 | 4 | 50 | 5.00 | 50.00 | Guidance Counselors (Pre-Assessment) | 175999 |
| 7 | 34 | 4 | 50 | 5.00 | 50.00 | Guidance Counselors (Pre-Assessment) | 176002 |
| 8 | 34 | 4 | 50 | 5.00 | 50.00 | Guidance Counselors (Pre-Assessment) | 176009 |
| 9 | 34 | 4 | 50 | 5.00 | 50.00 | Guidance Counselors (Pre-Assessment) | 176015 |
| 10 | 34 | 4 | 50 | 5.00 | 50.00 | Guidance Counselors (Pre-Assessment) | 176021 |
+------------------+---------+---------------+---------+-----------------------------+----------------------------+--------------------------------------+-----------+
当前每个表都由其分配 ID 标识,例如“consolidated_data_4”是一个表,其中该表中的每条记录的 assignment_id = 4。
我尝试遍历每个表(使用 foreach 循环)并执行与上述分配列表类似的查询,但我收到错误,除非我像这样将查询分开(也被删节):
//for each assignment user selects, start with an empty table and join data from corresponding course database tables
foreach($_POST['selectassign'] as $assignment){
$table = "quiz_data_update_application.consolidated_data_".$assignment;
//query updates consolidated data table(s) for selected assignments
$sql_del = "DELETE FROM $table";
$sql_trunc = "TRUNCATE $table";
//records added from joining tables in course db
$sql_ins = //sql omitted here for brevity
....
$del_sel_res = mysqli_query($conn,$sql_del);
$trunc_sel_res = mysqli_query($conn,$sql_trunc);
$ins_sel_res = mysqli_query($conn,$sql_ins);
}
(这与不起作用的代码之间的唯一区别是查询以与上面第一个 PHP sn-p 相同的方式组合;在这里发布似乎是多余的)。
使用单个查询似乎效率低下,并且会降低应用程序的速度。我想知道是否有比在 PHP 循环中使用表名的一部分作为变量更好的方法来解决这个问题。 (不要看到太多人问这个问题或遍历实际表而不是字段)似乎我遗漏了一些愚蠢的语法错误,或者 mysqli_multiquery() 不能在循环中使用/总体上很差方法?
我工作的一些高层建议:
(1) 创建单独的循环 - 一个基于用户选择的分配临时创建一个新表,另一个通过分配将其拆分为单独的表(他们说这部分是优化数据分析所必需的。 IMO 这使得一切都比拥有一个用于所有任务的大型“主”数据表更具挑战性——事实上我确实成功地做到了——但唉,这就是他们要求完成的方式)。这些表将在更新完成后被删除;
(2) 使用存储过程。这我不太熟悉,也不确定它是如何工作的,但如果它比(1)更可行,我可以进一步研究。
任何其他替代方案,更可行的建议也将不胜感激。我在这方面取得了很大进展,但过去几周一直被困在这里,并没有找到太多在线资源。
对帖子的长度表示歉意。我认为有必要提供更多而不是更少的上下文。
【问题讨论】:
-
如果要使用 truncate 不需要删除
-
multi_query 几乎总是一个坏主意,很难调试
-
你会建议什么替代方案?
-
另外,我不知道为什么会同时使用 delete 和 truncate ;这是由一位比我更熟悉mysql的前同事完成的,所以我认为有一个超出我理解范围的原因并就这样离开了。
-
运行每个查询,检查它是否有效,然后运行下一个查询
标签: php mysql database-design web-applications phpmyadmin