У меня проблема с правильной генерацией дней месяца, например. с 2018-10-01 по 2018-10-31 и проверяет, есть ли каждый день, сгенерированный в цикле for, в базе данных MySql.
Я могу генерировать дни, но во время условия сравнения дат из сгенерированного цикла с данными из базы данных он отображает только записи из базы данных и то, как ему нужно вставить пустые в пустые записи. Добавить дату для создания ошибок.
мой код:
$conn = dbManager::getConnection();
$tr = 1;
for($tr; $tr < $day; $tr++){
$dt = new DateTime($start);
$msc = $dt->format('m');
switch ($msc) {
case '1':
$m = '1';
break;
case '2':
$m = '2';
break;
case '3':
$m = '3';
break;
case '4':
$m = '4';
break;
case '5':
$m = '5';
break;
case '6':
$m = '6';
break;
case '7':
$m = '7';
break;
case '8':
$m = '8';
break;
case '9':
$m = '9';
break;
case '10':
$m = '10';
break;
case '11':
$m = '11';
break;
case '12':
$m = '12';
break;
}
if ($m < 10){
$mc = '0'.$m;
}else{
$mc = $m;
}
if ($tr < 10){
$tr = '0'.$tr;
}else{
$tr = $tr;
}
$data = date('Y-'.$mc.'-'.$tr);
echo "<tr><td>".$data."</td><td style='vertical-align:middle;'>";
$result = $conn->query("SELECT * FROM open ")or die(mysqli_error());
while($row = mysqli_fetch_array($result)){
$Start = $row['Start'];
$End = $row['End'];
$dtb = new DateTime($Start);
$dtb_e = new DateTime($End);
$dtb_e->add(new DateInterval('PT1H'));
$w= $dtb->format('Y-m-d');
$ts = $dtb->format('H');
$te = $dtb_e->format('H');
if ($w == $data){
for($h=1;$h<24;$h++){
if ($h >= $ts && $h <= $te){
if ($w < date('Y-m-d')){
$color ='gray';
}else{
$color = 'green';
}
echo '<p style = "display:inline;padding:5px; border:1px solid ;background:'.$color.';color:#fff;border-radius: 5px;margin-right:5px;">'.$h.':00</p>';
}else{
$color = 'gray';
echo '<p style = "display:inline;padding:5px; border:1px solid ;background:'.$color.';color:#fff;border-radius: 5px;margin-right:5px;">'.$h.':00</p>';
}
}
if ($data >= date('Y-m-d')){
echo '<div style = "display:inline;text-align:rigth;margin-left:35px;"><a class = "btn btn-sm btn-success" href = "edit_termin.php?Start='.$row['Start'].'&End='.$row['End'].'&ID='.$row['ID'].'" role = "button">Edytuj</a><a class = "btn btn-sm btn-danger" href = "del_open.php?Start='.$row['Start'].'&End='.$row['End'].'&ID='.$row['ID'].'" role = "button">Usuń</a></div>';
}else{
echo '<div style = "display:inline;text-align:rigth;margin-left:35px;"><a class = "btn btn-sm btn-success disabled" href = "edit_termin.php?Start='.$row['Start'].'&End='.$row['End'].'&ID='.$row['ID'].'" role = "button">Edytuj</a><a class = "btn btn-sm btn-danger disabled" href = "del_open.php?Start='.$row['Start'].'&End='.$row['End'].'&ID='.$row['ID'].'" role = "button">Usuń</a></div>';
}
if ($data != $data){
$dodaj = '<div style = "display:inline;text-align:rigth;margin-left:35px;"><a class = "btn btn-sm btn-success" href = "edit_termin.php?Start='.$data.'" role = "button">Dodaj</a></div>';
echo $dodaj;
}else{
echo 'x';
}
}else{
if ($data != $data){
$dodaj = '<div style = "display:inline;text-align:rigth;margin-left:35px;"><a class = "btn btn-sm btn-success" href = "edit_termin.php?Start='.$data.'" role = "button">Dodaj</a></div>';
echo $dodaj;
}else{
echo 'x';
}
echo '<div style = "display:inline;text-align:rigth;margin-left:35px;"><a class = "btn btn-sm btn-success" href = "edit_termin.php?Start='.$data.'" role = "button">Dodaj</a></div>';
}
}
}
echo "</td></tr>";
ниже результат:






