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