gpt4 book ai didi

php - 可以使用包含变量的表名遍历 mySQL(使用 PHP)中的表吗?

转载 作者:行者123 更新时间:2023-11-29 18:22:42 25 4
gpt4 key购买 nike

我对编程和尝试设计一个 Web 应用程序很陌生,它提供了一个前端来更新在线类(class)数据库的数据(表格,包括用户、作业、问题、答案等)。通过类(class)管理系统提交后,所有数据都将进入该数据库。目前正在使用虚拟数据进行开发。

这个想法是允许用户从前端进行更新,而不是从后端自动进行更新(如使用触发器)。这是因为我们的数据集比较小,只需要为不熟悉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 中,我编写了一个基本前端,用于在多选下拉列表中显示和更新这些分配,如下所示:

Assignment list table

每当用户想要更新列表时,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:然后反射(reflect)在下拉菜单中。然后,此菜单应允许用户选择一个或多个要更新数据的作业,假设是否有新的用户提交和可用于该作业的分数(即每个作业中包含的数据——在结构上它们都是相同的)。

更新列表似乎有效,但我正在努力找出更新我们所谓的“合并数据”表的最佳方法(为每个单独的分配附加“_(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 片段相同的方式组合;这似乎是多余的,在这里发布)。

使用单个查询似乎效率低下,并且会减慢应用程序的速度。我想知道是否有比在 PHP 循环中使用表名的一部分作为变量更好的方法来解决这个问题。 (不要看到太多人问这个问题或遍历实际表而不是字段)似乎我遗漏了一些愚蠢的语法错误,或者 mysqli_multiquery() 不能在循环中使用/总体上很差方法?

我工作的一些高层建议:

(1)创建单独的循环 - 一个基于用户选择的分配临时创建一个新表,另一个通过分配将其拆分为单独的表(他们说这部分是优化数据分析所必需的。IMO 这使得一切都比拥有一个用于所有作业的大型“主”数据表更具挑战性——事实上我确实做到了——但唉,这就是他们要求完成的方式)。这些表将在更新完成后被删除;

(2) 使用存储过程。这我不太熟悉,也不确定它是如何工作的,但如果它比(1)更可行,我可以更多地研究它。

任何其他替代方案,更可行的建议也将不胜感激。我在这方面取得了很大进展,但过去几周一直被困在这里,并没有找到太多在线资源。

为帖子的长度道歉。我认为有必要提供更多而不是更少的上下文。

最佳答案

单一查询是要走的路。不存在感知到的低效率——操作比 mysqli_query 更昂贵。 .

如果您有成千上万的表可以使用,那么我质疑拥有多个相似表的智慧。相反,有一个额外的列来指示涉及的内容。
DELETE (所有表格)和TRUNCATE具有几乎相同的效果;没有必要两者都做。 TRUNCATE是比较快的。

从表中删除一个索引行比截断+插入要快得多。

此外,将删除批处理到单个 SQL 语句中甚至更快。一次批量插入多行也是如此。这很容易快 10 倍。

关于php - 可以使用包含变量的表名遍历 mySQL(使用 PHP)中的表吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46439744/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com