如何使用foreach在sql查询中添加AND或or语句


[PHP]How to use foreach to add AND or OR statement into a sql query?

嗨,伙计们,我试图在我的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 =(张贴id)",但我在"OR"部分之后得到了语法错误,直到查询结束,说一些表达式是预期的。目前我在PHP学习方面还是个新手。谁能给我指出正确的格式吗?干杯(:

我不确定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']或set.

@Lee Stevens谢谢你的主意!你提到的用法完美地解决了我的问题。为了适应我的使用,我将代码修改为:

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