Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP] wygasniecie newsa
-dark_lion-
post
Post #1





Goście







Witam mam takie pytanie czy jest możliwe aby ustawić danemu newsowi czas jego wygaśnięcia? załóżmy ze dodałem w poniedziałek tekst na stronę główna i chciałbym żeby zniknęła po 2 dniach od czasu jego nadania.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
thek
post
Post #2





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Kompletnie mylisz pojęcia "dobrego i złego programisty". Dobry, to niekoniecznie taki, który potrafi napisać coś sam, ale taki, który ma na tyle szeroką wiedzę, że nie będzie wymyślać koła od nowa, ale także skorzystać potrafi z poprawnego kodu już istniejącego. Poza tym zadam Ci pytanie... Jeśli jakaś funkcja weszła jako wbudowana do języka to będzie ona wydajniejsza czy nie od samodzielnie napisanej? Zwróć uwagę, że Ty w tej jednej używasz 3 pętli i 6 razy wbudowanej date() okraszonych masą działań matematycznych, także w pętlach. Co będzie wydajniejsze? Dodam, że z Twojej strony kompletnie olewasz walidację, nie zwracasz uwagi na daty wcześniejsze niż rok 2000 i wiele dupereli. Uważasz, że masz szybszą? Zrobiłem test prosty... 100000 wywołań mojej i Twojej. Tu masz kod by to sobie przetestować:
  1. <?php
  2. function diff( $data, $data2, $type = 's') {
  3. if( !$start = strtotime($data) ) {
  4. throw new Exception('Data początkowa nie jest prawidłowa!');
  5. } elseif( !$end = strtotime($data2) ) {
  6. throw new Exception('Data końcowa nie jest prawidłowa!');
  7. } else {
  8. $sekund = abs( $start-$end );
  9. switch( $type ) {
  10. case 'w': //weeks
  11. return $sekund/604800;
  12. case 'd': //days
  13. return $sekund/86400;
  14. case 'h': //hours
  15. return $sekund/3600;
  16. case 'm': //minutes
  17. return $sekund/60;
  18. case 's': //seconds
  19. default:
  20. return $sekund;
  21. }
  22. }
  23. }
  24.  
  25. function roznicaCzasow($r,$m,$d,$h,$i,$s,$R,$M,$D,$H,$I,$S){
  26. $dni=Array(13);
  27. $dni[0]=$dni[12]=31; $dni[1]=28; $dni[2]=31; $dni[3]=30; $dni[4]=31; $dni[5]=30; $dni[6]=31; $dni[7]=31; $dni[8]=30; $dni[9]=31; $dni[10]=30; $dni[11]=31;
  28. $roznica=0;
  29. if($R<$r || ($R==$r && $M<$m) || ($R==$r && $M==$m && $D<$d))return "Błąd: próba podróży w czasie niemożliwa!";
  30. if(!przestepny($R) && $M==1 && $D==29)return "Bł?d: docelowa data nie istnieje!";
  31. if($r<$R){
  32. $_s=$_i=$_h=$ileDniMinelo=0;
  33. $_d=$_m=1;
  34. while($_m<$m){
  35. $ileDniMinelo+=60*60*24*$dni[++$_m-(!(przestepny($r) && $_m==2))];
  36. }
  37. $ileDniMinelo+=60*60*24*($d-$_d);
  38. $ileDniMinelo+=60*60*($h-$_h);
  39. $ileDniMinelo+=60*($i-$_i);
  40. $ileDniMinelo+=$s-$_s;
  41. $s=$i=$h=0;
  42. $d=$m=1;
  43. $roznica+=(365+przestepny(++$r-1))*24*60*60-$ileDniMinelo;
  44. }
  45. while($r<$R){
  46. $roznica+=(365+przestepny(++$r-1))*24*60*60;
  47. }
  48. while($m<$M){
  49. $roznica+=60*60*24*$dni[++$m-(!(przestepny($r) && $m==2))];
  50. }
  51. $roznica+=60*60*24*($D-$d);
  52. $roznica+=60*60*($H-$h);
  53. $roznica+=60*($I-$i);
  54. $roznica+=$S-$s;
  55. return $roznica;
  56. }
  57. function przestepny($rok){
  58. return (!$rok%4 && !(!$rok%100 && $rok%400))?1:0;
  59. }
  60.  
  61. $start1 = microtime(true);
  62. for($i = 0; $i<100000; $i++) {
  63. try {
  64. diff('2010-10-10 10:10:10', date('Y-m-d H:i:s'), 'd');
  65. } catch (Exception $e) {
  66. echo $e->getMessage();
  67. }
  68. }
  69. $stop1 = microtime(true);
  70. $start2 = microtime(true);
  71. for($j = 0; $j<100000; $j++) {
  72. $r=10;
  73. $m=10;
  74. $d=10;
  75. $h=10;
  76. $i=10;
  77. $s=10;
  78. $R=date('y');
  79. $M=date('m');
  80. $D=date('d');
  81. $H=date('H');
  82. $I=date('i');
  83. $S=date('s');
  84. roznicaCzasow($r,$m,$d,$h,$i,$s,$R,$M,$D,$H,$I,$S);
  85. }
  86. $stop2 = microtime(true);
  87. echo 'thek: '.($stop1-$start1).'<br />benio: '.($stop2-$start2);
  88. ?>

