2015-10-20 50 views
1

我有一列数列和它们的值由用户选择。我需要根据这些列和值执行搜索。如何在选择查询中implode列及其值?

例如,用户选择:

上午(列)=>周四,太阳(值)
下午(列)=> SAT(价值观)

现在,我该如何搜索与列和值匹配的记录?我正在使用PDO。

数组:

//列

var_dump($cols); 
array (size=3) 
     0 => string 'morning' (length=7) 
     1 => string 'morning' (length=7) 
     2 => string 'afternoon' (length=9) 



var_dump($days); 

//值存储在数据库中,对于record.So

array (size=3) 
    0 => string 'Thrs' (length=4) 
    1 => string 'Sun' (length=3) 
    2 => string 'Sat' (length=3) 

样品列和价值观,我想用以上日期和列作为搜索条件。

在下面的记录,此用户具有

'morning' => string 'Thrs' 
'afternoon' => string 'Fri,Sat' 
'evening' => '' 

早晨我的搜索条件是,周四和周日但是这个用户只能在周四早上使用。符合SO 1标准。

下一个下午,此用户在星期五,星期六可用。我的搜索只需要周六。由于满足了任何一个,因此符合这个标准。

但让我说我的搜索标准只是晚上而不是早上和下午。那么这个用户将不会被选中,因为他/她在晚上不可用。

希望你明白它是怎么回事..如果不是随便问。谢谢。

array (size=1) 
    0 => 
    array (size=25) 
     'postUUID' => string '5623853773026' (length=13) 
     'subid' => string '36' (length=2) 
     'subname' => string 'Muay Thai' (length=9) 
     'catID' => string '4' (length=1) 
     'catname' => string 'Martial Arts' (length=12) 
     'pricing' => string '200' (length=3) 
     'post_status' => string '0' (length=1) 
     'UUID' => string '562385374bddf' (length=13) 
     'Name' => string 'Kalaivani Nair' (length=14) 
     'Phone' => string '' (length=9) 
     'Email' => string '[email protected]' (length=23) 
     'location' => string 'kajang' (length=6) 
     'lat' => string '2.993518' (length=8) 
     'lon' => string '101.7874058' (length=11) 
     'DateReg' => string '2015-10-18 19:40:39' (length=19) 
     'Reputation' => string '0' (length=1) 
     'ReviewPlus' => string '' (length=0) 
     'ReviewNeg' => string '' (length=0) 
     'Sex' => string 'f' (length=1) 
     'centre' => string '0' (length=1) 
     'morning' => string 'Thrs' (length=4) 
     'afternoon' => string 'Fri,Sat' (length=7) 
     'evening' => string '' (length=0) 
     'catid' => string '4' (length=1) 
     'distance' => string '0' (length=1) 

编辑根据史蒂夫的回答

"avail":["Wed-2","Wed-3"]//JSON string 
    $data = json_decode($return, true);//decoded 
    $avail = $data['avail'];//stored into database 

     if($avail != ""){ 
     foreach($avail as $k=>$v) 
     { 
      echo $v; 

      $array = explode('-', $v); 
      $day =$array[0]; // Languages 
      $column = $array[1]; // English 

      echo"<br/>"; 
      if($column == 1) 
      { 
      $col = "morning"; 

      } 
      if($column == 2) 
      { 
       $col = "afternoon"; 
      } 
      if($column == 3) 
      { 
       $col = "evening"; 
      } 
      echo $col ."=>". $day; 
      echo $sql=" SELECT * , (3956 * 2 * ASIN(SQRT(POWER(SIN(('$lat' - lat) * pi()/180/2), 2) +COS('$lat' * pi()/180) * COS(lat * pi()/180) * POWER(SIN(('$lon' - lon) * pi()/180/2), 2)))) as distance 
    from posts,subjects WHERE ('posts.".$col."' LIKE '%".$day."%') AND posts.catID = '$catid' AND posts.subname LIKE '%$subject%' AND posts.subid = subjects.subid AND posts.catID = subjects.catid AND posts.pricing <= '$rate' having distance <= '$distance' order by distance "; 
    echo"<br/>"; 
      // array_push($cols,$col); 
      // array_push($days,$day); 
     } 
     } 
      $stmt =connection::$pdo->prepare($sql); 
      $stmt->execute(); 
    $place=array(); 
    while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { 
        $place[] = $row; 
        } 

回答

1

使用LIKE功能在MySQL中搜索您的列中的字符串。

在你的第一个例子,所以搜索无论是周四或周日上午:

SELECT * FROM `tableName` WHERE (`morning` LIKE '%Thrs%' OR `morning` LIKE '%Sun%'); 

要搜索任何一个周五或周六下午:

SELECT * FROM `tableName` WHERE (`afternoon` LIKE '%Fri%' OR `afternoon` LIKE '%Sat%'); 

这将足以为您的方案潜在价值清单很短。但是,在传统的关系数据库中,通常会将具有多个值的列移动到单独的表格中,而不是在单个列中使用逗号分隔值。通过使用索引可以更好地扩展,并为您提供更多的可运行查询或查询的灵活性。

+0

如果你不介意你可以检查我的文章中编辑的部分?我刚刚根据你的回答进行了更新。但是由于我使用用户的价值,我错过了OR。那里;在上面没有错误,但返回空阵列。你能帮我理解这个please.Thanks – 112233

+0

你有撇号,而不是反引号的'职位。“。$ col。”'。删除它们或在表名和列名周围使用反勾号。另外请看[SQL错误处理](http://php.net/manual/en/pdo.errorinfo.php),总是检查并处理错误,从长远来看,它会节省大量时间。 –