Най-преглеждани този мосец

taneca

Registered
Искам да направя класация за музика, като се показват най-слушаните песни за този месец или през последните 30 дни, все тая...
Ето кода, с който аз се опитах и без успех:
PHP:
<?
$date2 = date('d:m:Y');
$query2 = mysql_query("SELECT * FROM `music` WHERE ok='1' and date>='$date2-1' ORDER BY `views` DESC LIMIT 10") or die(mysql_error());
while ($r = mysql_fetch_array($query2))
{
echo '<a href="index.php?p=music&ext=play&id='.$r['id'].'"><font color="green">'.$r['name'].'</font></a><br>';
}
?>
Записвам датата така: date('d:m:Y');
 
Според мен си новак, защото правиш най-характерната грешка на новаците, а тя е, че бягат при Date() функцията, вместо да ползват time(), която е 20 пъти по лесна и по-удобна.

Моят съвет: Промени си структурата на Базата Данни и НЕ ползвай DATE() функцията -> ползвай time() !

Но щом искаш да се мъчиш с date-> разгледай MKTIME() фунцтията :?: :)
 
И все пак ще ми помогне ли някой... Изобщо възможно ли е това с date или да не се мъча вече :)

EDIT: Сетих се как ще стане, но кода е доста дълъг...
PHP:
<?
$dated = date('d');
$datem = date('m');
$datey = date('Y');
$query2 = mysql_query("SELECT * FROM `music` WHERE ok='1' and date='1:$datem:$datey' || date='2:$datem:$datey' ORDER BY `views` DESC LIMIT 5") or die(mysql_error());
while ($r = mysql_fetch_array($query2))
{
echo '<a href="index.php?p=music&ext=play&id='.$r['id'].'"><font color="green">'.$r['name'].'</font></a><br>';
}
?>
Ако някой се сети за по-къс вариант
 
Дано съм ти от помощ.
Код:
<?php
   $query = mysql_query("SELECT title, id, image, locked, views FROM `името на таблицата` ORDER BY `views` DESC LIMIT 0,10;") or die(mysql_error());
   if(mysql_num_rows($query) > 0) {
    while($row = mysql_fetch_array($query)) {
     $id    = $row['id'];
     $title = $row['title'];
     $title_url = $System->ctol__($title);
     if($row['image'] == NULL) {
      $picture = "images/default.jpg";
     } else {
      $picture = $row['image'];
     }
     echo "<img src=\"{$picture}\" width=\"50px\" height=\"50px\" alt=\"\" /> <a href=\"../Music/index.php?mode=1&id={$id}\" title=\"{$title}\"> {$title} </a>  <br />";
    }
   } else {
    echo "Все още няма добавени песни.";
   }
   ?>
 
$date2 = date('d:m:Y');

joTunkiq спомена нещо за работа с дати, но дори той не ти го обясни правилно.

В MySQL, както и в (повечето) (SQL) сървъри за бази от данни, има цяла група от типове на полета, които служат за работа с дати. Отделно от това, имат и "вградени" (native) функции за работа с дати - изчисления, търсене на периоди и т.н.

http://dev.mysql.com/doc/refman/5.1/en/date-and-time-types.html

http://dev.mysql.com/doc/refman/5.0/en/date-and-time-functions.html

След като ти записваш датата в БД, в горепосочения формат, ясно е, че не използваш подобен тип поле, а най-вероятно използваш тип за текст (char, varchar). Не зависимо, че вътре си записал дата, от гледна точка на MySQL това е някакъв текст. Няма как да търсиш по даден период, няма как да сортираш (с някой изключения).

Моя съвет е да промениш полето "date" да бъде от тип DATE. Едва тогава ще можеш да търсиш по период. Внимавай докато правиш промяната, да не изгубиш вече записаните дати!

Ето един план как да го направиш безопастно:

Стъпка 1 - разделителя, който изплозваш в датата - : е неподходящ, защото всъщност е стандартен разделител за време, не за дата, първо трябва да го променим:
[sql]update music set `date` = replace(`date`, ":", ".");[/sql]

