Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][Laravel]obsługa błędów -> strona 404
Forum PHP.pl > Forum > Przedszkole
Sklep102
Mam pytanie odnośnie przekierowywania do konkretnego blade jeśli wykryję problem z bazy danych, wszystko jest fajnie do kiedy chce zrobić nieprzekierowanie ponieważ wyskakuje błąd

SQLSTATE[42S02]: Base table or view not found: 1146 Table 'shop.products' doesn't exist (SQL: select count(*) as aggregate from `products` where `activ` = 1)


  1.  
  2. // Test database connection
  3. try {
  4. DB::connection()->getPdo();
  5. } catch (\Exception $e) {
  6. $error = "db";
  7. return view('sites.error', compact('error'));
  8. }
  9.  
  10.  
  11. $prod= DB::table('products')
  12. ->where('activ', '=', '1')
  13. ->paginate(28);
  14.  
  15. $count_prod = DB::table('products')->count();
  16.  
  17.  
  18.  
  19. return view('sites.index', compact('prod', 'count_prod'));
  20.  

rozumiem błąd który wyskakuje ale nie wiem jak mam przekierowywać do konkretnego blade np. error gdzie wyświetli się konkretny wygląd
Sklep102
  1.  
  2. public function check_db()
  3. {
  4. try {
  5. $product = DB::table('product')->get();
  6. $users = DB::table('users')->get();
  7.  
  8. }
  9. catch (PDOException $e) {
  10.  
  11. return response()->view('sites.error', compact('e'));
  12. return view('sites.error', compact('e'));
  13. }
  14. }
  15.  
  16.  
  17. public function index()
  18. {
  19. return $this->check_db(); // if error db return blade error
  20.  
  21. $product = DB::table('product')
  22. ->where('activ', '=', '1')
  23. ->paginate(28);
  24.  
  25. $count_product = DB::table('product')->count();
  26.  
  27. return view('sites.index', compact('product', 'count_product '));
  28.  
  29.  
  30. }
  31.  


Może za bardzo zamieszałem chodzi mi oto żeby sprawdzić czy istnieje baza danych oraz tabele jeśli nie to przenosi mnie do przycisku. Wpadłem więc na pomysł żeby zrobić funkcję i zaimportować ją do każdej kwerendy ale nie działa to prawidłowo może ktoś ma łatwe rozwiązanie
viking
Co ty w ogóle tworzysz? Zastanów się co to oznacza od strony programistycznej. Do bazy danych nawiązujesz połączenie określonymi poświadczeniami (czyli już na poziomie nawiązania połączenia musisz znać dane jak baza, login, pass) a chyba nie robisz takiej głupoty że aplikacja działa jako root? Jeśli to mysql to dane możesz wyciągnąć z INFORMATION_SCHEMA albo z polecenia SHOW DATABASES.
Sklep102
Aplikacja działa na root ponieważ strona nie będzie dostępna publicznie służy tylko do nauki. Próbuje ogarnąć w jaki sposób sprawdzić czy baza danych oraz tabele istnieją zanim wyświetli się strona jeśli nie (przenosi mnie do przycisku który tworzy bazę danych oraz tablę. to już mam zrobione)
viking
Za tworzenie odpowiednich tabel są odpowiedzialne migracje. Reszta jak napisałem.
netir
Cytat(Sklep102 @ 26.06.2020, 13:52:31 ) *
Aplikacja działa na root ponieważ strona nie będzie dostępna publicznie służy tylko do nauki. Próbuje ogarnąć w jaki sposób sprawdzić czy baza danych oraz tabele istnieją zanim wyświetli się strona jeśli nie (przenosi mnie do przycisku który tworzy bazę danych oraz tablę. to już mam zrobione)


Twoja koncepcja nauki nie jest dobra bo nigdy w rzeczywistości nie spotkasz się z funkcjonalnością tworzenia tabeli pod przyciskiem, dlatego, że model bazy wymaga zawsze implementacji w kodzie. Tak jak było wyżej napisane, od tego są migracje, a sprawdzanie czy tabela już istnieje możesz zrobić w nich prostym warunkiem.

Zresztą Laravel wyrzuci Ci błędy już na samym początku, jak baza nie będzie podpięta w envie prawidłowo i skonfigurowana w cfg.
Sklep102
Cytat(netir @ 26.06.2020, 14:33:04 ) *
Twoja koncepcja nauki nie jest dobra bo nigdy w rzeczywistości nie spotkasz się z funkcjonalnością tworzenia tabeli pod przyciskiem, dlatego, że model bazy wymaga zawsze implementacji w kodzie. Tak jak było wyżej napisane, od tego są migracje, a sprawdzanie czy tabela już istnieje możesz zrobić w nich prostym warunkiem.

Zresztą Laravel wyrzuci Ci błędy już na samym początku, jak baza nie będzie podpięta w envie prawidłowo i skonfigurowana w cfg.


Chodziło mi o to że laravel wyrzuca błąd np. brak bazy danych i chciałem wyświetlić konkretną stronę zamiast błędu i udało mi się to tylko mam pytanie odnośnie implementacji. Mianowicie

  1.  
  2. public function db_check(){
  3.  
  4.  
  5. //check connection to db
  6. try {
  7. $db = DB::connection()->getPdo();
  8.  
  9.  
  10. }
  11. catch (PDOException $e) {
  12. $db_connection = "error to connection db";
  13. return view('sites.error', compact('db_connection'));
  14. }
  15.  
  16.  
  17.  
  18. }
  19.  
  20.  
  21.  
  22.  
  23. public function index()
  24. {
  25.  
  26. return $this->db_check();
  27.  
  28.  
  29. select danych ....
  30. return view('sites.index', compact('product', 'count_product'));
  31.  
  32.  
  33.  
  34.  
  35. }
  36.  
  37.  

i Funkcja index zwraca tylko funkcję db_check bez wykonania dalszego kodu w jaki sposób zaimportować fukcję db_check tak aby działała reszta kodu?
oczywiście można zrobić

  1. try {
  2. $db = DB::connection()->getPdo();
  3.  
  4. select danych ....
  5. return view('sites.index', compact('product', 'count_product'));
  6.  
  7. }catch (PDOException $e) {
  8. $db_connection = "error to connection db";
  9. return view('sites.error', compact('db_connection'));
  10. }
  11.  
  12.  
ale wydaje mi się że jest jakieś prostsze rozwiązanie

a co do implementacji w kodzie rozumiem to mam stworzone migrację i jeśli nie będzie bazy danych to przycisk ją stworzy (nazwa) z pliku .env i wykona migrację to wszystko.
netir
Cytat(Sklep102 @ 26.06.2020, 16:37:15 ) *
Chodziło mi o to że laravel wyrzuca błąd np. brak bazy danych i chciałem wyświetlić konkretną stronę zamiast błędu i udało mi się to tylko mam pytanie odnośnie implementacji. Mianowicie


Wyrzuca Ci błąd bo masz w .env włączony DEBUG, jak zmienisz wersję z lokalnej na produkcyjną i wyłączysz DEBUG to ewentualne błędy będą zapisywane w logach i wyświetli się tylko strona z widokiem kodu błędu (możesz ją sobie ostylować, jak tam chcesz). Mam nadzieje, że nie chodzi Ci po głowie wyświetlanie użytkownikowi komunikatu o braku tabeli bo narażasz się na ataki podając takie informacje publicznie.

Ogólnie dobrze, że się uczysz, ale nie bądź uparty i nie brnij w tą chorą logikę dalej.

To rozwiązuje cały twój problem: https://laravel.com/docs/7.x/errors#custom-http-error-pages
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.