Php URL中的多个WHERE语句
我有一个为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),如何使它足够智能地使用括号 有没有一种聪明的方法可以做到这一点 这是代码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),但在这个查询中,我仅限于两个位置
$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;
}
}