Php URL中的多个WHERE语句

Php URL中的多个WHERE语句,php,mysql,Php,Mysql,我有一个为RSS提要创建的PHP页面。 这是一所学校的课程 在URL中,我添加了locationid(按位置过滤)和course parent(按学校过滤) URL结构当前为index.php?locid=1&tsid=2(ts=training site) 这将提取locationid=1且培训站点id=2的所有课程 工作完美 问题是,现在我们需要能够从URL中提取两个位置,以便locid=1或=2 我曾考虑添加另一个变量(?locid=1&locid2=2),但在这个查询中,我仅限于两个位置

我有一个为RSS提要创建的PHP页面。 这是一所学校的课程

在URL中,我添加了locationid(按位置过滤)和course parent(按学校过滤)

URL结构当前为index.php?locid=1&tsid=2(ts=training site) 这将提取locationid=1且培训站点id=2的所有课程 工作完美

问题是,现在我们需要能够从URL中提取两个位置,以便locid=1或=2 我曾考虑添加另一个变量(?locid=1&locid2=2),但在这个查询中,我仅限于两个位置。即使有两个WHERE(locationid=1或locationid=2),如何使它足够智能地使用括号

有没有一种聪明的方法可以做到这一点

这是代码

$where = array();
if (isset($_GET['tsid'])) {
$trainingsite = $_GET['tsid'];
$where[] = 'scheduledcourses.courseparent = '. $trainingsite ."";
}
if (isset($_GET['locid'])) {
$locationid = $_GET['locid'];
$where[] = 'scheduledcourses.courselocationid = '. $locationid ."";
}
if(count($where) >= 0) { array_unshift($where,""); } 
$where = implode(" AND ", $where); 
$where;
下面是查询中的WHERE语句

WHERE coursedate >= CURRENT_DATE() AND privatecourse='no' AND  $where";

提前谢谢你

您还可以用分隔符分隔ID,如“,”这样您的URL看起来像:

index.php?locid=1,2,3&tsid=4,6,234
然后,您可以使用PHP中的explode()将其分解为一个数组,并将其用于您的请求

$locidArray = explode(',', $_GET['locid']);

如果您使用以下方式创建URL:

index.php?locid[]=1&locid[]=2
您将在PHP脚本中获得一个值为[1,2]的数组,可以使用它:

foreach($_GET['locid'] as $locid) {
    echo $locid.'<br>';
}

我将使用数组访问表示法通过get传递数据数组。可能是这样的:

index.php?locid[]=1&locid[]=2&tsid=2

PHP将自动获取具有
[]
[foo]
符号的同名参数,并将它们组合成一个数组,在您的情况下,可以在参数名
$\u GET['locid']
处访问它们。

您可以将locid设置为GET中的arry,而不是现在的单个值。例如:

http://link/myids.php?locid[]=1&locid[]=2&locid[]=3
http://yourdomain.com/?locid[]=1&locid[]=2
然后在
if(isset($\u GET['locid']){


您可以在get请求中使用ID数组,如

index.php?locid[]=1&locid[]=2&tsid=2
然后在检查参数时,在数组上循环

if (isset($_GET['locid'])) {
if(is_array($_GET['locid']){
    $tmpOrWhere = array();
    foreach($_GET['locid'] as $locid){
        $tmpOrWhere[] = 'scheduledcourses.courselocationid = '. $locid."";
    }
    $where[] = "(" . implode (" OR " , $tmpOrWhere) . ")";
}else{
    $locationid = $_GET['locid'];
    $where[] = 'scheduledcourses.courselocationid = '. $locationid ."";
}
}

您也可以在url参数中使用数组

例如:

http://link/myids.php?locid[]=1&locid[]=2&locid[]=3
http://yourdomain.com/?locid[]=1&locid[]=2
这将导致:

print_r ( $_GET['locid'] );
Result:
array( [0] => 1 [1] => 2 )
因此,您会得到(作为一个示例,编辑此内容以满足您的需要):


您可以在url中使用数组语法:

index.php?locid[]=1&locid[]=3&locid[]=7&tsid=2
然后你会变成:

if (isset($_GET['locid'])) {
    $locationid = $_GET['locid'];
    if(is_array($locationid)){
        $where[] = 'scheduledcourses.courselocationid IN('. implode(',', $locationid) .')';
    }else{
        $where[] = 'scheduledcourses.courselocationid = '. $locationid;
    }
}

如果我正确理解你的问题,你想在配置参数num的基础上动态创建你的mysql查询。我对吗?房间里有一个无形的大象:SQL注入!大声喊叫,为什么这里的每个人都想立即让OP的网站被黑掉?至少有一点SQL注入的意思uld就足够了,例如,通过检查所有ID是否都是真正的数字。我认为在这种情况下使用数组访问表示法要好得多。这完全取决于您希望URL看起来有多漂亮,数组访问表示法可能更正确,但看起来不太好。而且使用起来并不复杂。@MikeBrant,不,我不这么认为“好得多”。这只是一种可能的方式。@nalply通过GET/POST传递数据数组几乎是行业标准的方式。请注意此线程上的所有其他答案,这些答案在几分钟内就出现了,支持这种方法。对这一需求的反应相当一致。@MikeBrant当羊群都朝着一个方向向深渊前进时s(SQL注入)我很高兴选择另一个方向。当有人说“行业标准”时,我很高兴我是自营职业者,不需要按照愚蠢的老板告诉我的去做。而且别忘了验证数据以避免SQL注入。@nalply确实也需要在这里这样做。
if (isset($_GET['locid'])) {
    $locationid = $_GET['locid'];
    if(is_array($locationid)){
        $where[] = 'scheduledcourses.courselocationid IN('. implode(',', $locationid) .')';
    }else{
        $where[] = 'scheduledcourses.courselocationid = '. $locationid;
    }
}