Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP][Laravel]obsługa błędów -> strona 404
Sklep102
post 24.06.2020, 18:22:37
Post #1





Grupa: Zarejestrowani
Postów: 56
Pomógł: 0
Dołączył: 5.12.2019

Ostrzeżenie: (0%)
-----


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

Ten post edytował Sklep102 24.06.2020, 18:23:05
Go to the top of the page
+Quote Post
viking
post 24.06.2020, 18:57:34
Post #2





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1114
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


https://laravel.com/docs/7.x/errors#render-method


--------------------
Go to the top of the page
+Quote Post
Sklep102
post 26.06.2020, 01:19:23
Post #3





Grupa: Zarejestrowani
Postów: 56
Pomógł: 0
Dołączył: 5.12.2019

Ostrzeżenie: (0%)
-----


  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

Ten post edytował Sklep102 26.06.2020, 01:20:09
Go to the top of the page
+Quote Post
viking
post 26.06.2020, 05:46:46
Post #4





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1114
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


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.


--------------------
Go to the top of the page
+Quote Post
Sklep102
post 26.06.2020, 12:52:31
Post #5





Grupa: Zarejestrowani
Postów: 56
Pomógł: 0
Dołączył: 5.12.2019

Ostrzeżenie: (0%)
-----


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)
Go to the top of the page
+Quote Post
viking
post 26.06.2020, 12:56:25
Post #6





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1114
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


Za tworzenie odpowiednich tabel są odpowiedzialne migracje. Reszta jak napisałem.


--------------------
Go to the top of the page
+Quote Post
netir
post 26.06.2020, 13:33:04
Post #7





Grupa: Zarejestrowani
Postów: 44
Pomógł: 5
Dołączył: 20.05.2019

Ostrzeżenie: (0%)
-----


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.

Ten post edytował netir 26.06.2020, 13:35:22
Go to the top of the page
+Quote Post
Sklep102
post 26.06.2020, 15:37:15
Post #8





Grupa: Zarejestrowani
Postów: 56
Pomógł: 0
Dołączył: 5.12.2019

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
netir
post 26.06.2020, 15:52:05
Post #9





Grupa: Zarejestrowani
Postów: 44
Pomógł: 5
Dołączył: 20.05.2019

Ostrzeżenie: (0%)
-----


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

Ten post edytował netir 26.06.2020, 15:53:21
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 26.04.2024 - 14:11