если значение находится в базе данных mysqli, не создавайте кнопку на php - PullRequest
0 голосов
/ 26 февраля 2019

У меня есть таблица базы данных, такая как

-----------------
| id | time     |
|----|----------|
| 1  | 9am-10am |
| 2  | 11am-12pm|

и массив PHP

$times= array("8am-9am","9am-10am","10am-11am","11am-12pm","12pm-1pm","1pm-2pm","2pm-3pm","3pm-4pm","4pm-5pm","5pm-6pm","6pm-7pm","7pm-8pm","8pm-9pm","9pm-10pm");

Моя проблема в том, что, если время уже в базе данных, код не должен создаватькнопка с этим значением, поэтому у меня есть следующий цикл foreach

$sql = "SELECT * FROM `time_table`";
$result = mysqli_query($conn,$sql);
foreach($times as $value){
    while($row=mysqli_fetch_assoc($result)){
        if($value!=$row['time']){
            echo "<button>$value</button>";
        }
    }
}

Но вместо того, чтобы показывать все другие значения, а не с 9 до 10 утра и с 11 до 12 вечера, вместо этого просто отображаются две кнопки с 8 до 9 утра

Ответы [ 3 ]

0 голосов
/ 26 февраля 2019

Попробуйте изменить свой код следующим образом:

 $sql = "SELECT * FROM `time_table`";
 $result = mysqli_query($conn,$sql);
 foreach($times as $value){
  mysqli_data_seek($result,0); //reset the pointer to search from the first row every time
  while($row=mysqli_fetch_assoc($result)){
   if($value==$row['time']){
    continue 2; //exits while loop and then skips foreach to the next $value
   }
  }
  echo "<button>$value</button>";
 }

Или другое решение (основанное на другом ответе, поэтому кредиты до JoSSte, но немного измененные, чтобы не пришлось перебиратьмассив):

$savedValues = array();
$sql = "SELECT * FROM `time_table`";
$result = mysqli_query($conn,$sql);
while($row=mysqli_fetch_assoc($result)){
 $savedValues[$row['time']] = 1;
}

foreach($times as $value){
 if(!isset($savedValues[$value])){ 
  echo "<button>$value</button>";
 }
}
0 голосов
/ 26 февраля 2019

Должно работать, если вы используете in_array() и разделяете циклы, таким образом, он станет более читабельным.

$sql = "SELECT * FROM `time_table`";
$result = mysqli_query($conn,$sql);
$resultTimes = array();

// Assign the DB values to an array
while($row=mysqli_fetch_assoc($result)){
  $resultTimes[] = $row['time'];
}

// Check if values from $times are in the array, if not echo button
foreach ($times as $value) {
  if (!in_array($value, $resultTimes)) {
    echo "<button>$value</button>";
  }
}
0 голосов
/ 26 февраля 2019

Вы проходите через mysqli_resultset только один раз, на первом экземпляре вашего foreach.

Вам нужно переосмыслить свою логику.Получите результат mysql за пределами foreach, поместите результаты в массив, а затем используйте этот массив в foreach вместо цикла while.

//first, fetch the rows from DB
$savedValues = array();
$sql = "SELECT * FROM `time_table`";
$result = mysqli_query($conn,$sql);
 while($row=mysqli_fetch_assoc($result)){
  $savedValues[]  = $row['time'];
}

//then compare
foreach($times as $value){ 
  foreach($savedValues as $svd){
   if($svd != $value){
     echo "<button>$value</button>";
   }
  }
 }

ПРИМЕЧАНИЕ: этоне оптимально.как говорится в другом комментарии, вы должны рассмотреть in_array() или что-то подобное, чтобы избежать циклов в циклах

...