以下は、ニュース記事を 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;'> </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'
subcategoryID
subcategoryID
クエリをデータベースに直接コピーして貼り付けることでこれをテストしたところ、両方とも期待どおりの結果が返されました。
複雑なクエリを渡すと何が起こるでしょうか?