[英]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.