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

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

wuser

  • Administrator
  • Hero Member
  • *****
  • Благодарности
  • -Казани: 85
  • -Получени: 49
  • Публикации: 2761
Отг:Прост ламер не може да се оправи с цикли
« Отговор #15 -: 20 Януари 2010, 19:55:09 »
Няма от какво да се обиждам. Всеки учи до де е жив.

Реших да пробвам кода ти. Нещо не стана, вади ми само 1970-та година. Проверих в базата нямам нули. Ето какво правя:

$godinass=run_q( " SELECT FROM_UNIXTIME( ' tm ' , ' %Y ' ) as my_year FROM news GROUP BY my_year ORDER BY date_added DESC " );

сиреч присвоявам твоята заявка на променлива

$row=mysql_fetch_assoc($godinass);

извличам и си пълня масив

Пробвах и с while, резултата беше същия, но понеже си спомням, че някъде в старите уроци казваш, че за масиви е най-добре foreach, понеже бил създаден за тях, та:

foreach ($row as $v)
    {


echo  ' Година: ' .$v. ' ' ;

}

Както казах резултата, който вади е 1970, същия вадя и с while, a нули нямам, проверено поне 5 пъти.

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


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

kerkenez

  • Hero Member
  • *****
  • Благодарности
  • -Казани: 2
  • -Получени: 14
  • Публикации: 1205
Отг:Прост ламер не може да се оправи с цикли
« Отговор #16 -: 20 Януари 2010, 20:03:53 »
Пак май си преписвал буквално ?
wuser написа:
Цитат
$godinass=run_q( " SELECT FROM_UNIXTIME( ' tm ' , ' %Y ' ) as my_year FROM news GROUP BY my_year ORDER BY date_added DESC " );


Това  ' червеното '  не трябва ли да е date_added

После трябва да е
Цитат
foreach ($row as $v)
{
.... $v[ ' my_year ' ];
}


Напиши print_r($v) за да видиш с какви стойности ти е пълен масива.

Връща ти 1970, щото му подаваш нищо(0)

wuser

  • Administrator
  • Hero Member
  • *****
  • Благодарности
  • -Казани: 85
  • -Получени: 49
  • Публикации: 2761
Отг:Прост ламер не може да се оправи с цикли
« Отговор #17 -: 20 Януари 2010, 20:12:54 »
Да аз вярно не съм наясно, какво прави заявката и помислих, че това са някакви вътрешни на MySQL функции за време, но написано по този начин ми вади:

1(едно) ;(
Мъдростта на патилото
Perl Monks: PHP - it's "training wheels without the bike" -- Randal L. Schwartz


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

kerkenez

  • Hero Member
  • *****
  • Благодарности
  • -Казани: 2
  • -Получени: 14
  • Публикации: 1205
Отг:Прост ламер не може да се оправи с цикли
« Отговор #18 -: 20 Януари 2010, 20:21:14 »
$godinass=run_q( " SELECT FROM_UNIXTIME(date_added, ' %Y ' ) as year FROM news GROUP BY year ORDER BY date_added DESC " );

без кавички около date_added

wuser

  • Administrator
  • Hero Member
  • *****
  • Благодарности
  • -Казани: 85
  • -Получени: 49
  • Публикации: 2761
Отг:Прост ламер не може да се оправи с цикли
« Отговор #19 -: 20 Януари 2010, 20:34:21 »
Схванах, че направих ламерска грешка date_added да е в кавичка. Разкарах и  $v[ ' my_year ' ];, като оставих само $v (във вторият ти вариант е само year, но това няма значение, просто име). Ако го оставя ми връща 2 (две), ако го махна, ми връща само една година 2010- тази с най-много записи, но имам още две, които не вади.
Мъдростта на патилото
Perl Monks: PHP - it's "training wheels without the bike" -- Randal L. Schwartz


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

kerkenez

  • Hero Member
  • *****
  • Благодарности
  • -Казани: 2
  • -Получени: 14
  • Публикации: 1205
Отг:Прост ламер не може да се оправи с цикли
« Отговор #20 -: 20 Януари 2010, 21:49:09 »
Поиграй си със заявката (директно в phpmyadmin) за да видиш дали не бъркаш нещо, след това си поиграй с цикъла и така до като не го подкараш, не е нещо с което не можеш да се справиш.

wuser

  • Administrator
  • Hero Member
  • *****
  • Благодарности
  • -Казани: 85
  • -Получени: 49
  • Публикации: 2761
Отг:Прост ламер не може да се оправи с цикли
« Отговор #21 -: 20 Януари 2010, 21:52:05 »
Въпреки, че кода на Гатака не влезе в  " продукция "  ми помогна да си реша проблема със заявката на следващият етап, когато трябваше да добавя месец, но само от вече избраната година. Заявката стана:

SELECT DISTINCT date_added FROM news  WHERE FROM_UNIXTIME(date_added, ' %Y ' ) =  ' $godina '  ORDER BY date_added DESC

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

И една малка хитринка пак от уроците на Гатака (като си гледам записките, май е от MCF). Променливата $godina я получавам, като параметър от глобалната променлива _GET, но така:

$godina =(int) $_GET[ ' godina ' ];

Сиреч кастваме задължително към интиджър, защото както казва Иван (перефрезирам, запазвайки духа на изказването):
Цитат

 " Никога не вярвай на потребителя, дори да си самият ти, винаги проверявай. Това е златно правило "
.


Изобщо забелязах, че когато се стараеш около сигурността, кода значително набъбва и се усложнява.


И в тая връзка едно странично питане, някой знае ли дали в PHP съществува регулярен израз, подобен на тоя:

!ereg( " ^[a-zA-Z]{4,16}$ "

но за кирилица?
Мъдростта на патилото
Perl Monks: PHP - it's "training wheels without the bike" -- Randal L. Schwartz


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

kerkenez

  • Hero Member
  • *****
  • Благодарности
  • -Казани: 2
  • -Получени: 14
  • Публикации: 1205
Отг:Прост ламер не може да се оправи с цикли
« Отговор #22 -: 20 Януари 2010, 22:12:16 »
Има няколко

mb_ereg()
mb_eregi()
mb_ereg_match()


За горните трябва да настроиш първо mb_internal_encoding()

preg_match()
preg_match_all()


Мисля, че при preg трябваше да се добавя iu след затварящата... ' /[а-яА-Я]{4,23}/iu '
но не съм 100% сигурен, за това провери допълнително в документацията.

wuser

  • Administrator
  • Hero Member
  • *****
  • Благодарности
  • -Казани: 85
  • -Получени: 49
  • Публикации: 2761
Отг:Прост ламер не може да се оправи с цикли
« Отговор #23 -: 21 Януари 2010, 00:58:56 »
Уф сериозно изпуших. След като с лекота и за секунди се оправих с месеца на деня отново зациклих. Цели 4 часа се боря и измислям стотици заявки, но не се получава. Как ако знам годината и месеца, които ми трябват да изкарам дните от този месец, които имат записи от базата? Наистина вече ми свършиха идейте. Мислех повече да не я пълня тази тема, ама ако някой знае, ще съм му много благодарен.
Мъдростта на патилото
Perl Monks: PHP - it's "training wheels without the bike" -- Randal L. Schwartz


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

wuser

  • Administrator
  • Hero Member
  • *****
  • Благодарности
  • -Казани: 85
  • -Получени: 49
  • Публикации: 2761
Отг:Прост ламер не може да се оправи с цикли
« Отговор #24 -: 21 Януари 2010, 10:21:17 »
Понеже това си е моята тема и си я спамя спокойно. Искам да кажа до какъв резултат стигнах с кода на Иван. Правя го само, защото някой нов като мен може да кацне и да научи нещо.

Значи кода на иван беше горе долу това:

$godinass=run_q( " SELECT FROM_UNIXTIME( date_added,  ' %Y '  ) AS year FROM news GROUP BY year ORDER BY date_added DESC " );

Май при него беше my_year, но няма значение. Ключа за разбирането е какво точно връща този код. За това е полезно да се изпълни в конзолата на МySql (май наоколо не видях уроци за конзолата, не е трудно, може и през вебинтерфейс или някакъв друг).

Та този код връща това:


------
|year|
------
|2010|
|2009|
|2008|


Сиреч няма нужда да го сортираме допълнително, той вече си е сортиран. Само трябва да се извика правилния аргумент, а той е  ' year ' , самите ние го задаваме горе в заявката  ' ...AS year ' . Тоест ако се опитаме да извикаме нещо друго, то ще получим или грешка или нерелевантен резултат (php все пак се опитва да върнат нещо). И така правилния цикъл в случая е елементарен и очевиден:

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

    $date=($row[ ' year ' ]);
    echo  '

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




}


Така html- то ми е невалидно, но все пак то последно се оправя, важното е да работи.

За съжаление от седем сутринта продължавам борабата с последната заявка за дните, четох инфо тук-там, опитвах мръсни хакове (тъй като не ми е съвсем ясно, какво точно трябва да прави заявката, а и пробвам няколко различни варианта, включително се опитвам да го разбия на по-малки елементи, които да обработя с php), преработих десет пъти заявките, но успех клонящ към нула.  :angry:  Борбата продължава.
Мъдростта на патилото
Perl Monks: PHP - it's "training wheels without the bike" -- Randal L. Schwartz


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

wuser

  • Administrator
  • Hero Member
  • *****
  • Благодарности
  • -Казани: 85
  • -Получени: 49
  • Публикации: 2761
Отг:Прост ламер не може да се оправи с цикли
« Отговор #25 -: 21 Януари 2010, 16:04:13 »
Аз си продължавам да спамя.  След последното писане (а май беше преди него) реших, че ми трябва единен стил на заявките и, че различията само ме объркват. Последните часове се занимавах с това. Промених втората заявка, като тя стана:

$godinass=run_q( " SELECT FROM_UNIXTIME( date_added,  ' %M '  ) AS month FROM news WHERE FROM_UNIXTIME( date_added,  ' %Y '  ) =  ' $godina ' GROUP BY month DESC " );

сиреч имаме вече лимитиране WHERE, защото това го знаем. Съответно отпадат гимнастиките с циклите и става просто:

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

    $date=($row[ ' month ' ]);
   
    echo   ' Месец: ' .$date. ' ' ;

echo  ' ' ;

}


