简化SQL查询的PHP脚本

简化SQL查询的PHP脚本,php,mysql,arrays,str-replace,simplify,Php,Mysql,Arrays,Str Replace,Simplify,我是一个自学成才的程序员。最近,我一直在编写一个PHP脚本,用用户输入的关键字查询数据库。我想到的似乎比它需要的复杂得多,所以我想知道是否有一种方法可以简化我写的东西。请让我知道,如果你有任何其他问题或需要更多的代码。谢谢大家! $types = array(); if(!empty($_GET['location_id']) && isset($_GET['location_id'])) $types[] = "groups.location_id = " .

我是一个自学成才的程序员。最近,我一直在编写一个PHP脚本,用用户输入的关键字查询数据库。我想到的似乎比它需要的复杂得多,所以我想知道是否有一种方法可以简化我写的东西。请让我知道,如果你有任何其他问题或需要更多的代码。谢谢大家!

    $types = array();
    if(!empty($_GET['location_id']) && isset($_GET['location_id'])) $types[] = "groups.location_id = " . str_replace(' ', '%', $_GET['location_id']) . " ";
    if(!empty($_GET['season_id']) && isset($_GET['season_id'])) $types[] = "seasons.season_id = " . str_replace(' ', '%', $_GET['season_id']) . " ";
    if(!empty($_GET['event']) && isset($_GET['event'])) $types[] = "(`event` LIKE '%" . str_replace(' ', '%', $_GET['event']) . "%' OR `note` LIKE '%" . str_replace(' ', '%', $_GET['event']) . "%') ";
    if(!empty($_GET['place']) && isset($_GET['place'])) $types[] = "`place` LIKE '%" . str_replace(' ', '%', $_GET['place']) . "%' ";
    if(!empty($_GET['city']) && isset($_GET['city'])) $types[] = "`city` LIKE '%" . str_replace(' ', '%', $_GET['city']) . "%' ";
    if(!empty($_GET['state_abbr']) && isset($_GET['state_abbr'])) $types[] = "`state_abbr` LIKE '%" . str_replace(' ', '%', $_GET['state_abbr']) . "%' ";
    if(!empty($_GET['weekday']) && isset($_GET['weekday'])) $types[] = "(`weekday` LIKE '%" . str_replace(' ', '%', $_GET['weekday']) . "%' OR `through_weekday` LIKE '%" . str_replace(' ', '%', $_GET['weekday']) . "%') ";
    if(!empty($_GET['month']) && isset($_GET['month'])) $types[] = "`month` LIKE '%" . str_replace(' ', '%', $_GET['month']) . "%' ";
    if(!empty($_GET['day']) && isset($_GET['day'])) $types[] = "(`day` LIKE '%" . str_replace(' ', '%', $_GET['day']) . "%' OR `through_day` LIKE '%" . str_replace(' ', '%', $_GET['day']) . "%') ";
    if(!empty($_GET['year']) && isset($_GET['year'])) $types[] = "`year` LIKE '%" . str_replace(' ', '%', $_GET['year']) . "%' ";

因为您的
中的
条件如此不同,因此没有任何方法可以减少代码中的行数,但每行可以稍微短一点。您还希望传递提交的变量以防止攻击

您可以在循环中准备所有变量,这样就不必在每一行上运行
mysql\u real\u escape
str\u replace

foreach ($_GET as $key => $val) {
  $_GET[$key] = mysql_real_escape_string(str_replace(' ', '%', $val));
}
我认为对
isset()
的调用有点多余,因此在运行每行上方的循环后,可能会出现如下情况:

if (!empty($_GET['year'])) 
  $types[] = "`year` LIKE '%" . $_GET['year'] . "%' ";

只是个主意。。这可能会使代码更加清晰,sql编写工作也变得非常简单

将此代码用于测试目的:

 $_GET['event']='jut for test';
 $_GET['place']='jut for test'; 
 $_GET['city']='jut for test'; 
 $_GET['state_abbr']='jut for test'; 
 $_GET['weekday']='jut for test'; 
 $_GET['month']='jut for test'; 
 $_GET['day']='jut for test';  
 $_GET['year']='jut for test'; 
echo '<pre>';
print_r($queryTmplArr );
然后将实际代码放在下面:

$queryTmplArr=Array("(`@field` LIKE '%@value%' OR `note` LIKE '%@value%') ",
"`@field` LIKE '%@value%' ","`@field` LIKE '%@value%' ","`@field` LIKE '%@value%' ",
"(`@field` LIKE '%@value%' OR `through_weekday` LIKE '%@value%') ",
"`@field` LIKE '%@value%' ","(`@field` LIKE '%@value%' OR `through_day` LIKE '%@value%') ",
"`@field` LIKE '%@value%' ");

$i=0;
foreach($_GET as $key =>$rawData)
{
     $cleanData= mysql_real_escape_string( str_replace(' ', '%', $rawData) ) ;   
     $queryTmplArr[$i]=str_replace('@value', $cleanData, $queryTmplArr[$i]);
     $queryTmplArr[$i]=str_replace('@field', $key, $queryTmplArr[$i]);
     $i++;
} 
再次用于测试目的:

 $_GET['event']='jut for test';
 $_GET['place']='jut for test'; 
 $_GET['city']='jut for test'; 
 $_GET['state_abbr']='jut for test'; 
 $_GET['weekday']='jut for test'; 
 $_GET['month']='jut for test'; 
 $_GET['day']='jut for test';  
 $_GET['year']='jut for test'; 
echo '<pre>';
print_r($queryTmplArr );

这可以吗?

我刚刚写了一个类似的答案……唯一的区别是我在
$\u GET
中设置了一个数组,并只修改了那些键。可能不想扫描和修改整个
$\u GET
,因为他可能不想修改其他值。@AaronW。你能告诉我你的代码是什么样子吗?非常感谢。