php - Query takes extremely too long to execute -
i'm trying fetch courses student has mysql database. snippet fetches 1 course, there 6 in total (and takes 15 seconds). i'm trying display course has been set (if any) using selected
attribute in option
tag. think causes query execute long.
wrong database design? how improve query?
this database's structure. created intermediary table user_courses:
users:
user_id
users_courses:
user_id
course_id_1
course_id_2
course_id_3
course_id_4
course_id_5
course_id_6
course_id_7
courses:
course_id
course_name
<?php session_start(); $_session['user_id'] = 1; require ('../mysqli_connect.php'); echo '<table><tr><td><select name="course_id_1">'; // checking if user has chosen 1st course (out of 6) $query = "select c.course_id courses c inner join users_courses u on c.course_id = u.course_id_1 u.user_id = {$_session['user_id']}"; $result = mysqli_query($dbc, $query); // if yes, assign selected course database variable if (mysqli_num_rows($result) == 1) { $row = mysqli_fetch_array($result, mysqli_assoc); $selected_course = $row['course_id']; } // fetch courses, , make 'none' first option in drop down menu $query = "select course_id, course_name courses order (course_name = 'none') desc, course_name"; $result = mysqli_query($dbc, $query); // create 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); ?>
you have number of problems here.
1) explanation of table structure isn't sufficient diagnose common problems missing indexes, or you've established primary key. choices can have dramatic impacts on performance.
2) users_courses
table denormalized; more common way model many-to-many relationships have table 1 foreign key each of joined tables. in case, table like:
users_courses ------------- user_id course_id
and user 7 courses have 7 records in table. if it's important model know priorities "first choice", extend join table appropriate column.
3) php code wide open sql injection attacks because you're directly interpolating user input query. need fix , adopt practice of using bind variables
Comments
Post a Comment