#php #mysql
#php #mysql
Вопрос:
Я хочу использовать выпадающий список для упорядочения результата запроса. Какой бы вариант ни был выбран в выпадающем списке, запрос будет упорядочен в порядке возрастания по выбранному варианту. Мой запрос работает нормально, мне просто нужно включить предложение ORDER BY . Пожалуйста, внимательно посмотрите на форму и, пожалуйста, помогите мне в этой проблеме.
Ниже приведен код:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Exam Interface</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<form action="exam_interface.php" method="post" name="sessionform"> <!-- This will post the form to its own page"-->
<p>Session ID: <input type="text" name="sessionid" /></p> <!-- Enter Session Id here-->
<p>Module Number: <input type="text" name="moduleid" /></p> <!-- Enter Module Id here-->
<p>Teacher Username: <input type="text" name="teacherid" /></p> <!-- Enter Teacher here-->
<p>Student Username: <input type="text" name="studentid" /></p> <!-- Enter User Id here-->
<p>Grade: <input type="text" name="grade" /></p> <!-- Enter Grade here-->
<p>Order Results By: <select name="order">
<option name="noorder">Don't Order Results</option>
<option name="ordersessionid">Session ID</option>
<option name="ordermoduleid">Module Number</option>
<option name="orderteacherid">Teacher Username</option>
<option name="orderstudentid">Student Username</option>
<option name="ordergrade">Grade</option>
</select>
<p><input type="submit" value="Submit" /></p>
</form>
<?php
$username="xxx";
$password="xxx";
$database="mobile_app";
mysql_connect('localhost',$username,$password);
@mysql_select_db($database) or die("Unable to select database");
$sessionid = $_POST['sessionid'];
$moduleid = $_POST['moduleid'];
$teacherid = $_POST['teacherid'];
$studentid = $_POST['studentid'];
$grade = $_POST['grade'];
$result = mysql_query("SELECT * FROM Module m INNER JOIN Session s ON m.ModuleId = s.ModuleId JOIN Grade_Report gr ON s.SessionId = gr.SessionId JOIN Student st ON gr.StudentId = st.StudentId WHERE ('$sessionid' = '' OR gr.SessionId = '$sessionid') AND ('$moduleid' = '' OR m.ModuleId = '$moduleid') AND ('$teacherid' = '' OR s.TeacherId = '$teacherid') AND ('$studentid' = '' OR gr.StudentId = '$studentid') AND ('$grade' = '' OR gr.Grade = '$grade')");
$num=mysql_numrows($result);
echo "<table border='1'>
<tr>
<th>Student Id</th>
<th>Forename</th>
<th>Session Id</th>
<th>Grade</th>
<th>Mark</th>
<th>Module</th>
<th>Teacher</th>
</tr>";
while ($row = mysql_fetch_array($result)){
echo "<tr>";
echo "<td>" . $row['StudentId'] . "</td>";
echo "<td>" . $row['Forename'] . "</td>";
echo "<td>" . $row['SessionId'] . "</td>";
echo "<td>" . $row['Grade'] . "</td>";
echo "<td>" . $row['Mark'] . "</td>";
echo "<td>" . $row['ModuleName'] . "</td>";
echo "<td>" . $row['TeacherId'] . "</td>";
echo "</tr>";
}
echo "</table>";
mysql_close();
?>
</body>
</html>
Ответ №1:
Ну, ORDER BY
предложение идет после WHERE
предложения, так что вам просто нужно добавить его туда, верно? Я полагаю, что самый простой способ сделать это с учетом вашего текущего кода — использовать a switch
для установки значения переменной, $orderbyclause
скажем, и добавления этой переменной в конец запроса. ( default
Регистр вашего switch
должен быть установлен $orderbyclause
в пустую строку.)
Кроме того, пожалуйста, прочитайте о SQL-инъекции и узнайте, как защититься от нее. Опубликованный вами код имеет большие дыры в безопасности.
Ответ №2:
switch ($_POST['order') {
case 'ordersessionid': $order_field = 'gr.SessionID'; break;
case 'ordermoduleid': $order_field = 'whatever'; break;
...
default: $order_field = 'default_field'; break;
}
$sql = "SELECT .... ORDER BY {$order_field} ASC";
У вас может возникнуть соблазн попробовать и просто напрямую вставить $_POST['order']
в запрос соответствующие name=""
значения в форме, но… НЕ ДЕЛАЙТЕ ЭТОГО. Маленькие таблицы Бобби зайдут в гости и никогда не уйдут.