我正在创建一个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”放在那里。
答案 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 );