0

以下は、ニュース記事を Web ページに動的にロードするために使用しているコードです。$dbConn->execute は、単一を渡すと正しく起動します
WHERE (SELECT * FROM newsitem WHERE subcategoryID=12 ORDER BY posted DESC)
が、渡すと結果を返すことができません

(SELECT * FROM newsitem WHERE subcategoryID=1 || subcategoryID=12 || subcategoryID=27 || subcategoryID=27 || subcategoryID=28 || subcategoryID=29 || subcategoryID=30 || subcategoryID=31 || subcategoryID=32 || subcategoryID=43 ORDER BY posted DESC)

これは、上記のクエリを生成する背後にあるコードです。

`$strHTML = ""; $strHTML .= "";

    if(strpos($params['subcatid'], "|") < 0){
        $q = "SELECT * FROM newsitem WHERE subcategoryID=".$params['subcatid']." ORDER BY posted DESC";
    } else {
        $q = "SELECT * FROM newsitem WHERE ";
        $idArr = explode("|", $params['subcatid']);

        for($i = 0; $i < count($idArr); $i++){
            $q .= "subcategoryID=".$idArr[$i]." || ";
        }
        $q = substr($q, 0, -4)." ORDER BY posted DESC";
    }
    return $q;

    $pstmt = $dbConn->prepare($q);
    $pstmt->execute();

    for($i = 0; $i < $params['numarts']; $i++){
        $row = $pstmt->fetch(PDO::FETCH_ASSOC);
        if($i == 0){
            $startArt = $row['newsitemID'];
        }
        $strHTML .= "<a href='javascript:cNews.get(".$row['newsitemID'].")'>".$row['headline']."</a><br />";
    }
    $numPages = ceil($pstmt->rowCount() / 10);
    $strHTML .= "<div id='articleNav' style='font-weight: bold; padding-top: 5px; width: 50%;'>Page: 1 of ".$numPages."<img src='/files/images/sitewide/next.gif' style='float: right;''></div>";
    $strHTML .= "<div id='startArticleID' style='visibility: hidden;'>".$startArt."</div></div><div id='newsarticle' style='padding-top: 20px;'>&nbsp;</div>";
    //return $params['id']." ".$params['subcatid'];
    return $strHTML;`

この関数を実行すると、またはパイプ区切りのリスト$params['subcatid']が渡されます。クエリが生成され、準備され、実行されます。1 つしかない場合に述べたように、結果は期待どおりに返されます。複数の ORが渡された場合、結果は返されません。subcatid='12'subcatid='1|12|26|27|28|29|30|31|32|44'subcategoryIDsubcategoryID

クエリをデータベースに直接コピーして貼り付けることでこれをテストしたところ、両方とも期待どおりの結果が返されました。

複雑なクエリを渡すと何が起こるでしょうか?

4

2 に答える 2

0

コメントで言われたように、複数の OR は非常に便利な IN 演算子に置き換えることができます。

しかし、準備済みステートメントでそれを作成するのはそれほど簡単ではありません。どうぞ:

すべての配列メンバーを表すプレースホルダーを使用してクエリを作成し、この配列値をバインドして実行する必要があります。

$ids = explode("|", $params['subcatid']);
$in  = str_repeat('?,', count($arr) - 1) . '?';
$sql = "SELECT * FROM table WHERE column IN ($in)";
$stm = $db->prepare($sql);
$stm->execute($ids);
$data = $stm->fetchAll();
于 2013-08-19T20:49:45.530 に答える