Автор Тема: Прост ламер не може да се оправи с цикли  (Прочетена 3730 пъти)

0 Потребители и 1 Гост преглежда(т) тази тема.

wuser

  • Administrator
  • Hero Member
  • *****
  • Благодарности
  • -Казани: 85
  • -Получени: 49
  • Публикации: 2761
Значи ситуацията е следната. Намерил съм си една системка и сеопитвам да я редизайнвам за личната ми страничка, ама нещо куца. Стигнах до един такъв момент. Имам записани новини в СУБД (мъсял) и в контролния панел имам възможност за редактирането им. За целта си ги вадя по дата на публикуване. Времето е прост интеджър записан в отмерване на Юникс епохата. На първата стъпка трябва да извадя списък с наличните години, като ги присвоявам на променлива:

$godinass=run_q( ' SELECT DISTINCT date_added FROM news ORDER BY date_added DESC ' );

run_q за всички гледали уроците на Иван е ясна функция, просто приравнява в UTF8 и прави заявка към СУБД. date_added сте се сетили, че е колонката в базата с въпросното Юникс време.

До тук добре, но трябва да представя и резултатите. Тук прозвам прост като мене цикъл:

while($row=mysql_fetch_assoc($godinass)) {

    $date=date( ' Y ' ,$row[ ' date_added ' ]);
    echo  '

    Година: ' .$date. ' ' ;




}


И ги получавам. Обаче! Обаче, не е това, което ми се иска да постигна. Така за всяка новина от определена година получавам редче. Сиреч това:

Година: 2010
Година: 2010
Година: 2010
Година: 2010
Година: 2010
Година: 2010
Година: 2010
Година: 2010
Година: 2010
Година: 2010
Година: 2010
Година: 2010
Година: 2010
Година: 2010
Година: 2010
Година: 2009
Година: 1970


Аз обаче искам друго. Искам за определена година да имам само едно редче, сиреч това:


Година: 2010
Година: 2009
Година: 2008



Обяснете сега на простосмъртния загубеняк, възможно ли е?

Благодаря дори на фламбета!
Мъдростта на патилото
Perl Monks: PHP - it's "training wheels without the bike" -- Randal L. Schwartz


Дееба... чувствам се все едно обяснявам на майка ми как да си отвори пощата
"не работи"
WTF?!?!? к'во значи че не работи?
Не ти се компилира, дава ти грешка, вади ти грешни резултати, компютърът ти се изключва като го напишеш или на целия квартал му спира тока?
Stilgar

kerkenez

  • Hero Member
  • *****
  • Благодарности
  • -Казани: 2
  • -Получени: 14
  • Публикации: 1205
Отг:Прост ламер не може да се оправи с цикли
« Отговор #1 -: 18 Януари 2010, 21:00:23 »
Пробвай така
Цитат

 while($row=mysql_fetch_assoc($godinass)) {
$year = date( ' Y ' ,$row[ ' date_added ' ]);
    $date[]=$year;

if (!in_array($year, $date)) {
echo  '
    Година: ' .$date. ' ' ;
}


}

wuser

  • Administrator
  • Hero Member
  • *****
  • Благодарности
  • -Казани: 85
  • -Получени: 49
  • Публикации: 2761
Отг:Прост ламер не може да се оправи с цикли
« Отговор #2 -: 18 Януари 2010, 21:15:23 »
Първо много благодаря, че толкова бързо се отзова! Наистина го оценявам и получаваш карма моментално. Второ, явно аз съм много прост, защото не стана, а  echo $date ми дава, че също е масив. Смотан съм признавам и не връзвам.
Мъдростта на патилото
Perl Monks: PHP - it's "training wheels without the bike" -- Randal L. Schwartz


Дееба... чувствам се все едно обяснявам на майка ми как да си отвори пощата
"не работи"
WTF?!?!? к'во значи че не работи?
Не ти се компилира, дава ти грешка, вади ти грешни резултати, компютърът ти се изключва като го напишеш или на целия квартал му спира тока?
Stilgar

kerkenez

  • Hero Member
  • *****
  • Благодарности
  • -Казани: 2
  • -Получени: 14
  • Публикации: 1205
Отг:Прост ламер не може да се оправи с цикли
« Отговор #3 -: 18 Януари 2010, 21:20:52 »
Ами дава, че е масив, защото е масив :) забравил съм да променя $date на $year.
while($row=mysql_fetch_assoc($godinass)) {
    $year = date( ' Y ' ,$row[ ' date_added ' ]);
    $date[]=$year;

    if (!in_array($year, $date)) {
        echo  ' Година: ' .$year. ' ' ;
    }
}

ако случайно този път кода проработи, прочети за функцията in_array() в случай, че не си го направил до сега.

wuser

  • Administrator
  • Hero Member
  • *****
  • Благодарности
  • -Казани: 85
  • -Получени: 49
  • Публикации: 2761
