簡體   English   中英

PHP if/elseif 語句未按預期工作

[英]PHP if/elseif statement not working as intended

我正在嘗試使 if/elseif 語句在 php 中工作,並且一切似乎都工作得很好,除了如果“locid”為空或不存在,我想顯示不同的查詢。 有人可以幫我弄清楚代碼有什么問題嗎?

基本上, if(empty($locid)) 語句不起作用。 該頁面顯示為空白。

這是代碼:

if (isset($_GET['locid'])) {
    $locid = $_GET['locid'];
    if (empty($locid)) {
        $selectloc = "SELECT * FROM locations;";
    } elseif ($locid == 'all') {
        $selectloc = "SELECT * FROM locations;";
    } elseif ($locid == 'veterinary') {
        $selectloc = "SELECT * FROM locations WHERE location_cate='Veterinary';";
    } elseif ($locid == 'store') {
        $selectloc = "SELECT * FROM locations WHERE location_cate='Store';";
    } elseif ($locid == 'shelter') {
        $selectloc = "SELECT * FROM locations WHERE location_cate='Shelter';";
    } elseif ($locid == 'other') {
        $selectloc = "SELECT * FROM locations WHERE location_cate='Other';";
    } else {
        $selectloc = "SELECT * FROM locations;";
    }
}

您應該啟用錯誤報告。

基本上, if(empty($locid))語句不起作用。 該頁面顯示為空白。

頁面顯示為空白應該敲響了合乎邏輯的警鍾。

問題是,如果$_GET['locid']未設置,那么您的查詢仍然期望$selectloc包含未定義的 SQL 字符串(沒有錯誤報告,意味着沒有錯誤 = 白/空白頁)。

// default to this first, let the conditions overwrite it.
$selectloc = "SELECT * FROM locations;";

if (isset($_GET['locid'])) {
    $locid = $_GET['locid'];
    if ($locid == 'veterinary') {
        $selectloc = "SELECT * FROM locations WHERE location_cate='Veterinary';";
    } elseif ($locid == 'store') {
        $selectloc = "SELECT * FROM locations WHERE location_cate='Store';";
    } elseif ($locid == 'shelter') {
        $selectloc = "SELECT * FROM locations WHERE location_cate='Shelter';";
    } elseif ($locid == 'other') {
        $selectloc = "SELECT * FROM locations WHERE location_cate='Other';";
    }
}

也可以寫成:

<?php

// default to this first, append the constraints
$selectloc = "SELECT * FROM locations WHERE 1=1";

if (isset($_GET['locid'])) {
    $locid = $_GET['locid'];
    
    if ($locid == 'veterinary') {
        $selectloc .= " AND location_cate='Veterinary'";
    } elseif ($locid == 'store') {
        $selectloc .= " AND location_cate='Store'";
    } elseif ($locid == 'shelter') {
        $selectloc .= " AND location_cate='Shelter'";
    } elseif ($locid == 'other') {
        $selectloc .= " AND location_cate='Other'";
    }
}

您的if else構造存在邏輯缺陷。

首先,您檢查是否設置了GET變量,如果是,請輸入if語句。 但是,當您輸入語句時,檢查內部沒有意義的空變量是沒有意義的,該變量不會為空。

因此,您應該將您的空邏輯移動到補充您的isset()的 else 語句中,因為邏輯將是變量已設置或未設置(即空)。

<?php
if (isset($_GET['locid'])) {
    $locid = $_GET['locid'];
    if ($locid == 'all') {
        $selectloc = "SELECT * FROM locations;";
    } elseif ($locid == 'veterinary') {
        $selectloc = "SELECT * FROM locations WHERE location_cate='Veterinary';";
    } elseif ($locid == 'store') {
        $selectloc = "SELECT * FROM locations WHERE location_cate='Store';";
    } elseif ($locid == 'shelter') {
        $selectloc = "SELECT * FROM locations WHERE location_cate='Shelter';";
    } elseif ($locid == 'other') {
        $selectloc = "SELECT * FROM locations WHERE location_cate='Other';";
    } else {
        $selectloc = "SELECT * FROM locations;";
    }
} else {
    $selectloc = "SELECT * FROM locations;";
}
?>

如果 id 僅因大小寫而異,則可以大大簡化代碼:

$locids = [ 'veterinary', 'store', 'shelter', 'other' ];
$whereClause = '';

$locid = $_GET['locid'] ?? null;
if (in_array($locid, $locids)) {
    $locationCate = ucfirst($locid);
    $whereClause = "WHERE location_cate='$locationCate'";
}

$selectloc = "SELECT * FROM locations $whereClause;";

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM