• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Wyszukanie posta za pomocą czasu.

Object Storage Arubacloud
0 głosów
268 wizyt
pytanie zadane 15 czerwca 2017 w PHP przez Paweł123 Nałogowiec (33,500 p.)

Cześć, uczę się php. Zbudował bardzo prosty system dodawania postów na stronę. Teraz próbuje zrobić, wyszukiwanie posta za pomocą daty. Wszystko ładnie działa kiedy wpisuję np.: 2017-06-14 16:31:37. Kiedy próbuje wpisać tylko rok i miesiąc to nie mogę znaleźć posta, który przecież istnienie.

Czy ktoś wie dlaczego tak się dzieje? 

Czy ktoś wie co trzeba zrobić, aby działał rok i miesiąc.

<?php 
    // łączymy się z bazą danych 
    $connection = @mysql_connect('localhost', 'admin', 'admin') 
    or die('Brak połączenia z serwerem MySQL'); 
    $db = @mysql_select_db('admin', $connection) 
    or die('Nie mogę połączyć się z bazą danych'); 
     
?>
<!DOCTYPE HTML>
<html lang="pl">
<head>
	<meta charset="utf-8" />
	<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
	<title>Tytył strony</title>

</head>

<body>

<p><b>Archiwum:</b></p>
<form method="post">
Czas posta:<input type="text" name="archiwum_d">
<input type="submit" value="Sprawdz" />
</form>


<?php

    $archiwum_d = $_POST['archiwum_d']; 

    $wynik = mysql_query("SELECT * FROM test WHERE czas='$archiwum_d'"); 

    if(mysql_num_rows($wynik) > 0)
    {
        while($dane = mysql_fetch_assoc($wynik)) 
        {
     
        echo "<div>".$dane['imie']."</div><br>"; 
        echo "<div>".$dane['email']."</div><br>"; 
        echo "<div>".$dane['massage']."</div><br>"; 
        echo "<div>".$dane['czas']."</div>"; 
        
        } 
    }
    else
    {
        echo "brak danych w bazie danych";
    }

    mysql_close($connection); 


?>
<br><br><br><br>
<a href="index.php">Dodawanie</a>
<a href="wyjmowanie.php">Wyjmowanie</a>
</body>
</html>

 

1
komentarz 16 czerwca 2017 przez efiku Szeryf (75,160 p.)
Twój kod to prehistoria. Nie odpalisz go na php7.

Sprawdź czy biblioteka Carbon nie rozwiązuje Twojego problemu.

I przerzucić się na PDO powinieneś.

1 odpowiedź

+1 głos
odpowiedź 15 czerwca 2017 przez Tomek Sochacki Ekspert (227,510 p.)
wybrane 16 czerwca 2017 przez Paweł123
 
Najlepsza
a jakiego typu masz pole w bazie danych MySQL?

Proponuję trzymać czas np. jako DATETIME, a od klienta pobierać trzy wartości, tj. rok, miesiąc, dzień (jako np. trzy inputy, albo data wybierana z jakiegoś kalendarzyka i przesyłana w 3 zmiennych) i weryfikowanie w zapytaniu MONTH, DAYOFMONTH, YEAR.
komentarz 16 czerwca 2017 przez Paweł123 Nałogowiec (33,500 p.)
Dane w bazie mam napisane w Datatime. Weryfikowanie w month? Czyli stowrzyć if'a?

 

Dopiero się uczę.
1
komentarz 16 czerwca 2017 przez Tomek Sochacki Ekspert (227,510 p.)

np. jeśli użytkownik podał tylko rok to możesz pobierać rekordy:

WHERE YEAR(czas) = $year

jeśli rok i miesiąc to:

WHERE YEAR(czas) = $year AND MONTH(czas) = $month

a jeśli rok, miesiąc i dzień to:

WHERE DATE(czas) = $year."-".$month."-".$day

funkcja DATE() zwraca datę w formacie yyyy-mm-dd więc do takiej musiałbyś sformatować w zapytaniu.

 

Zapytania te generowane w PHP można scalić w jedno z odpowiednim uwarunkowaniem istnienia poszczególnych elementów ale tutaj chciałem Ci rozpisać krok po kroku.

Nie jest to co prawda najlepszy sposób, bo jeśli zaraz chciałbyś dodać np. czas to szybko rośnie Ci ilość możliwości, ale na początek powinno wystarczyć.

I nie bój się używania funkcji na bazie w zapytaniach MySQL, jak DATE, MONTH, YEAR, DATE_ADD, DATE_SUB, MAX, MIN itp. itd. Ułatwiają one wiele operacji.

komentarz 16 czerwca 2017 przez Paweł123 Nałogowiec (33,500 p.)

Zrobiłem tak jak poleciłeś. 

  $wynik = mysql_query("SELECT * FROM test WHERE YEAR(czas)=$year"); 