Отг:Прост ламер не може да се оправи с цикли
« Отговор #4 -: 18 Януари 2010, 21:45:43 »
Не проработи отново, но според мен няма и как, задал си да са едно и също ($date[]=$year;). Ей сега ще потърся за in_array, защото сефте го чух. Обърках се още повече, честно. Дали не трябва да пробвам нещо с foreach?
Мъдростта на патилото
Perl Monks: PHP - it's "training wheels without the bike" -- Randal L. Schwartz


Дееба... чувствам се все едно обяснявам на майка ми как да си отвори пощата
"не работи"
WTF?!?!? к'во значи че не работи?
Не ти се компилира, дава ти грешка, вади ти грешни резултати, компютърът ти се изключва като го напишеш или на целия квартал му спира тока?
Stilgar

kerkenez

  • Hero Member
  • *****
  • Благодарности
  • -Казани: 2
  • -Получени: 14
  • Публикации: 1205
Отг:Прост ламер не може да се оправи с цикли
« Отговор #5 -: 18 Януари 2010, 22:06:46 »
Оф съвсем съм изпушил
трети последен опит (тоя път трябва да работи)
while($row=mysql_fetch_assoc($res)) {

    $year = date( ' Y ' ,$row[ ' year ' ]);
   
    if (!in_array($year, $date)) {
        $date[]=$year;
        echo  ' Година: ' .$year. ' ' ;
    }
}

wuser

  • Administrator
  • Hero Member
  • *****
  • Благодарности
  • -Казани: 85
  • -Получени: 49
  • Публикации: 2761
Отг:Прост ламер не може да се оправи с цикли
« Отговор #6 -: 18 Януари 2010, 22:25:59 »
Определено и аз изпуших:


Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in /opt/lampp/htdocs/gogo/www/admin/editnews.php on line 43

Трябва ми време да размисля, а съпругата гледа за Мелек по Диема и откачам. Дали не е феч арей?
--------------

