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

Форум MySQL

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

 

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

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

тема: Вывод новостей за определённый период
 
 автор: Shadow69   (05.12.2006 в 11:16)   письмо автору
 
 

Уважаемый Cheops!

Помогите решить задачку (извелся я весь):

Имеется sql-таблица:

CREATE TABLE news (
  id_news int(11) NOT NULL auto_increment,
  name tinytext NOT NULL,
  body text NOT NULL,
  putdate datetime NOT NULL default '0000-00-00 00:00:00',
  url tinytext NOT NULL,
  url_text tinytext NOT NULL,
  url_pict tinytext NOT NULL,
  hide enum('show','hide') NOT NULL default 'show',
  PRIMARY KEY  (id_news)
) TYPE=MyISAM;


Скрипт новостей выводит поля в соответсвии с таблицей:

<?php
  
// Устанавлинваем соединение с базой данных
  
require_once("config.php");

  
// Защита от инъекционных запросов
  
if(!preg_match("|^[\d]*$|",$_GET['id_news'])) puterror("Ошибка при обращении к блоку новостей");

  
// Запрашиваем новость id_news (она должна быть видимой hide='show')
  // Если скрипту передан первичный ключ выводимой новости отображаем только одну новость
  
if(isset($_GET['id_news']))
  {
    
$query "SELECT * FROM news WHERE hide='show' AND id_news=".$_GET['id_news'];
  }
  
// если параметр id_news не установлен - выводим все новости
  
else
  {
    
$query "SELECT id_news,
                   name,
                   body,
                   DATE_FORMAT(putdate,'%d.%m.%Y') as putdate_format,
                   url,
                   url_text,
                   url_pict,
                   hide
              FROM news 
              WHERE hide='show' AND putdate <= NOW()
              ORDER BY putdate DESC 
              LIMIT 
$all_number_news";
  }
  