Надеюсь, это поможет вам. Идея состоит в том, чтобы получить все результаты сразу, чтобы вы могли проверить, есть ли дата уже в базе данных или нет:
$conn = dbManager::getConnection();
$tr = 1;
$dt = new DateTime();
$msc = $dt->format('m');
$mc = str_pad($msc, 2, '0', STR_PAD_LEFT);
// You should limit your results to the working month
$result = $conn->query("SELECT * FROM open ")or die(mysqli_error());
$rows = mysqli_fetch_all($result, MYSQLI_ASSOC);
$db_dates = array_column($rows, 'Start');
$db_dates = array_map(function($v) {
$d = new DateTime($v);
return $d->format('Y-m-d');
}, $db_dates);
for($tr; $tr < $day; $tr++){
$tr = str_pad($tr, 2, '0', STR_PAD_LEFT);
$data = date('Y-'.$mc.'-'.$tr);
// Check if current date is not in the db result
$target_date = array_search($data, $db_dates);
if ($target_date === FALSE) {
// Add your buttons
} else {
// Column and map operations keep the indexes, access your record
$row = $rows[$target_date];
// Rest of your logic in here
}
}
сообщение спасибо за помощь. Я изменил его в соответствии с вашими подсказками и работает, показывая кнопку в нужном месте, но это занимает только часы из полей базы данных из последней записи. :( np.Start 2018-10-05 09:00 End 2018-10-05 20:00) скрипт показывает только эти часы для каждой записи, найденной в базе данных, а не те часы, которые назначены на данную дату .. Где можно Я ошибаюсь?
$tr=1;
for($tr; $tr < $day; $tr++){
$dt = new DateTime($start);
$msc = $dt->format('m');
switch ($msc) {
case '1':
$m = '1';
break;
case '2':
$m = '2';
break;
case '3':
$m = '3';
break;
case '4':
$m = '4';
break;
case '5':
$m = '5';
break;
case '6':
$m = '6';
break;
case '7':
$m = '7';
break;
case '8':
$m = '8';
break;
case '9':
$m = '9';
break;
case '10':
$m = '10';
break;
case '11':
$m = '11';
break;
case '12':
$m = '12';
break;
}
if ($m < 10){
$mc = '0'.$m;
}else{
$mc = $m;
}
if ($tr < 10){
$tr = '0'.$tr;
}else{
$tr = $tr;
}
//$dt = new DateTime($start);
//$msc = $dt->format('m');
// $mc = $nsc; //strpad($msc, 2, '0');
//strpad($tr, 2, '0');
$data = date('Y-'.$mc.'-'.$tr);
echo '<tr><td>'.$data.'</td><td>';
// You should limit your results to the working month
$result = $conn->query("SELECT * FROM open ".$month." ")or die(mysqli_error());
$rows = mysqli_fetch_all($result, MYSQLI_ASSOC);
$db_dates = array_column($rows, 'Start');
$db_dates = array_map(function($data) {
$d = new DateTime($data);
return $d->format('Y-m-d');
}, $db_dates);
// Check if current date is not in the db result
$target_date = array_search($data, $db_dates);
if ($target_date !== FALSE) {
// Add your buttons
foreach ($rows as $key) {
$Start = $key['Start'];
$End = $key['End'];
$id = $key['ID'];
}
$str = $key['Start'];
$ed = $key['End'];
$dtb = new DateTime($str);
$dtb_e = new DateTime($ed);
$dtb_e->add(new DateInterval('PT1H'));
$w= $dtb->format('Y-m-d');
$ts = $dtb->format('H');
$te = $dtb_e->format('H');
for($h=1;$h<24;$h++){
if ($h >= $ts && $h <= $te){
if ($w < date('Y-m-d')){
$color ='gray';
}else{
$color = 'green';
}
echo '<p style = "display:inline;padding:5px; border:1px solid ;background:'.$color.';color:#fff;border-radius: 5px;margin-right:5px;">'.$h.':00</p>';
}else{
$color = 'gray';
echo '<p style = "display:inline;padding:5px; border:1px solid ;background:'.$color.';color:#fff;border-radius: 5px;margin-right:5px;">'.$h.':00</p>';
}
}
//--------------------------------------
if ($data >= date('Y-m-d')){
//-------------------------
$dst = $data.' '.$ts.':00';
$den = $data.' '.$te.':00';
//echo "SELECT * FROM open WHERE Start >= '".$dst."' AND End <= '".$den."' ";
$res = $conn->query("SELECT * FROM open WHERE Start >= '".$dst."' AND End <= '".$den."' ");
while($r = mysqli_fetch_array($res)){
$idr = $r['ID']; //ID record
echo '<td><div style = "display:inline;text-align:rigth;margin-left:35px;"><a class = "btn btn-sm btn-success" href = "edit_termin.php?Start='.$dst.'&End='.$den.'&ID='.$idr.'" role = "button">Edutuj</a><a class = "btn btn-sm btn-danger" href = "del_open.php?Start='.$dst.'&End='.$den.'&ID='.$idr.'" role = "button">Usuń</a></div></td>';
}
}else{
echo '<td><div style = "display:inline;text-align:rigth;margin-left:35px;"><a class = "btn btn-sm btn-success disabled" href = "edit_termin.php?Start='.$row['Start'].'&End='.$row['End'].'&ID='.$idr.'" role = "button">Edytuj</a><a class = "btn btn-sm btn-danger disabled" href = "del_open.php?Start='.$row['Start'].'&End='.$row['End'].'&ID='.$row['ID'].'" role = "button">Usuń</a></div></td>';
}
} else {
// Column and map operations keep the indexes, access your record
$row = $rows[$target_date];
// Rest of your logic in here
if ($data >= date('Y-m-d')){
echo '<td><div style = "display:inline;text-align:rigth;margin-left:35px;"><a class = "btn btn-sm btn-success" href = "form_terminarz.php?Start='.$data.'" role = "button">Dodaj termin</a></div></td>';
}else{
echo '<td><div style = "display:inline;text-align:rigth;margin-left:35px;"><a class = "btn btn-sm btn-success disabled" href = "form_terminarz.php?Start='.$data.'" role = "button">Dodaj termin</a></div></td>';
}
}
echo '<td></tr>';
}