gpt4 book ai didi

php - 查询执行时间非常长

转载 作者:行者123 更新时间:2023-12-01 00:22:03 25 4
gpt4 key购买 nike

我正在尝试从 MySQL 数据库中获取学生的所有类(class)。此代码片段仅获取 1 门类(class),但总共有 6 门类(class)(然后需要 15 秒)。我试图通过使用 option 标记中的 selected 属性来显示已经设置的类(class)(如果有的话)。我认为这就是导致查询执行这么长时间的原因。 我的数据库设计有问题吗?如何改进查询?

这是数据库的结构。我创建了一个中间表user_courses:

用户:
用户编号

用户类(class):
用户编号
course_id_1
course_id_2
course_id_3
course_id_4
course_id_5
course_id_6
course_id_7

类(class):
类(class)编号
类(class)名称

<?php
session_start();
$_SESSION['user_id'] = 1;
require ('../mysqli_connect.php');

echo '<table><tr><td><select name="course_id_1">';

// checking if a user has already chosen a 1st course (out of 6)
$query = "SELECT c.course_id
FROM courses AS c
INNER JOIN users_courses AS u
ON c.course_id = u.course_id_1
WHERE u.user_id = {$_SESSION['user_id']}";
$result = mysqli_query($dbc, $query);

// if yes, assign the selected course from the database to a variable
if (mysqli_num_rows($result) == 1) {
$row = mysqli_fetch_array($result, MYSQLI_ASSOC);
$selected_course = $row['course_id'];
}

// fetch courses, and make 'None' the first option in the drop down menu
$query = "SELECT course_id, course_name
FROM courses
ORDER BY (course_name = 'None') DESC, course_name";
$result = mysqli_query($dbc, $query);

// create the drop down menu
while ($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) {
// select default value
if ($selected_course == $row['course_id']) {
$selected =' selected';
} else {
$selected='';
}

echo '<option value="' . $row['course_id'] . '"' . $selected . '>'
. htmlspecialchars($row['course_name']) . '</option>';
}

echo '</select></td></tr>';

mysqli_free_result($result);
mysqli_close($dbc);
?>

最佳答案

你这里有很多问题。

1) 您对表结构的解释不足以诊断一些常见问题,例如缺少索引或您将什么设置为主键。这些选择会对性能产生巨大影响。

2) 你的 users_courses 表是反规范化的;对多对多关系建模的一种更常见的方法是为每个连接表创建一个外键表。在这种情况下,您的表格将如下所示:

USERS_COURSES
-------------
user_id
course_id

然后,拥有 7 门类(class)的用户将在该表中有 7 条记录。如果了解“第一选择”等优先级对您的模型来说真的很重要,您可以使用适当的列扩展连接表。

3) 您的 PHP 代码对 SQL injection attacks 是开放的因为您直接将用户输入插入查询中。您需要解决这个问题并采用始终使用绑定(bind)变量的做法

关于php - 查询执行时间非常长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23016881/

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