Не е. Пробвах. Искам да се разведа :( Тоя гнусен шум ми играе на здравето и не мога да мисля.
--------------

Тоя $res от де се появи???
Мъдростта на патилото
Perl Monks: PHP - it's "training wheels without the bike" -- Randal L. Schwartz


Дееба... чувствам се все едно обяснявам на майка ми как да си отвори пощата
"не работи"
WTF?!?!? к'во значи че не работи?
Не ти се компилира, дава ти грешка, вади ти грешни резултати, компютърът ти се изключва като го напишеш или на целия квартал му спира тока?
Stilgar

kerkenez

  • Hero Member
  • *****
  • Благодарности
  • -Казани: 2
  • -Получени: 14
  • Публикации: 1205
Отг:Прост ламер не може да се оправи с цикли
« Отговор #7 -: 18 Януари 2010, 22:28:55 »
Човек, не копирай буквално, каквото ти давам.
Трябва да е

while($row=mysql_fetch_assoc($godinass)) {
    $year = date( ' Y ' ,$row[ ' date_added ' ]);
        if (!in_array($year, $date)) {
        $date[]=$year;
        echo  ' Година: ' .$year. ' ' ;
    }
}


Опитай се да разбереш защо е този if там, каква е ролята на $year, $date[] и in_array()

wuser

  • Administrator
  • Hero Member
  • *****
  • Благодарности
  • -Казани: 85
  • -Получени: 49
  • Публикации: 2761
Отг:Прост ламер не може да се оправи с цикли
« Отговор #8 -: 18 Януари 2010, 22:34:07 »
Бе сетих се и сам, ама тогава ми излезе:

Warning: in_array() [function.in-array]: Wrong datatype for second argument in /opt/lampp/htdocs/gogo/www/admin/editnews.php on line 47
Година: 1970

Интересно, че в базата такава година нямам, а и при една от предните редакции (преди да пиша) пак ми се яви.

-----


Чакай обърках се. Трябва шибания сериал да свърши, за да мога да размисля на спокоиствие и жената да легне. Сега получих:

Warning: in_array() [function.in-array]: Wrong datatype for second argument in /opt/lampp/htdocs/gogo/www/admin/editnews.php on line 47
Година: 2010
Година: 2009
Година: 2008

//Много жалко, че не мога да ти дам карма още веднъж в следващите 6 часа, мнооооого благодаря, че помагаш. Близко съм до истината.
Мъдростта на патилото
Perl Monks: PHP - it's "training wheels without the bike" -- Randal L. Schwartz


Дееба... чувствам се все едно обяснявам на майка ми как да си отвори пощата
"не работи"
WTF?!?!? к'во значи че не работи?
Не ти се компилира, дава ти грешка, вади ти грешни резултати, компютърът ти се изключва като го напишеш или на целия квартал му спира тока?
Stilgar

kerkenez

  • Hero Member
  • *****
  • Благодарности
  • -Казани: 2
  • -Получени: 14
  • Публикации: 1205
Отг:Прост ламер не може да се оправи с цикли
« Отговор #9 -: 18 Януари 2010, 22:40:41 »
Пробвай преди цикъла да сложиш
$date = array();

wuser

  • Administrator
  • Hero Member
  • *****
  • Благодарности
  • -Казани: 85
  • -Получени: 49
  • Публикации: 2761
Отг:Прост ламер не може да се оправи с цикли
« Отговор #10 -: 18 Януари 2010, 22:57:02 »
Цитат
РЕШЕНО



Керкенез, въпреки, че в предния форум бях готов да те бия, признавам, че си яко готин пич и наистина ще изпиеш много бири, ако минеш покрай Видин. Обещавам тържествено!
Мъдростта на патилото
Perl Monks: PHP - it's "training wheels without the bike" -- Randal L. Schwartz


Дееба... чувствам се все едно обяснявам на майка ми как да си отвори пощата
"не работи"
WTF?!?!? к'во значи че не работи?
Не ти се компилира, дава ти грешка, вади ти грешни резултати, компютърът ти се изключва като го напишеш или на целия квартал му спира тока?
Stilgar

kerkenez

  • Hero Member
  • *****
  • Благодарности
  • -Казани: 2
  • -Получени: 14
  • Публикации: 1205
Отг:Прост ламер не може да се оправи с цикли
« Отговор #11 -: 18 Януари 2010, 23:10:47 »
Радвам се, че стана щото щях да сънувам кошмари.

gatakka

  • Hero Member
  • *****
  • Благодарности
  • -Казани: 0
  • -Получени: 19
  • Публикации: 681
Отг:Прост ламер не може да се оправи с цикли
« Отговор #12 -: 19 Януари 2010, 10:12:58 »
Да допълня, когато видиш година 1970 при date това значи, че си задал 0 или null вместо Timestamp.
Понеже Unixtimestamp започва от 01.01.1970 ако дадеш като брой секунди 0, се получава 1970. А ако не дадеш нищо, то се прехвърля на 0.
С 2 думи, видиш ли 1970 значи някоя стойност я няма.

По отношение на селекта на датите, това е правилен вариант но нека и аз да предложа 2 различни. единият е в базата. Винаги се опитвай да лимитиарш в базата, когато е възможно. В твоят случай го правиш, но между записите има няколко секунди разлика, и те не се хващат от DISTINCT

SELECT FROM_UNIXTIME( ' tm ' , ' %Y ' ) as my_year FROM news GROUP BY my_year ORDER BY date_added DESC
За да знаеш трябва да питаш,
но за да знаеш някой трябва да ти отговори на питанията.
Добре дошли в Научи Ме!

wuser

  • Administrator
  • Hero Member
  • *****
  • Благодарности
  • -Казани: 85
  • -Получени: 49
  • Публикации: 2761
Отг:Прост ламер не може да се оправи с цикли
« Отговор #13 -: 19 Януари 2010, 19:34:31 »
Да за нулата го знам от много отдавна, все пак 12 години се занимавам с разни Юникс подобни ОС. Интересно беше, че аз тези нули разно ги бях заменил с помощта на online конвертор. Но пък се случи във време, когато бях яко изнервен от 3 часов маратон турски сериали по три различни телевизии, които даже се застъпват с по няколко минути. Та кой знае, какво съм писал.


Твоя код ме хвърли в музката, както и да е. Изобщо не го разбрах. Имам мно-о-ого за учене.


И още нещо. Оригинално пича заисваше времето с отделни колони за година, месец, ден, час, минути. Аз реших, че е излишно сложно и раздуто (може би греша?) и ги премахнах, като оставих само една колонка с date_aded. Така заявките към базата се опростиха неимоверно, а нали всичко живо разправя да сме оптимизирали работата със СУБД, защото това било най-бавното и слабо звено.
Мъдростта на патилото
Perl Monks: PHP - it's "training wheels without the bike" -- Randal L. Schwartz


Дееба... чувствам се все едно обяснявам на майка ми как да си отвори пощата
"не работи"
WTF?!?!? к'во значи че не работи?
Не ти се компилира, дава ти грешка, вади ти грешни резултати, компютърът ти се изключва като го напишеш или на целия квартал му спира тока?
Stilgar

gatakka

  • Hero Member
  • *****
  • Благодарности
  • -Казани: 0
  • -Получени: 19
  • Публикации: 681
Отг:Прост ламер не може да се оправи с цикли
« Отговор #14 -: 19 Януари 2010, 20:39:35 »
Не се обиждай, писах за 0-та понеже някой, който не го знае, може да го прочете и да го разбере :)

Значи записа на времето в няколлко колони си е грешно отвсякъде, по една проста причина. Не ти дава никакво предимство. Всяко едно нещо в базата, което не отговаря на въпроса  " И къв ми е кяра от това "  трябва да се маха. Базите са доста добре в търсене, конвертиране, сортиране и всичко свързано с време. Даже ги записват в отделен формат, за да могат да ги оптимизират още повече. Тоест една колона, едно време и после си го ползваш както искаш.

По отношение на моя код идеята е проста. Винаги се опитваш да лимитираш данните в самата база. Това е златно правило.
Това което правя е да изведа годината от времето и да я присвоя на  " променлива "  my_year, и после казвам да ми върне само  " уникалните "  години.
За да знаеш трябва да питаш,
но за да знаеш някой трябва да ти отговори на питанията.
Добре дошли в Научи Ме!