Cytat
thek: 5.2500369548798
benio: 9.1759741306305
Nadal uważasz, że Twoja jest szybsza? Jak dla mnie 2-krotnie wolniejsza. Dlatego zanim zaczniesz uważać, że masz lepszy "skill" po potrafisz napisać sam - przetestuj się i swoje funkcje a potem porównaj przejrzystość kodu... Moje 22 krótkie i bardzo czytelne oraz schludne linijki kodu czy 35 Twojego "nie wiem co się dzieje"?

Dodajmy, że Twój "skill" nie pozwolił Ci zauważyć, iż nie masz nawet swojego skryptu choć pobieżnie optymalizowanego pod katem przejrzystości i poprawności.
$dni[0]=$dni[12]=31; $dni[1]=28; $dni[2]=31; $dni[3]=30; $dni[4]=31; $dni[5]=30; $dni[6]=31; $dni[7]=31; $dni[8]=30; $dni[9]=31; $dni[10]=30; $dni[11]=31;
a
$dni[0]=$dni[2]=$dni[4]=$dni[6]=$dni[7]=$dni[9]=$dni[11]=31; $dni[1]=28; $dni[3]=$dni[5]=$dni[8]=$dni[10]=30;
krócej i bez błędu. Nie zauważyłeś, że nie ma miesiąca po grudniu -> $dni[12]
Do tego data musi być podana w formacie 'yymmddhhiiss' co jest kompletnie nieprzejrzyste, że o poprawieniu po Tobie błędów typu Notice nie wspomnę. I tak poszedłem na rękę bo nie walnąłem w wywołaniu tak jak sobie życzyłeś:
  1. $datanapisaniapostu = '101010101010';
  2. $r=$datanapisaniapostu[0].$datanapisaniapostu[1];
  3. $m=$datanapisaniapostu[2].$datanapisaniapostu[3];
  4. $d=$datanapisaniapostu[4].$datanapisaniapostu[5];
  5. $h=$datanapisaniapostu[6].$datanapisaniapostu[7];
  6. $i=$datanapisaniapostu[8].$datanapisaniapostu[9];
  7. $s=$datanapisaniapostu[10].$datanapisaniapostu[11];
  8. $R=date('y');
  9. $M=date('m');
  10. $D=date('d');
  11. $H=date('H');
  12. $I=date('i');
  13. $S=date('s');
ale już kulturalnie podałem policzone wartości jako 10 typu int, a więc bez dodatkowej konwersji typów. I tak kod poległ wolniejszy. Nadal masz wątpliwości czy test przeprowadzisz tym razem bez tekstów: "Wasze propozycje są również dobre, choć o bardziej czasochłonne." i PO testach czasowych. To, że ja wolę wykorzystać sprawdzone metody, zamiast po raz 1000 wymyślać koło na nowo nie świadczy o mojej ułomności, ale fakcie, że jestem inteligentny na tyle, by tego nie robić. Znam model matematyczny obliczania dni i co z tego? To koniecznie powód, by z niego korzystać? Zrobię to wtedy, gdy PHP nie udostępni mi gotowego lub zaproponowany przez język sposób/funkcja nie będą odpowiednio wydajne dla moich potrzeb.