Стъпка 2 - форматиране. Сега вече може да използваме някой от date функциите, за да форматираме правилно. В резултат, датата ще бъде преобразувана във вида: ГГГГ-ММ-ДД

[sql]update music set `date` = str_to_date(`date`, get_format(DATE, 'EUR'));[/sql]

Стърка 3 - промяна на типа на полето. В случая, на теб ти трябва датата като година, месец, ден, следователно DATE е достатъчно:

[sql]alter table music change `date` `date` DATE;[/sql]

Сега вече можеш да търсиш по периоди, например песните, които са най-популярни за последния един месец:

[sql]
select * from music where ok='1' and `date` > DATE_SUB(NOW(), INTERVAL 1 MONTH) ORDER BY `views` DESC LIMIT 10;
[/sql]

Песните от последните три дни:
[sql]
select * from music where ok='1' and `date` > DATE_SUB(NOW(), INTERVAL 3 DAY) ORDER BY `views` DESC LIMIT 10;
[/sql]


Какво още трябва да промениш:
1. Начина, по който записваш датите, когато вкарваш нов запис.
2. Начина, по който показваш датата пред потребителя. Това форматиране може да го направи както MySQL като част от SELECT заявката, така и през РНР, избора е твой.

[sql]
select *, DATE_FORMAT(`date`, '%d.%m.%Y') as formatted_date from music
[/sql]

или със PHP

PHP:
date('d.m.Y', strtotime($result['date']));

Между другото, името което си избрал за това поле е малко объркващо, можеш да го промениш и него.

Много от тук пишещите, записват датата във формата, в който трябва да я покажат на потребителя. Между формата в който записвате, и формата в който показвате една дата, няма нищо общо. Записвайте датите във формата, в който сървъра за бази от данни, да знае каква е тази информация и как да работи с нея. Това е и формата, чрез който Вие ще можете да я използвате правилно - търсене, сортиране и т.н.

Форматирането на данните за показване пред потребителя е нещо съвсем различно, отделна тема. И не е никакъв проблем да форматирате една дата по какъвто си искате начин. Но е голям проблем, ако датата не е записана правилно.
 
БОГ си човече... стана супер :) всичко е ОК, само не разбрах как да представям датата в страницата, защото е малко объркващо :)
 
Има два варианта да форматираш датата с цел да я покажеш пред потребителя. Единия е да накараш MySQL да свърши тази работа, другия е да оставиш тази задача на РНР.

Да приемем, че името на колоната, в която записваш датата, се казва pz_date.

Първи вариант - MySQL може да форматира датата както пожелаеш. За целта променяш малко SQL заявката:

[sql]
$query2 = mysql_query("SELECT *, date_format(pz_date, '%d.%m.%Y') as formatted_date FROM `music` WHERE ok='1' and date='1:$datem:$datey' || date='2:$datem:$datey' ORDER BY `views` DESC LIMIT 5") or die(mysql_error());
while ($r = mysql_fetch_array($query2))
{
echo '<a href="index.php?p=music&ext=play&id='.$r['id'].'"><font color="green">'.$r['name'].' - '.$r['formatted_date'].'</font></a><br>';
}
[/sql]


Втори вариант - взимаш си всички колони, както обикновенно, и използваш РНР за да форматира датата:

[sql]
$query2 = mysql_query("SELECT * FROM `music` WHERE ok='1' and date='1:$datem:$datey' || date='2:$datem:$datey' ORDER BY `views` DESC LIMIT 5") or die(mysql_error());
while ($r = mysql_fetch_array($query2))
{

$formatted_date = date('d.m.Y', strtotime($r['pz_date']));

//друг вариант - ако искаш да използваш DateTime класа (РНР 5.2+)
//$dObj = new DateTime($r['pz_date']);
//$formatted_date = $d->format('d.m.Y');
//но да създаваш нов обект, докато въртиш някакъв цикъл, не е препоръчително

echo '<a href="index.php?p=music&ext=play&id='.$r['id'].'"><font color="green">'.$r['name'].' - '.$formatted_date.'</font></a><br>';
}
[/sql]
 

Back
Горе