2011-10-13 3 views
0

드롭 다운 목록을 사용하여 쿼리 결과를 정렬하려고합니다. 드롭 다운 목록에서 어떤 옵션이 선택 되든 쿼리는 선택한 옵션에 따라 오름차순으로 정렬됩니다. 내 쿼리가 잘 작동, 그냥 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> 

답변

0
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"; 

당신이 시도하고 단지 직접 형태로 적절한 name="" 값으로, 쿼리에 $_POST['order']를 삽입하지만 ... NOT DO 유혹 할 수있다. Little Bobby Tables은 방문을 위해 들러 떠나지 않을 것입니다.

1

음, ORDER BY 절은 WHERE 절 이후에 간다 : 아래

코드인가? 현재 코드를 사용하여 가장 쉬운 방법은 switch을 사용하여 변수 값을 설정하고 $orderbyclause라고 말한 다음 해당 변수를 쿼리 끝에 추가하는 것입니다. ( default의 경우 switch$orderbyclause을 빈 문자열로 설정해야합니다.)

또한 SQL 삽입에 대해 읽고 보호하는 방법을 알아보십시오. 게시 한 코드에는 큰 보안 허점이 있습니다.

관련 문제