更新:
我輸入course查詢是正常的
但是我輸入teacher或semaster查詢出來的結果
顯示出來是我的class資料全部的資料項目,而不是我要的條件式查詢的資料
我現在的問題點在於:
輸入course查詢是正常的
但是我輸入teacher或semaster查詢出來的卻是class資料表全部的資料
大家好:
我撰寫了一個課程資訊搜尋程式,
前端網站有
course,teacher,semaster三個input輸入框,
輸入條件後,傳送給後端程式search.php做判斷查詢的動作
我的course輸入框可以輸入後傳送字串給後端程式search.php做判斷查詢的動作
但是為什麼teacher,semaster輸入框的字串無法傳送字串給後端程式search.php做判斷查詢的動作?
後端search.php
<?php
require_once './mysql.inc.php';
function search(){
$response = openDB();
if($response['status']==200) {
$conn=$response['result'];
if(isset($_POST['course'])) {
$course=$_POST['course'];
$sql = "SELECT * FROM `class` WHERE `course` LIKE '%".$course."%'";
$stmt = $conn->prepare($sql);
$result = $stmt->execute();
}
elseif(isset($_POST['teacher'])){
$teacher=$_POST['teacher'];
$sql = "SELECT * FROM `class` WHERE `teacher` LIKE '%".$teacher."%'";
$stmt = $conn->prepare($sql);
$result = $stmt->execute();
}
elseif(isset($_POST['semaster'])){
$semaster=$_POST["semaster"];
$sql = "SELECT * FROM `class` WHERE `semaster` LIKE '%".$semaster."%'";
$stmt = $conn->prepare($sql);
$result = $stmt->execute();
}
else{
$sql = "SELECT * FROM `class`";
$stmt = $conn->prepare($sql);
$result = $stmt->execute();
}
if($result) {
$ans = $stmt->fetchAll(PDO::FETCH_ASSOC);
$response['status'] = 200;
$response['message'] = "查詢成功";
$response['result'] = $ans;
}
else {
$response['status'] = 500;
$response['message'] = "查詢失敗";
$ans=$response['result'];
$response['result'] = $ans;
}
}
echo json_encode ($response);
}
?>
前端index.js
$(document).ready(function () {
const web=`<h3>109學年度學校課程查詢系統-智慧商務系(一年級)</h3>
<table>
<tr>
<td>課程名稱:</td>
<td><input type="text" name="course" id="course" value=""></td>
<td>授課教師:</td>
<td><input type="text" name="teacher" id="teacher" value=""></td>
<td>開課學期:</td>
<td><input type="text" name="semaster" id="semaster" value=""></td>
<td><input type="button" id="querycheck" value="查詢"></td>
</tr>
</table>
<br>
<div id="ans"></div>`
$("#root").html(web);
$("#querycheck").click(function () {
let data={
"course":$("#course").val(),
"teacher":$("#teacher").val(),
"semaster":$("#semaster").val()
};
console.log(data);
axios.post("../admin/index.php?action=search",Qs.stringify(data))
.then(res => {
let response=res["data"];
let ans=response["result"]
let str=`<table border="1">`;
str+=`<tr>`;
str+=`<td>`+"課程名稱"+`</td>`;
str+=`<td>`+"授課教師"+`</td>`;
str+=`<td>`+"上課教室"+`</td>`;
str+=`<td>`+"開課學期"+`</td>`;
str+=`</tr>`;
ans.forEach(element => {
str+=`<tr>`;
str+=`<td>`+element["course"]+`</td>`;
str+=`<td>`+element["teacher"]+`</td>`;
str+=`<td>`+element["classroom"]+`</td>`;
str+=`<td>`+element["semaster"]+`</td>`;
});
str+=`</tr>`;
str+=`</table>`
$("#ans").html(str);
});
});
});
((但是我觀察到了一個現象,如果我把search.php修改成if else單一條件
來分別判斷course,teacher,semaster
例如:
course,teacher,semaster三個輸入分別或單獨就可以正常傳遞給search.php來查詢
我需要的條件查詢資訊。
但是但是為什麼我search.php改成多重條件判斷後,teacher,semaster輸入框的字串無法傳送字串給後端程式search.php做判斷查詢的動作?
if(isset($_POST['course'])){
...
}
elseif(isset($_POST['teacher'])){
...
}
elseif(isset($_POST['semaster'])){
...
}
終於看出來了
這種寫法是 or 的寫法,就是三選一的寫法
三個值都會傳過去
但是只要有傳 course 就不會執行 teacher/semaster 的 elseif
對使用者來說,就是
用 course 查詢或者
用 teacher 查詢或者
用 semaster 查詢
只輸入 course OK
只輸入 teacher 也 OK (因為 course 那個 if 不成立)
只輸入 semaster 也 OK (因為 course 和 teacher 那兩個 if 都不成立)
回到原點當使用者輸入 course=C01 teacher=T02 semaster=S003 時
你打算查出什麼樣的資料給使用者?
是
1.course=C01或
teacher=T02或
semaster=S003
還是
2.course=C01而且
teacher=T02而且
semaster=S003
你可以考慮使用以下寫法,沒有實測過,可能會有錯誤
$sql = SELECT * FROM `class`;
$conditions= [];
if(isset($_POST['course'])) {
$course=$_POST['course'];
$conditions.push("`course` LIKE '%".$course."%'");
}
if(isset($_POST['teacher'])){
$teacher=$_POST['teacher'];
$conditions.push("`teacher` LIKE '%".$teacher."%'");
}
if(isset($_POST['semaster'])){
$semaster=$_POST["semaster"];
$conditions.push("`semaster` LIKE '%".$semaster."%'");
}
if ($conditions) {
$sql += "WHERE " + implode(" OR ", $conditions);
}
$stmt = $conn->prepare($sql);
$result = $stmt->execute();