【问题标题】:[PHP]How to use foreach to add AND or OR statement into a sql query?[PHP]如何使用foreach在sql查询中添加AND或OR语句?
【发布时间】:2016-10-18 02:14:00
【问题描述】:

大家好,我正在尝试在我的 PHP 中执行多条件搜索,所以我想使用 foreach 根据用户选择的数量自动添加 AND 语句。以下是我的代码:

$sub = trim(ucfirst($_POST['sub']));
$any = trim(ucfirst($_POST['key']));
$count = 0;
$query = "SELECT P.PTY_ID, P.PTY_UNITNUM, P.PTY_STREET, P.PTY_POSTCODE, P.PTY_SUBURB,P.PTY_CITY, T.P_TYPE_NAME, 
                  L.SALE_PRICE, L.AVAILABILITY, R.PTY_ID,F.FEAT_ID, R.FEAT_ID,F.FEAT_NAME   
          FROM PROPERTY_TYPE T, PROPERTY P, LISTINGS L, PROPERTY_FEATURE R, FEATURE F 
          WHERE P.P_TYPE_ID = T.P_TYPE_ID(+) 
          AND P.PTY_ID = L.PTY_ID(+)
          AND R.FEAT_ID= F.FEAT_ID
          AND R.PTY_ID= P.PTY_ID
          AND REGEXP_LIKE (P.PTY_SUBURB,'$sub')
          AND REGEXP_LIKE (P.PTY_STREET||P.PTY_POSTCODE,'$any')
          OR(
                ".foreach ($_POST["check"] as $feat_id) {
                    if ($count != 0)
                        echo "AND";
                    echo "FEAT_ID = ' . $feat_id . '";
                    $count++;
                }.")";

$stmt = oci_parse($conn, $query);
oci_execute($stmt);

因此,就我而言,我想按郊区、一些关键字(如邮政编码和街道名称)以及特征来搜索房产。为了响应用户对多个功能的选择,我尝试使用 foreach 循环打印“AND FEAT_ID = (posted id)”,但在“OR”部分直到查询结束时出现语法错误, 说一些表达式是预期的。 我目前在 PHP 学习方面还很陌生。有人可以为我指出正确的格式吗?干杯(:

【问题讨论】:

  • 您应该学会使用正确的显式JOIN 语法,并且从不将已弃用的(+) 语法用于外连接。
  • 好的,干杯@GordonLinoff

标签: php sql oracle foreach


【解决方案1】:

我不确定 100% 你的问题是什么,但我会稍微清理一下。同样,这是我的编码风格,所以其他人可能仍然认为这可以改进。

$sub = trim(ucfirst($_POST['sub']));
$any = trim(ucfirst($_POST['key']));
$count = 0;
$or = "";

if (isset($_POST["check"]))
{
    $featArray = [];
    foreach ($_POST["check"] as $feat_id)
    {
        array_push($featArray, "FEAT_ID = " .$feat_id);
    }

    $or = implode(' AND ', $featArray);
}

$query = "SELECT P.PTY_ID, P.PTY_UNITNUM, P.PTY_STREET, P.PTY_POSTCODE, P.PTY_SUBURB,P.PTY_CITY, T.P_TYPE_NAME, 
                  L.SALE_PRICE, L.AVAILABILITY, R.PTY_ID,F.FEAT_ID, R.FEAT_ID,F.FEAT_NAME   
          FROM PROPERTY_TYPE T, PROPERTY P, LISTINGS L, PROPERTY_FEATURE R, FEATURE F 
          WHERE P.P_TYPE_ID = T.P_TYPE_ID(+) 
          AND P.PTY_ID = L.PTY_ID(+)
          AND R.FEAT_ID= F.FEAT_ID
          AND R.PTY_ID= P.PTY_ID
          AND REGEXP_LIKE (P.PTY_SUBURB, '$sub')
          AND REGEXP_LIKE (P.PTY_STREET||P.PTY_POSTCODE, '$any')";

if ($or != null)
    $query .= " OR (" . $or . ")";

$stmt = oci_parse($conn, $query);
oci_execute($stmt);

我还会检查您的 $_POST['sub'] 和 $_POST['key'] 或设置。

【讨论】:

  • 这正是我想要的!非常感谢(:
【解决方案2】:

@李史蒂文斯 谢谢你的主意! .= 你提到的使用完美地解决了我的问题。 为了适合我的使用,我将代码修改为:

<?php
    $sub = trim(ucfirst($_POST['sub']));
    $any = trim(ucfirst($_POST['key']));
    $count = 0;
    $and = "";  
/* All the same above */

    if (isset($_POST["check"]))
    {
        $featArray = [];
        foreach ($_POST["check"] as $feat_id)
        {
            array_push($featArray, "AND F.FEAT_ID = " .$feat_id);
            /* Add an "AND" here coz the original codes can't print */
            /* the "AND" for some reasons */
        }

        $and = implode(" ", $featArray);
        /* Remove "AND" here */
    }
    $query = "SELECT P.PTY_ID, P.PTY_UNITNUM, P.PTY_STREET, P.PTY_POSTCODE, P.PTY_SUBURB,P.PTY_CITY, T.P_TYPE_NAME, 
                      L.SALE_PRICE, L.AVAILABILITY, R.PTY_ID,F.FEAT_ID, R.FEAT_ID,F.FEAT_NAME   
              FROM PROPERTY_TYPE T, PROPERTY P, LISTINGS L, PROPERTY_FEATURE R, FEATURE F 
              WHERE P.P_TYPE_ID = T.P_TYPE_ID(+) 
              AND P.PTY_ID = L.PTY_ID(+)
              AND R.FEAT_ID= F.FEAT_ID
              AND R.PTY_ID= P.PTY_ID
              AND REGEXP_LIKE (P.PTY_SUBURB,'$sub')
              AND REGEXP_LIKE (P.PTY_STREET||P.PTY_POSTCODE,'$any')";


    if (!empty($and))
        $query.="$and";

    $stmt = oci_parse($conn, $query);
    oci_execute($stmt);
?>

【讨论】:

    猜你喜欢
    • 2017-09-26
    • 2018-08-10
    • 2017-03-21
    • 2017-05-22
    • 1970-01-01
    • 2015-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多