繁体   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