2015-10-20 23 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),總是檢查並處理錯誤,從長遠來看,它會節省大量時間。 –