iT邦幫忙

0

php if多重條件判斷式執行異常

不明 2021-06-10 15:08:481772 瀏覽
  • 分享至 

  • xImage
更新:
我輸入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做判斷查詢的動作?
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
1
海綿寶寶
iT邦大神 1 級 ‧ 2021-06-10 15:15:36
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=C01teacher=T02semaster=S003
還是
2.course=C01而且teacher=T02而且semaster=S003

我猜應該是要同時並存 他那個寫法同時只會有一種判斷會發生

0
screenleon
iT邦新手 1 級 ‧ 2021-06-10 16:32:16

你可以考慮使用以下寫法,沒有實測過,可能會有錯誤

$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();

會顯示class資料全部的資料項目 => 代表你讀取不到
$_POST['teacher'] or $_POST['semaster']
請回去檢查這兩筆資料是否設定正常
你之前是用 if() {} else() {}

小魚 iT邦大師 1 級 ‧ 2021-06-10 19:12:06 檢舉

不我覺得或許 isset($_POST['course']) 的本身就是一個錯誤, 或許它是Always true的.
然後他後面兩個都用了elseif

0
小魚
iT邦大師 1 級 ‧ 2021-06-10 19:10:57
  1. 首先要釐清的是你要的是 isset($_POST['course'] ) 還是 $_POST['course'] != "", 這你要自己測試.
  2. 把elseif拿掉, 你這種寫法三個只能觸發一個(如果你只是要觸發一個那就不要拿掉), 如果三個都要判斷的話寫法要改變.

我要發表回答

立即登入回答