簡體   English   中英

如何編寫WHERE ='all'的SQL查詢?

[英]How do I write an SQL query with a WHERE = 'all'?

我正在編寫一個PHP腳本,該腳本接受一個JSON請求,該請求包含一個稱為bookTypeID的參數。

bookTypeID參數可以具有整數值(例如1,2,3,4)或字符串值“ all”。

我將此參數用作SQL查詢的WHERE子句的輸入。

我想讓我的查詢說出SELECT name FROM books WHERE $bookTypeID ,如果$bookTypeID是整數,則可以正常工作,但是在JSON參數值為“”的情況下,我不知道傳遞給WHERE子句的正確值所有”。 我想要一個本質上說“忽略WHERE子句”的內容。

我希望這是有道理的。 我在下面發布了我的代碼的簡化版本:

 <?php

  include 'db_conf.php';

  $conn = new mysqli($servername, $username, $password, $dbname);

  if ($conn->connect_errno) {
    printf("Connect failed: %s\n", $conn->connect_error);
    exit();
  }

  $content = file_get_contents('php://input');
  $json = json_decode($content, true);

  $bookTypeIDString = $json["bookTypeID"];
  $bookTypeID;
  switch($bookTypeIDString){
    case "all":
      $bookTypeID = "all"; // IS THERE A VALUE HERE THAT I CAN PASS TO AN SQL QUERY TO RETURN EVERYTHING? i.e. IGNORE THE WHERE CLAUSE COMPLETELY?
      break;
    default:
      $bookTypeID = $bookTypeIDString;
  }

  $query = "SELECT name FROM books WHERE booktype = $bookTypeID";
  $result = $conn->query($query);

  $data = array();
  while ($row = $result->fetch_array(MYSQLI_ASSOC)) {
    $data[] = $row;
  }
  echo json_encode($data);

  $conn->close();
?> 

更新:這是一個簡化的示例,用於提出我的問題。 實際上,我通過JSON傳遞了大約50個參數,因此我想避免使用條件PHP建立SQL語句。 我希望可以傳遞的SQL值將返回所有內容。

您可以根據輸入/類型$ bookTypeID的類型來更改SQL查詢。 因此,如果需要,只需附加位置子句。

這樣,您不必更改數據庫字段並保持工作流的一致性。

if($bookTypeID == 'all') {
    $query = "SELECT name FROM books";
} else {
    $query = "SELECT name FROM books WHERE booktype = $bookTypeID";
}

最好完全刪除WHERE。

只是為了好玩,你可以做

case "all":
  $bookTypeID = "booktype"; 
  break;

這樣,SQL最終以

WHERE booktype = booktype 

這與

WHERE booktype IS NOT NULL

可能對您有用。

本質上,您是在此處自己注入SQL(旨在表明此JSON數據一定不能來自不受信任的輸入)。

使用以下方式更新您的開關盒和查詢字符串

$where = '';
switch($bookTypeIDString){
    case "all":
      $bookTypeID = "all"; // IS THERE A VALUE HERE THAT I CAN PASS TO AN SQL QUERY TO RETURN EVERYTHING? i.e. IGNORE THE WHERE CLAUSE COMPLETELY?

     break;
    default:
      $bookTypeID = $bookTypeIDString;
       $where = "WHERE booktype = $bookTypeID";  
  }

$query = "SELECT name FROM books ".$where;

或者你可以使用

$where = '';
if($bookTypeID != 'all') {
    $where = "WHERE booktype = $bookTypeID"; 
}
$query = "SELECT name FROM books ".$where;

希望您理解它,因為bookTypeID的where子句應該出現,否則只需要make和$ where子句,並在$ where中的所有where子句中附加if條件

使用這樣的東西。 在這里,我們替換整個where子句->如果為“ all”,則替換為where子句;如果為“ bookTypeId”,則替換為where子句

  switch($bookTypeIDString){
    case "all":
      $bookTypeID = ""; 
      break;
    default:
      $WhereStting = "WHERE booktype = $bookTypeIDString";
  }

  $query = "SELECT name FROM books $WhereStting";

Where子句用於過濾數據,在這種情況下,您使用bookTypeID進行過濾,因為您不需要添加where子句。 為此,您可以通過子查詢將查詢分開,並使用php進行合並。 請查看所有內容的更正

    <?php

  include 'db_conf.php';

  $conn = new mysqli($servername, $username, $password, $dbname);

  if ($conn->connect_errno) {
    printf("Connect failed: %s\n", $conn->connect_error);
    exit();
  }

  $content = file_get_contents('php://input');
  $json = json_decode($content, true);

  $bookTypeIDString = $json["bookTypeID"];
  $bookTypeID;
  switch($bookTypeIDString){
    case "all":
      $bookTypeID = "all"; // IS THERE A VALUE HERE THAT I CAN PASS TO AN SQL QUERY TO RETURN EVERYTHING? i.e. IGNORE THE WHERE CLAUSE COMPLETELY?
      $where_clause = " ";
      break;
    default:
      $bookTypeID = $bookTypeIDString;
      $where_clause = " WHERE booktype = $bookTypeID";
  }

  $query = "SELECT name FROM books".$where_clause;
  $result = $conn->query($query);

  $data = array();
  while ($row = $result->fetch_array(MYSQLI_ASSOC)) {
    $data[] = $row;
  }
  echo json_encode($data);

  $conn->close();
?> 

實際上,您可能不需要在php代碼中執行其他邏輯。 你可以說

$query = "SELECT name FROM books WHERE (booktype = $bookTypeID OR $bookTypeID = 'all' )"

如果要所有記錄,則無需使用WHERE子句。

但是,如果您需要具有指定的bookTypeId的SET的記錄,則可以使用IN

喜歡

$ query =“從書本類型為IN('1','2','3','4','5')的書中選擇名稱

暫無
暫無

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

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