使用Array在PHP函数中创建SQL语句

时间:2010-11-11 15:01:04

标签: php arrays

我正在创建一个PHP函数,它需要一些值,其中一个是数组,我需要在MySQL查询中使用。

我按如下方式创建数组:

 $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部分是我需要使用数组值的地方。

基本上我需要遍历构成查询部分的数组中的值,但是我对如何显示或不显示它的“OR”位有一点问题,因为可能只有1个值或者我需要的多少。

我在考虑这样的事情:

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

但我不知道如何将“OR”放在那里。

5 个答案:

答案 0 :(得分: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).")";

答案 1 :(得分: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)
...

答案 2 :(得分: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,',').")";

答案 3 :(得分: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;
}

答案 4 :(得分: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 );