2010-11-11 72 views
0

我正在創建一個PHP函數,該函數將採用一些值,其中一個值是一個數組,我需要在MySQL查詢中使用該值。使用數組在PHP函數中創建SQL語句

我創建數組如下:

$newsArray = createArticleArray(array(2,20,3),5); 

然後函數看起來是這樣的(上剪下來的可讀性)

function createArticleArray($sectionArray = array(1),$itemsToShow) 
{ 
$SQL = " 
    SELECT 
    * 
    FROM 
    tbl_section 
    WHERE 
    (tbl_section.fld_section_uid = 2 OR tbl_section.fld_section_uid = 20 OR tbl_section.fld_section_uid = 3) 
    ORDER BY 
    tbl_article.fld_date_created DESC LIMIT 0,$itemsToShow"; 
} 

的部分tbl_section.fld_section_uid = 2 OR tbl_section.fld_section_uid = 20 OR tbl_section.fld_section_uid = 3是我需要使用數組值。

基本上我需要遍歷數組中的值構成查詢的一部分,但是我對如何顯示或不顯示它的「或」位有點問題,因爲可能只有1個價值或儘可能多的我需要。

我在想是這樣的:

foreach($sectionArray as $section) 
{ 
    $sqlString = $sqlString . "tbl_section.fld_section_uid = $section OR"; 
} 

,但我不知道如何工作了,如果就擺在那裏的「OR」。

回答

2

使用implode

$conditionParts = array(); 
foreach($sectionArray as $section){ 
    $conditionParts[] = "tbl_section.fld_section_uid = $section"; 
} 
$sqlString .= implode(' OR ', $conditionParts); 

該解決方案回答你的問題,並告訴你如何使用implode功能,但對於您的特定情況下,你真的應該使用IN操作。

$sqlString .= "tbl_section.fld_section_uid IN(".implode(',', $sectionArray).")"; 
+0

非常感謝大家的幫忙,完美作品 – 2010-11-11 15:13:48

1

如果使用WHERE <column> IN (value1,value2,...)語法,查詢可以變得更簡單,更容易生成。

使用PHP的implode生產(value1,value2,...)部分:

$SQL .= ' WHERE tbl_section.fld_section_uid IN (' . implode(',', $array) . ') '; 

息率是這樣的:

SELECT 
... 
WHERE tbl_section.fld_section_uid IN (2,20,3) 
... 
+0

您錯過了一對括號。 – 2010-11-11 15:07:03

+0

@Alin謝謝,修復 – meagar 2010-11-11 15:08:40

1

一種解決方案是把外來0在年底消費最後的 「OR」沒有任何影響。查詢解析器將刪除它:A OR B OR C OR 0變成A OR B OR C

另一種解決方案是使用implode插入OR

$sqlString = "tbl_section.fld_section = " 
. implode($sectionArray," OR tbl_section.fld_section_uid = "); 

當然,正確的解決方案就是使用IN

"WHERE tbl_section.fld_section_uid IN(".implode($sectionArray,',').")"; 
+0

+1 3解決方案 – 2010-11-11 15:19:33

0
function createArticleArray($sectionArray = array(), $itemsToShow) { 
    $conditions = array(); 
    for ($i = 0, $s = count($sectionArray); $i < $s; ++$i) { 
     $conditions[] = 'tbl_section.fld_section_uid = ' . (int) $sectionArray[$i]; 
    } 
    $SQL = 'SELECT * FROM tbl_section WHERE ' . implode(' OR ', $conditions) . ' ORDER BY tbl_article.fld_date_created DESC LIMIT 0, ' . (int) $itemsToShow; 
} 
+0

這些是條件,而不是條款。 SELECT,FROM,WHERE是子句。 – 2010-11-11 15:09:33

+0

好點,今天早上沒有正確思考。 – William 2010-11-11 15:19:33

0

使用PDO的準備方法:http://uk3.php.net/manual/en/pdo.prepare.php

$statement = $pdo->prepare(" 
    SELECT 
    * 
    FROM 
    tbl_section 
    WHERE 
    (tbl_section.fld_section_uid = ? OR tbl_section.fld_section_uid = ? OR tbl_section.fld_section_uid = ?) 
    ORDER BY 
    tbl_article.fld_date_created DESC LIMIT 0,$itemsToShow"); 

$statement->execute($sectionArray);