2015-12-21 2 views
1

Джейсон данные:avail":["Sun-2","Mon-2","Sun-3"]Как искать с помощью многократного набора набора данных для столбцов и значений в MySQL Query

$avail = $data['avail']; 

// Ниже я категоризация значения от утра, днем ​​и вечером.

if($avail != ""){ 
     foreach($avail as $k=>$v) 
     { 
      $v; 
      //dividing value before and after the symbol '-' 
      $array = explode('-', $v); 
      $day =$array[0]; // Wed 
      $column = $array[1]; // 2 

      if($column == 1) 
      { 
      $col = "morning"; 

      } 
      if($column == 2) 
      { 
       $col = "afternoon"; 
      } 
      if($column == 3) 
      { 
       $col = "evening"; 
      } 
      array_push($cols,$col); 
      array_push($days,$day); 
     } 

Результат для var_dump ($ cols);

array (size=3) 
    0 => string 'afternoon' (length=9) 
    1 => string 'afternoon' (length=9) 
    2 => string 'evening' (length=7) 

Результат для var_dump ($ days);

array (size=3) 
    0 => string 'Sun' (length=3) 
    1 => string 'Mon' (length=3) 
    2 => string 'Sun' (length=3) 

Теперь запрос таблицы в базе данных, как это: // часть запроса

$add_here .= sprintf(" AND %s",implode(' OR ', array_map(function($colx) use ($days) {return sprintf("posts.%s IN ('%s')", $colx, implode("','",$days));}, is_array($cols) ? $cols : array($cols)))); 

НО только теперь я понял, что я делаю это неправильный путь, потому что как я классифицировал данные, сделанные двумя массивами. Один для сеанса дня и другой - набор данных для каждой сессии в целом.

$days = ['sun','mon','tue']; <- data for morning,afternoon and evening mixed together 
$col = ['afternoon','morning','evening']; 

SO в браузере:

AND (posts.afternoon IN ('sun','mon','tue') OR posts.morning IN ('sun','mon','tue') OR posts.night IN ('sun','mon','tue')) 

Смотрите, что его проверка всех данных $days против каждого значения $cols. Но то, что я хочу, - это данные для утреннего дня, чтобы проверить утреннюю колонку в таблице во время дневных данных, чтобы проверить день после столба в таблице. То же самое касается вечера.

Как мне изменить код, чтобы для набора данных JSON был выполнен следующий запрос:

джейсон данные:avail":["Sun-2","Mon-2","Sun-3"]

AND (posts.afternoon IN ('sun','mon') OR posts.night IN ('sun')) 

значения утром, днем ​​и вечером хранится в виде разделенных запятыми значений в базе данных. утром, днем ​​и вечером указаны названия столбцов в таблице с пометками

ответ

1

Группируйте дни по столбцам в массиве в первую очередь.

/* $periods[$column] = [$day1, ...] */ 
$periods = []; 
foreach($avail as $v){ 
    list($day, $column) = explode("-", $v); // make sure you validated the data to avoid errors 
    $periods[$column][] = "'" . mysqli_escape_string(strtolower($day)) . "'"; // PHP would automatically create an empty array if $periods[$column] was not defined 
} 
$intToCol = [1 => "morning", 2 => "afternoon", 3 => "night"]; 

// $periods should now be identical to ["2" => ["'sun'", "'mon'"], "3" => ["'sun'"]] 

$conditions = []; 
foreach($periods as $int => $days){ 
    $dayString = implode(",", $days); 
    $conditions[] = "posts." . $intToCol[$int] . " IN ($dayString)"; 
} 
return "AND (" . implode(" OR ", $conditions) . ")"; 
+0

благодаря кажется, что вы получите то, что я хотел. Однако я не уверен, как применять массивы в моем запросе. И что возвращает «AND (». Implode («OR», $ conditions). »)»; делать? – 112233

+0

var_dump ($ period); возвращает пустую строку и ошибку: Предупреждение: mysqli_escape_string() ожидает ровно 2 параметра, 1 задано в – 112233

+0

Я видел, что вы используете MySQL для запросов. Я не уверен, какую оболочку MySQL вы используете там, просто ставя эту функцию, чтобы напомнить вам, чтобы предотвратить инъекции SQL. Если вы считаете, что это необязательно, просто удалите этот вызов функции. – SOFe

0

Пусть вы руководствовались в результате вы желающий: чтение запроса вам нужно массив условий дня по ИЛИ-части, каждому констатирует список дней недели.

Таким образом, вы можете работать, как это (проверено, работает отлично):

$avail = ["Sun-2","Mon-2","Sun-3"]; 

$day_parts = [ 
    'morning', 
    'afternoon', 
    'evening', 
]; 
$decoded = []; 
if ($avail) { 
    foreach ($avail as $v) { 
    //dividing value before and after the symbol '-' 
    $array = explode('-', $v); 
    // register week_day as a key rather than a value, avoiding duplicates: 
    $decoded[$day_parts[$array[1] - 1]]['"' . $array[0] . '"'] = TRUE; 
    } 
} 

$ors = []; 
foreach ($decoded as $day_part => $week_days) { 
    if ($week_days) { 
    $ors[] = 'posts.' . $day_part . ' IN (' . implode(',', array_keys($week_days)) . ')'; 
    } 
} 
if ($ors) { 
    $where_part = ' AND (' . implode(' OR ', $ors) . ')'; 
}