【问题标题】:How do I write an SQL query with a WHERE = 'all'?如何使用 WHERE = 'all' 编写 SQL 查询?
【发布时间】:2016-08-24 12:34:20
【问题描述】:

我正在编写一个 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 值,它将返回所有内容。

【问题讨论】:

  • 嗯,去掉where子句?您确实意识到 PHP 是一种动态语言,并且您可以动态构建该查询。如果您不想要 where 子句,那么就不要添加一个。
  • 您可以在 default: 情况下附加您的 where 子句在您的 switch 和 case "all" 情况下,您的 $bookTypeID 值应为空。
  • "SELECT name FROM books WHERE booktype = $bookTypeID OR $bookTypeID = 'all'";(当然假设booktype是字符串,但如果不是,可以使用类似的逻辑)
  • WHERE 1=1 并仅在需要时添加其他语句
  • case "all": $bookTypeID = "booktype"。结果:where booktype=booktype 始终为真(如果 booktype 不为空):)

标签: php mysql sql


【解决方案1】:

您可以根据 $bookTypeID 的输入/类型类型更改 SQL 查询。因此,如果需要,只需附加 where 子句。

这样,您不必更改数据库字段并在此时保持工作流程一致。

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

【讨论】:

  • 代码转储是不好的答案。你应该解释为什么这可以解决他们的问题。
  • 虽然您的解决方案有效,但我的问题是,在实践中,我有 50 个不同的参数,所以我试图避免使用条件 PHP 进行“语句构建”——这将导致 50 个!排列。
  • 我以为你只有一个带有数字或“全部”的 json?所以使用上面的应该没有问题。 If 语句仅检查变量是否包含“全部”。如果不总是做第二个。
  • 出于我的问题的目的,我提供了一个简化示例,其中一个在 JSON 中传递了 1 个变量。在实践中,我传递了 50 个变量,例如bookTypeIDpublisherIDISDNtitleauthor 等。所有这些值都可以是“全部”或具有实际值。因此,我的 SQL 查询更像$query = "SELECT name FROM books WHERE booktype = $bookTypeID AND publisher = $publisher AND author = $author AND title = $title
  • 如果 JSON 参数的值设置为“全部”,我基本上需要一种方法来忽略 WHERE 子句中的特定条件。我希望有一个 SQL 解决方案而不是 PHP 解决方案。
【解决方案2】:

最好完全删除 WHERE。

只是为了好玩,你可以这样做

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

这样 SQL 就结束了

WHERE booktype = booktype 

相同
WHERE booktype IS NOT NULL

这可能对你有用。

本质上,您是在对自己进行 SQL 注入(表明此 JSON 数据不得来自不受信任的输入)。

【讨论】:

  • 也许吧。但仍然:请完全删除 WHERE。
【解决方案3】:

使用以下方式更新您的开关盒和查询字符串

$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;

希望你理解它是 where 子句应该出现在 bookTypeID 中,否则只需要 make 和 $where 子句并在所有 else 中的 where 子句中附加空 if 条件

【讨论】:

  • 代码转储是不好的答案。你应该解释为什么这可以解决他们的问题。
  • 是的,伙计,但这很简单,如果条件不匹配,则省略一个子句。
  • 虽然您的解决方案适用于该特定示例,但我的问题是,在实践中,我有 50 个不同的参数,所以我试图避免使用条件 PHP 进行“语句构建”——这将导致 50 !排列。
  • 出于我的问题的目的,我提供了一个简化示例,其中一个在 JSON 中传递了 1 个变量。在实践中,我传递了 50 个变量,例如bookTypeID、publisherID、ISDN、title、author 等。所有这些值都可以是“全部”或具有实际值。因此,我的 SQL 查询更像 $query = "SELECT name FROM books WHERE booktype = $bookTypeID AND publisher = $publisher AND author = $author AND title = $title
  • 如果 JSON 参数的值设置为“全部”,我基本上需要一种方法来忽略 WHERE 子句中的特定条件。我希望有一个 SQL 解决方案而不是 PHP 解决方案。
【解决方案4】:

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();
?> 

【讨论】:

  • 代码转储是不好的答案。你应该解释为什么这可以解决他们的问题。
  • 为什么在switch之后有一个单独的if
【解决方案5】:

使用类似的东西。 这里我们替换整个 where 子句 -> if "all" then no where 子句 如果 "bookTypeId" 那么我们使用 where 子句

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

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

【讨论】:

  • 代码转储是不好的答案。你应该解释为什么这可以解决他们的问题。
  • 为什么会这样?我已将 where 子句替换为字符串
  • 您替换了变量 $booktype,而不是整个 WHERE 子句。因此,现在查询将只查找不返回任何行的没有值的书籍类型。这是一个缺陷。
  • 我很高兴您的示例适用于我的简化示例,但实际上我在 JSON 中传递了大约 50 个参数,因此我试图避免使用 PHP 进行“语句构建”。您能否通过提供一种适用于大量参数的简单方法来改进您的解决方案?
【解决方案6】:

实际上,您可能不需要在 php 代码中添加额外的逻辑来执行此操作。你可以说

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

【讨论】:

  • 这是我正在寻找的东西的类型,但我发现它在 $bookTypeID = "all" 的情况下返回 0 行(而不是返回所有行)。
  • 不应该有这样的问题吗?您是否尝试过我写的内容或类似的内容?也许它与变量 bookTypeID 的 php 数据类型有关,但如果没有看到代码,我不能肯定地说什么。
【解决方案7】:

如果你想要所有的记录,不需要使用WHERE子句。

但如果您需要指定 SET 为 bookTypeId 的记录,您可以使用 IN

喜欢

$query = "SELECT name FROM books WHERE booktype IN ('1','2','3','4','5')";

【讨论】:

    猜你喜欢
    • 2022-11-12
    • 1970-01-01
    • 1970-01-01
    • 2019-08-08
    • 1970-01-01
    • 2018-09-28
    • 1970-01-01
    • 1970-01-01
    • 2020-08-01
    相关资源
    最近更新 更多