$new mysql_query($query);
  if (!
$newputerror("Ошибка при обращении к блоку новостей");
  if(
mysql_num_rows($new) > 0)
  {
    while(
$news mysql_fetch_array($new))
    {
        
// Выводим заголовок новости
        
echo "<p class='zagnews'>".$news['name']."&nbsp;&nbsp;<em class=datanews>".$news['putdate_format']."</em></p>";    // Выводим тело новости перводя символы         

        // Выводим тело новости переводя символы 
        // переноса строки в тег <br>
        
echo "<p class='text'>";
        
// Выводим изображение
        
if(trim($news['url_pict']) != "" && trim($news['url_pict']) != "-")
        echo 
"<img align=right class=img src=".$news['url_pict'].">";
        
        echo 
nl2br($news['body'])."</p>";
        
        
// Выводим URL
        
if(trim($news['url']) != "" && trim($news['url']) != "-")
        echo 
"<p class='linkr'><a class='link' href=".$news['url'].">".$news['url_text']."</a></p>";        
    }
  }
?>


А как лучше релизовать вывод новостей в определенный период времени? Например, с 1 декабря 2006 года по 5 декабря.

Как понимаю нужно создать форму:


<form method="post" action="index.php" name="post">
<input type="hidden" name="active" value="arch"> 
<input type="hidden" name="menu" value="1">
<select name="minday">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5" selected>5</option>
<option value="6">6</option>
<option value="7">7</option>
<option value="8">8</option>
<option value="9">9</option>
<option value="10">10</option>
<option value="11">11</option>
<option value="12">12</option>
<option value="13">13</option>
<option value="14">14</option>
<option value="15">15</option>
<option value="16">16</option>
<option value="17">17</option>
<option value="18">18</option>
<option value="19">19</option>
<option value="20">20</option>
<option value="21">21</option>
<option value="22">22</option>
<option value="23">23</option>
<option value="24">24</option>
<option value="25">25</option>
<option value="26">26</option>
<option value="27">27</option>
<option value="28">28</option>
<option value="29">29</option>
<option value="30">30</option>
<option value="31">31</option>
</select>
&nbsp;<select name="minmon">
<option value="1">Января</option>
<option value="2">Февраля</option>
<option value="3">Марта</option>
<option value="4">Апреля</option>
<option value="5">Мая</option>
<option value="6">Июня</option>
<option value="7">Июля</option>
<option value="8">Августа</option>
<option value="9">Сентября</option>
<option value="10">Октября</option>
<option value="11">Ноября</option>
<option value="12" selected>Декабря</option>
</select>
&nbsp;<select name="minyear">
<option value="2005">2005</option>
<option value="2006" selected>2006</option>
</select>
</td><td>
<select name="maxday">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5" selected>5</option>
<option value="6">6</option>
<option value="7">7</option>
<option value="8">8</option>
<option value="9">9</option>
<option value="10">10</option>
<option value="11">11</option>
<option value="12">12</option>
<option value="13">13</option>
<option value="14">14</option>
<option value="15">15</option>
<option value="16">16</option>
<option value="17">17</option>
<option value="18">18</option>
<option value="19">19</option>
<option value="20">20</option>
<option value="21">21</option>
<option value="22">22</option>
<option value="23">23</option>
<option value="24">24</option>
<option value="25">25</option>
<option value="26">26</option>
<option value="27">27</option>
<option value="28">28</option>
<option value="29">29</option>
<option value="30">30</option>
<option value="31">31</option>
</select>
&nbsp;<select name="maxmon">
<option value="1">Января</option>
<option value="2">Февраля</option>
<option value="3">Марта</option>
<option value="4">Апреля</option>
<option value="5">Мая</option>
<option value="6">Июня</option>
<option value="7">Июля</option>
<option value="8">Августа</option>
<option value="9">Сентября</option>
<option value="10">Октября</option>
<option value="11">Ноября</option>
<option value="12" selected>Декабря</option>
</select>
&nbsp;<select name="maxyear">
<option value="2005">2005</option>
<option value="2006" selected>2006</option>
</select>
</td>
</tr>
<tr>
<td colspan=2 align=center>
<input type="submit" value="Отправить">
</form> 


А вот что делать дальше не очень понятно. Разделять ячейку даты на три отдельные составляющие (дата, месяц, год)???

???

   
 
 автор: himic   (05.12.2006 в 11:43)   письмо автору
 
   для: Shadow69   (05.12.2006 в 11:16)
 

Я использую функцию mktime, хоть я и не Хеопс


mktime ( [int hour [, int minute [, int second [, int month [, int day [, int year [, int is_dst]]]]]]] )


секунды проставь нулевыми
а день месяц и год подставляй из формы


where putdate between  date("d.m.Y", mktime(0, 0, 0, $_POST['month'],$_POST['day'], $_POST['year'])) and 
date("d.m.Y", mktime(0, 0, 0, $_POST['month1'],$_POST['day1'], $_POST['year1']))


могу ошибаться в мелочах, но примерно так

   
 
 автор: Shadow69   (05.12.2006 в 14:30)   письмо автору
 
   для: himic   (05.12.2006 в 11:43)
 

himic, спасибо за подсказку. Ни за что бы не догадался. Буду экспериментировать.

<select name="minday"> 
<option value="1">1</option> 
<option value="2">2</option> 
<option value="3">3</option> 
<option value="4">4</option> 
<option value="5" selected>5</option> 
<option value="6">6</option> 
<option value="7">7</option> 
<option value="8">8</option> 
<option value="9">9</option> 
<option value="10">10</option> 
<option value="11">11</option> 
<option value="12">12</option> 
<option value="13">13</option> 
<option value="14">14</option> 
<option value="15">15</option> 
<option value="16">16</option> 
<option value="17">17</option> 
<option value="18">18</option> 
<option value="19">19</option> 
<option value="20">20</option> 
<option value="21">21</option> 
<option value="22">22</option> 
<option value="23">23</option> 
<option value="24">24</option> 
<option value="25">25</option> 
<option value="26">26</option> 
<option value="27">27</option> 
<option value="28">28</option> 
<option value="29">29</option> 
<option value="30">30</option> 
<option value="31">31</option> 
</select> 
</form> 


и т.д.

А можно сделать чтобы число, месяц, год в html-форму вставлялись автоматически? И текущий месяц, год были активными.

   
 
 автор: himic   (06.12.2006 в 06:19)   письмо автору
 
   для: Shadow69   (05.12.2006 в 14:30)
 

канечна можно


<select name="minday"> 
<?
for($i=1;$i<=31;$i++){
?>
<option value="<?=$i?><? if($i==date("d")) echo 'selected="selected"' ?>><?=$i?></option>
<?
}
?>
</select>

   
 
 автор: Shadow69   (06.12.2006 в 07:50)   письмо автору
 
   для: himic   (05.12.2006 в 11:43)
 

Я использую функцию mktime, хоть я и не Хеопс

mktime ( [int hour [, int minute [, int second [, int month [, int day [, int year [, int is_dst]]]]]]] )

секунды проставь нулевыми
а день месяц и год подставляй из формы

where putdate between date("d.m.Y", mktime(0, 0, 0, $_POST['month'],$_POST['day'], $_POST['year'])) and
date("d.m.Y", mktime(0, 0, 0, $_POST['month1'],$_POST['day1'], $_POST['year1']))

могу ошибаться в мелочах, но примерно так



Может быть что-то не так делаю, но конструкция не работает...

   
 
 автор: Shadow69   (23.01.2007 в 16:08)   письмо автору
 
   для: himic   (05.12.2006 в 11:43)
 

Подскажите, пожайлуста, почему не работает эта конструкция:


...
else 
  { 
    $query = "SELECT id_news, 
                   name, 
                   body, 
                   DATE_FORMAT(putdate,'%d.%m.%Y') as putdate_format, 
                   url, 
                   url_text, 
                   url_pict, 
                   hide 
              FROM news  
              WHERE putdate between  date("d.m.Y", mktime(0, 0, 0, 
$_POST['month'],$_POST['day'],
$_POST['year']))
and  date("d.m.Y", mktime(0, 0, 0, 
$_POST['month1'],$_POST['day1'], 
$_POST['year1']))
              ORDER BY putdate DESC  
              LIMIT $all_number_news"; 
  }
...

   
 
 автор: cheops   (24.01.2007 в 00:17)   письмо автору
 
   для: Shadow69   (23.01.2007 в 16:08)
 

В чём выражается "не работа"?

   
 
 автор: Shadow69   (26.01.2007 в 08:00)   письмо автору
 
   для: cheops   (24.01.2007 в 00:17)
 

Cheops, огромная признательность за ответ.

Выдаёт ошибку: Parse error: syntax error, unexpected T_STRING in D:\www\html\my_drive\zapros\formanews.php on line 107

Как раз в строке WHERE putdate between date("d.m.Y", mktime(0, 0, 0, $_POST['minmon'],$_POST['minday'], $_POST['minyear'])) and
date("d.m.Y", mktime(0, 0, 0, $_POST['maxmon'],$_POST['maxday'], $_POST['maxyear']))

   
 
 автор: Trianon   (26.01.2007 в 09:23)   письмо автору
 
   для: Shadow69   (26.01.2007 в 08:00)
 

Вот Ваш оператор.

$query = "SELECT id_news,  
                   name,  
                   body,  
                   DATE_FORMAT(putdate,'%d.%m.%Y') as putdate_format,  
                   url,  
                   url_text,  
                   url_pict,  
                   hide  
              FROM news   
              WHERE putdate between  date("

От одной кавычки до другой. Так понятно?

   
 
 автор: cheops   (26.01.2007 в 13:20)   письмо автору
 
   для: Shadow69   (23.01.2007 в 16:08)
 

Внутри двойных кавычек другие двойные кавычки следует экранировать, т.е. поступать примерно так
<?php
$query 
"SELECT ... WHERE putdate between  date(\"d.m.Y\", ... ";
?>

   
 
 автор: Shadow69   (26.01.2007 в 13:45)   письмо автору
 
   для: cheops   (26.01.2007 в 13:20)
 

cheops, спасибо!

А что такое "between"?

   
 
 автор: cheops   (26.01.2007 в 14:07)   письмо автору
 
   для: Shadow69   (26.01.2007 в 13:45)
 

Оператор X BEETWEN from AND to возвращает true (истина) если to > X > from

   
 
 автор: Trianon   (26.01.2007 в 14:09)   письмо автору
 
   для: cheops   (26.01.2007 в 13:20)
 

Игорь, ну Вы же не всерьез считаете, что экранирование кавычек здесь решит проблему?

to Shadow69 :
a BETWEEN b AND c чиатется как a находится между b и с
a BETWEEN b AND c значит то же что и a >= b and a <= c

   
 
 автор: Shadow69   (26.01.2007 в 14:24)   письмо автору
 
   для: Trianon   (26.01.2007 в 14:09)
 

cheops, Trianon, ещё раз огромное спасибо!

Trianon, а что может решить проблему?

   
 
 автор: Trianon   (26.01.2007 в 14:52)   письмо автору
 
   для: Shadow69   (26.01.2007 в 14:24)
 

У Вас несколько частей запроса написано на языке php, и еще несколько - на языке SQL.
И всё перемешано в кучу.
Нужно найти php-части и отделить их от всего остального , исполнив их
раньше, чем начнете формировать текст SQL запроса.

   
 
 автор: Shadow69   (21.03.2007 в 08:32)   письмо автору
 
   для: cheops   (26.01.2007 в 13:20)
 

>Внутри двойных кавычек другие двойные кавычки следует экранировать, т.е. поступать примерно так
>
<?php
>$query "SELECT ... WHERE putdate between  date("d.m.Y", ... ";
>
?>


>Игорь, ну Вы же не всерьез считаете, что экранирование кавычек здесь решит проблему?
>
>to Shadow69 :
>a BETWEEN b AND c чиатется как a находится между b и с
>a BETWEEN b AND c значит то же что и a >= b and a <= c

при экранировании кавычек, выдаёт следующее:
Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in D:\www\html\drive\archive.php on line 131

   
Rambler's Top100
вверх

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