Jednak coś nie działa i nie wiem dlaczego :( 

1
komentarz 16 czerwca 2017 przez Tomek Sochacki Ekspert (227,510 p.)
wrzuć najlepiej strukturę tabeli test i fragment kodu PHP gdzie przypisujesz wartość do $year (chodzi mi o sprawdzenie, czy na pewno jest tam rok w formacie YYYY).

Może problem leży w złym formacie przechowywania daty w bazie.
komentarz 16 czerwca 2017 przez Paweł123 Nałogowiec (33,500 p.)

Typ kolumny jest datatime.

Kod cały. 

<form method="post">
Czas posta:<input type="text" name="year">
<input type="submit" value="Sprawdz" />
</form>


<?php

    $archiwum_d = $_POST['archiwum_d']; 

    $wynik = mysql_query("SELECT * FROM test WHERE YEAR(czas)=$year"); 

    if(mysql_num_rows($wynik) > 0)
    {
        while($dane = mysql_fetch_assoc($wynik)) 
        {
     
        echo "<div>".$dane['imie']."</div><br>"; 
        echo "<div>".$dane['email']."</div><br>"; 
        echo "<div>".$dane['massage']."</div><br>"; 
        echo "<div>".$dane['czas']."</div>"; 
        
        } 
    }
    else
    {
        echo "brak danych w bazie danych";
    }

    mysql_close($connection); 


?>

 

1
komentarz 16 czerwca 2017 przez Tomek Sochacki Ekspert (227,510 p.)
Zerknij na http://sqlfiddle.com/#!9/ac323/1

Zrobiłem tam uproszczoną wersję Twojej tabeli i wisałem 3 rekordy, w tym 2 z datą z roku 2016 i w select pobrałem dokładnie te dwa rekordy (2017 nie został uwzględniony ze względu na klauzulę WHERE).

Problem więc leży prawdopodobnie nie tyle w bazie co w PHP.

A tak na marginesie to polecam pożegnać się z mysql na rzecz np. PDO w formie obiektowej. Ponad to poczytaj sobie o prepare, czyli przygotowaniu zapytania przed jego właściwym wysłaniem na serwer.

No i rzecz najważniejsza... nigdy, ale to przenigdy nie ufaj danym od klienta! Wrzucenie w select bezpośrednio danych z inputa to proszenie się o problemy.
komentarz 16 czerwca 2017 przez Paweł123 Nałogowiec (33,500 p.)
ok, dzięki za pomoc. Czyli lepiej korzystać z PDO. Masz jakiś dobry poradnik do tego?
1
komentarz 16 czerwca 2017 przez Tomek Sochacki Ekspert (227,510 p.)
Szczerze mówiąc podstaw PDO uczyłem się już dawno temu i generalnie jeśli opanujesz już w miarę solidnie podstawy PHP to bez większego problemu będziesz sobie radził po prostu z dokumentacjami i manualem.

Na początek nauki polecam jednak jakąś pozycję drukowaną, np. http://helion.pl/ksiazki/php-i-mysql-od-nowicjusza-do-wojownika-ninja-kevin-yank,phmnow.htm#format/e (osobiście jej za dobrze nie znam, ale część znajomych zaczynających naukę dobrze ją chwaliła).

Z tego co słyszałem, to prowadzi ona krok po kroku jakiś gotowy projekt w PHP+MySQL.

A tak na marginesie, to jeśli myślisz poważnie o back-endzie to polecam nieco poczytać więcej o tworzeniu baz. Zapoznaj się z takimi tematami jak indeksy (np. primary key), pola auto_increment, wartości domyślne itp.

Jeśli nie chcesz książek drukowanych to wpisz sobie w google PHP PDO i na pewno znajdziesz wiele dobrych poradników o podstawach.

No i w kwestii tych inputów... polecam poczytać np. o filter_var lub innych metodach analizy danych wejściowych.
komentarz 16 czerwca 2017 przez Paweł123 Nałogowiec (33,500 p.)
ok, dzięki ;D
komentarz 16 czerwca 2017 przez Tomek Sochacki Ekspert (227,510 p.)

a tak wracając do Twojego kodu to czy nie powinno być zamiast:

 $wynik = mysql_query("SELECT * FROM test WHERE YEAR(czas)=$year"); 

to:

$year = $_POST['year']; //+ walidacja :)
 $wynik = mysql_query("SELECT * FROM test WHERE YEAR(czas)=$year"); 

 

komentarz 16 czerwca 2017 przez Paweł123 Nałogowiec (33,500 p.)
Myślałem, aby zrobić walidacje przez JS.
komentarz 16 czerwca 2017 przez Tomek Sochacki Ekspert (227,510 p.)
jak najbardziej, a nawet powiedziałbym że obowiązkowo, ale tylko po to, żeby elegancko wskazać użytkownikowi, że podał złe dane...

natomiast po stronie serwerowej walidacja to OBOWIĄZEK OBOWIĄZKOWY, zupełnie niezależny od walidacji u klienta.

A co, jeśli klient wyłączy obsługę JS? Wysyłamy wtedy do PHP ciąg bez żadnej weryfikacji co przy obsłudze baz danych może przysporzyć problemów.
komentarz 16 czerwca 2017 przez Paweł123 Nałogowiec (33,500 p.)
Robię coś takiego, że zabezpieczam stronę pod względem wyłączonego JS. Ukrywałam całą treść strony do czasu, kiedy użytkownik z powrotem włączy JS w przeglądarce.

Jednak chyba przerzucę się na walidację po stronie serwer.
komentarz 16 czerwca 2017 przez Tomek Sochacki Ekspert (227,510 p.)
nie ukrywaj strony dla usera bez JS, chyba, że faktycznie masz tak dużo JS, że bez tego stronka nie ruszy.

Jeśli jednak jest to prosta stronka i jakiś formularz to łatwo można dostosować stronę zarówno do userów z JS jak i bez niego. Pamiętaj, że stronka może być oglądana nie tylko na PC i smartfonie ale również na tabletach, telewizorach smart, konsolach, ebookach itp. i nigdy nie masz 100% pewności co do poziomu obsługi JS oraz co ważne, do możliwości jego włączania/wyłączania.
komentarz 16 czerwca 2017 przez Paweł123 Nałogowiec (33,500 p.)
Ok teraz rozumiem. Dzięki za informacje.

Podobne pytania

0 głosów
1 odpowiedź 313 wizyt
0 głosów
0 odpowiedzi 183 wizyt
+1 głos
0 odpowiedzi 161 wizyt

92,579 zapytań

141,431 odpowiedzi

319,657 komentarzy

61,963 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...