Тук има една малка особеност. Понеже проверявам с if къде да ходя се появи проблема с кастването. PHP винаги каства към интеджър, сиреч при тази проверка:

if($_GET[ ' page ' ]== " editnews "  && $_GET[ ' godina ' ]>0 &&  $_GET[ ' mesec ' ]==0) {}

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

$boolean=(boolean)$_GET[ ' mesec ' ];

и тогава вече проверката не би минала:

if($_GET[ ' page ' ]== " editnews "  && $_GET[ ' godina ' ]>0 &&  $boolean==0) {}

и отиваме на следващата:

if($boolean==1){}

Където вече имаме:


$godina =(int) $_GET[ ' godina ' ];

$mesec = $_GET[ ' mesec ' ];
$godinass=run_q( " SELECT FROM_UNIXTIME( date_added,  ' %d '  ) AS DAY FROM news WHERE FROM_UNIXTIME( date_added,  ' %Y '  ) =  ' $godina '  AND FROM_UNIXTIME( date_added,  ' %M '  ) =  ' $mesec '  GROUP BY DAY DESC " );


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

    $den=($row[ ' DAY ' ]);

echo  "
Ден: $den
" ;


}




Сиреч просто добавяме новото вече налично условие с AND. От самата заявка си вземаме променливите. Важно! Горе със стрлен не съм защитил гет[месец], което е обезателно, че не знаем каква беля може да си докараме.

Едва днес на трезва глава, когато разсъдих, че трябва да се движа в една посока, последната заявка дойде почти от само себе си. Последно последствие за новацие- Трябва да пишем хомогенно ;)

Иначе тези ифове могат да се избегнат. В оригиналната система jooroo е използвал отделни файлове, но цял файл само за една функция, ми се стори тъпо и за това всичко заедно и с иф. Ако не съм прав, някой да каже.

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

Много благодаря на Гатакка и Керкенез, защото без тях трудно щях сам да прозрея, какво следва да се направи.

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


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