To co zrobiłeś to "sztuka dla sztuki" i każdy przeglądający Twój kod będzie się zastanawiał CO Ty właściwie zrobiłeś. Mój czyta się po prostu wygodnie. Jest przejrzysty niemal do bólu. Jedyny zgryz może mieć człowiek gdy natknie się na abs. A zastosowałem to tylko po to, by można było stosować daty zamiennie. Twój kod wysypie wtedy tekstem o "podróży w czasie". Tak więc kolejny "minus" na konto Twojej funkcji. Jedyną osoą w temacie, która uważa że robi coś lepiej jesteś Ty. Nie mając bowiem nawet kodu z naszej strony założyłeś, że i tak Twój sposób jest lepszy. Do tego oczywiście nie wiesz chyba, że obliczenia silnika bazy danych są wielokrotnie szybsze niż obliczenia php jako języka interpretowanego. Nawet kilkunastokrotnie. No ale lepiej sypnąć, że się jest mastahem, kompletnie olewając testy jakiekolwiek. Ja Ci tylko zrobiłem test po stronie php. Gdybym miał zrobić test kodu php z zapytaniem sql, to byś się pogrążył. A czemu? Bo byś miał taki ciąg u siebie:
a) pobierz rekordy
b) policz czy można je wyświetlić (wolniejsze niż sprawdzenie w bazie)
c) wyświetl możliwe
versus
a) pobierz rekordy pasujące (tu są obliczenia wiele razy szybsze, bo na poziomie silnika, a nie interpretera języka)
b) wyświetl je

Dalej mam Ci wyjaśniać różnice czy już wystarczająco mocno pokazałem, że co jak co, ale zaledwie musnąłeś problem, który vokiel czy ja rozwiązaliśmy obszerniej, a na dodatek bez tekstów "mój kod lepszy i koniec"?


PS: z parkowaniem mnie rozwaliłeś :D Właśnie akurat teraz zdaję kurs prawa jazdy i wiesz co? Instruktor na kursie gdy widział jak parkuję stwierdził, że "gdyby kursanci robili to tak bezproblemowo jak Ty, to nie musiałbym parkowania uczyć". Dodam, że powiedział to gdy pierwszy raz miałem równoległe, czyli popularna "kopertę". Czyli jestem zajebistym kierowcą? Akurat tego bym nie twierdził, bo już po chwili przejeżdżałem na 4 biegu przez skrzyżowanie na pomarańczowym, a na następnej godzinie wchodziłem poślizgiem w zakręt 90 stopni mając 50 na liczniku i nogę na gazie, co on prawie palpitacjami przypłacił.
Go to the top of the page
+Quote Post

Posty w temacie
- dark_lion   [PHP] wygasniecie newsa   10.01.2011, 17:18:48
- - MateuszS   Możesz to zrobić zwyczajnie sprawdzając datę newsa...   10.01.2011, 19:19:57
- - vokiel   A nie lepiej po prostu wyświetlać newsy, których d...   10.01.2011, 19:51:05
- - dark_lion   hm najlepiej jak podam przykład. Chodzi mi o to ze...   10.01.2011, 20:02:42
- - thek   Najprościej? Niech ustawia datę/czas wygaśnięcia i...   10.01.2011, 20:31:00
- - dark_lion   thek czy mogłbym cie prosic o mały przyklad ? nie...   10.01.2011, 20:55:15
- - benio101   Użytkownik dodaje parametr, po jakim czasie ma się...   10.01.2011, 21:11:01
- - vokiel   @benio101, nie zrozum mnie źle, ale co to jest? 3...   10.01.2011, 21:56:02
|- - benio101   Cytat(vokiel @ 10.01.2011, 21:56:02 )...   11.01.2011, 15:32:01
- - thek   A po co aż takie kombinowanie vokiel? Jeśli data j...   11.01.2011, 00:29:40
- - vokiel   Cytat(thek @ 11.01.2011, 00:29:40 ) A...   11.01.2011, 10:09:43
- - thek   Z doświadczenia Ci powiem vokiel, że dodawanie i o...   11.01.2011, 11:49:36
- - vokiel   Tu się chyba thek nie zrozumieliśmy. Miałem na myś...   11.01.2011, 13:24:30
- - thek   Ok... Takie coś ma sens jak napisałeś, ale jedynie...   11.01.2011, 14:01:59
- - vokiel   Cytat(benio101 @ 11.01.2011, 15:32:01...   11.01.2011, 18:29:26
- - thek   Tu się zgodzę z vokielem. Bez urazy benio, ale Twó...   12.01.2011, 00:00:44
- - melkorm   Albo użyć chociażby obiektu DateTime gdzie przy uż...   12.01.2011, 00:03:49
- - thek   Byłbym zapomniał benio.... Nie widzisz skali probl...   12.01.2011, 08:49:45
- - benio101   Tyle tylko, że rozwiązałem całkowicie problem tak,...   12.01.2011, 12:42:57
- - thek   RE: [PHP] wygasniecie newsa   12.01.2011, 15:05:30
- - vokiel   Po pierwsze benio101 przyjrzyj się tematowi, i prz...   12.01.2011, 15:53:32
- - thek   @vokiel: Celna uwaga Temat jak widzisz nie jest o...   12.01.2011, 16:19:00


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.10.2025 - 00:48