Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Запрос MySql для календаря
 
 автор: sirop   (23.09.2006 в 17:57)   письмо автору
 
 

Есть скрипт, который выводит в браузер календарик:

function my_calendar($fill='') { 
  $month_names=array("январь","февраль","март","апрель","май","июнь",
  "июль","август","сентябрь","октябрь","ноябрь","декабрь"); 
  if (isset($_GET['y'])) $y=$_GET['y'];
  if (isset($_GET['m'])) $m=$_GET['m']; 
  if (isset($_GET['date']) AND strstr($_GET['date'],"-")) list($y,$m)=explode("-",$_GET['date']);
  if (!isset($y) OR $y < 1970 OR $y > 2037) $y=date("Y");
  if (!isset($m) OR $m < 1 OR $m > 12) $m=date("m");

  $month_stamp=mktime(0,0,0,$m,1,$y);
  $day_count=date("t",$month_stamp);
  $weekday=date("w",$month_stamp);
  if ($weekday==0) $weekday=7;
  $start=-($weekday-2);
  $last=($day_count+$weekday-1) % 7;
  if ($last==0) $end=$day_count; else $end=$day_count+7-$last;
  $today=date("Y-m-d");
  $prev=date('?\m=m&\y=Y',mktime (0,0,0,$m-1,1,$y));  
  $next=date('?\m=m&\y=Y',mktime (0,0,0,$m+1,1,$y));
  $i=0;
?> 
<table border=1 cellspacing=0 cellpadding=2> 
<tr>
  <td colspan=7> 
   <table width="100%" border=0 cellspacing=0 cellpadding=0> 
    <tr> 
     <td align="left"><a href="<? echo $prev ?>">&lt;&lt;&lt;</a></td> 
     <td align="center"><? echo $month_names[$m-1]," ",$y ?></td> 
     <td align="right"><a href="<? echo $next ?>">&gt;&gt;&gt;</a></td> 
    </tr> 
   </table> 
  </td> 
</tr> 
<tr><td>Пн</td><td>Вт</td><td>Ср</td><td>Чт</td><td>Пт</td><td>Сб</td><td>Вс</td><tr>
<? 
  
for($d=$start;$d<=$end;$d++) {
    if (!(
$i++ % 7)) echo "<tr>";
    echo 
'<td align="center">';
    if (
$d OR $d $day_count) {
      echo 
"&nbsp";
    } else {
      
$now="$y-$m-".sprintf("%02d",$d);
      if (
is_array($fill) AND in_array($now,$fill)) {
        echo 
'<b><a href="'.$_SERVER['PHP_SELF'].'?date='.$now.'">'.$d.'</a></b>'
      } else {
        echo 
$d;
      }
    } 
    echo 
"</td>";
    if (!(
$i 7)) echo "</tr>";
  } 
?>
</table> 
<? ?>


Если дата совпадает в выводимой в календаре, она оформляется ссылкой. У меня выводится только одна ссылка по дате.

$result=mysql_query("SELECT DISTINCT DATE_FORMAT(date, '%Y-%m-%d') FROM news");
$row=mysql_fetch_array($result);
my_calendar($row); //функция рисования календаря

В базе для примера хранятся три даты:

id | date |
----------------------------------
1 | 2006-09-20 00:00:00 |
2 | 2006-09-21 17:21:16 |
3 | 2006-09-22 17:38:51 |

Календарь рисует только ссылку на дате 20 ( ID 1)

Если же сделать так:


$test=array("2006-09-20", "2006-09-21", "2006-09-22"); 
my_calendar($test);
Все выводится правильно: три ссылочки.

Помогите найти решение этой моей сложности?

   
 
 автор: cheops   (23.09.2006 в 22:20)   письмо автору
 
   для: sirop   (23.09.2006 в 17:57)
 

>Все выводится правильно: три ссылочки.
>Помогите найти решение этой моей сложности?
Не понятно, что требуется, если всё работает?

   
 
 автор: sirop   (24.09.2006 в 13:23)   письмо автору
 
   для: cheops   (23.09.2006 в 22:20)
 

Работает, но только в том случае, если я вручную пропишу все даты из таблицы в массиве.
А если же я делаю выборку дат из таблицы news так:

<?php
$result
=mysql_query("SELECT DISTINCT DATE_FORMAT(date, '%Y-%m-%d') FROM news");
$row=mysql_fetch_array($result);
//функция рисования календаря
my_calendar($row);?>

то в календаре ссылкой выводится только один день, хотя в таблице у меня три разных даты. Выводится только дата с ID № 1

У меня не получается вывести данные после запроса в массив

   
 
 автор: cheops   (24.09.2006 в 13:39)   письмо автору
 
   для: sirop   (24.09.2006 в 13:23)
 

Дело в том, что функция mysql_fetch_array() возвращает только одну запись из результирующей таблицы. Обычно по всей результирующей таблице пробелают в цикле
<?php
  
while($row=mysql_fetch_array($result))
  {
    
// ...
  
}
?>

У вас либо перед функцией должен быть цикл, который объединяет все записи в массив и передаёт их функции my_calendar(), либо внутри функции должен быть такой цикл, в этом случае функции нужно передавать дескриптор $result.

   
 
 автор: sirop   (24.09.2006 в 14:38)   письмо автору
 
   для: cheops   (24.09.2006 в 13:39)
 

Я попробовал сделать так:
<?php
$result
=mysql_query("SELECT DISTINCT DATE_FORMAT(date, '%Y-%m-%d') as date_format FROM news");
while(
$row=mysql_fetch_array($result))
{
  @
$test .= "'".$row['date_format']."',";
}
$test = array($test);
//функция рисования календаря
my_calendar($test);
?>


А можно ли использовать $test = array($test); ?
Так как у меня не вывелось ничего

   
 
 автор: cheops   (24.09.2006 в 14:42)   письмо автору
 
   для: sirop   (24.09.2006 в 14:38)
 

Нет, массив $test лучше формировать следующим образом
<?php 
$result
=mysql_query("SELECT DISTINCT DATE_FORMAT(date, '%Y-%m-%d') as date_format FROM news"); 
while(
$row=mysql_fetch_array($result)) 

  
$test[] = $row['date_format']; 

//функция рисования календаря 
my_calendar($test); 
?>

   
 
 автор: sirop   (24.09.2006 в 14:58)   письмо автору
 
   для: cheops   (24.09.2006 в 14:42)
 

Уважаемый, cheops, большое Вам спасибо!!!
Всё получилось и работает

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования