Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL][PHP]Połączenie z MySQL w funkcji
Laxus
post 3.08.2017, 19:14:53
Post #1





Grupa: Zarejestrowani
Postów: 12
Pomógł: 0
Dołączył: 5.03.2017

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


Witam.

Mam taki mały problem. Napisałem sobie takiego twora w pliku connect.php:

  1. <?php
  2.  
  3. $db_host = 'localhost';
  4. $db_usr = 'root';
  5. $db_pass = '';
  6. $db_name = 'test';
  7.  
  8. function db_connect( $host, $user, $password, $name ) {
  9.  
  10. try {
  11.  
  12. $mysqli = new Mysqli( $host, $user, $password, $name );
  13. $mysqli -> set_charset( 'utf8' );
  14.  
  15. } catch( Exception $e ) {
  16.  
  17. echo 'ERROR: ' . $e -> getMessage();
  18.  
  19. }
  20.  
  21. }
  22.  
  23. ?>


Następnie w pliku lista_kontrahentow.php wywołuję funkcję db_connect i tworzę funkcję wykonującą zapytanie:
  1. <?php
  2.  
  3. include_once( 'connect.php' );
  4. db_connect( $db_host, $db_usr, $db_pass, $db_name );
  5.  
  6. function wyswietl_kontrahentow() {
  7.  
  8. $sql = $mysqli -> query( "SELECT * FROM kontrahenci" );
  9.  
  10. }
  11.  
  12. ?>


W jeszcze osobnym pliku kontrahenci.php wywołuję funkcję wyświetl_kontrahentow:
  1. <?php
  2.  
  3. include_once( 'lista_kontrahentow.php' );
  4.  
  5. wyswietl_kontrahentow();
  6.  
  7. ?>


W rezultacie dostaję alerty:

Notice: Undefined variable: mysqli in C:\xampp\htdocs\test\subpages\lista_kontrahentow.php on line 8

Fatal error: Call to a member function query() on null in C:\xampp\htdocs\test\subpages\lista_kontrahentow.php on line 8


Jak w pliku connect.php wprowadzę jakieś niepoprawne dane do połączenia z bazą, to przy wywołaniu funkcji db_connect w innym pliku wywala alerty, więc działa blok try... catch.
Domyślam się, że problem dotyczy zasięgu zmiennych w funkcjach. Próbowałem dopisać return $mysqli na koniec bloku try w funkcji db_connect, lecz nic mi to nie daje.
Jak mam to naprawić?
Go to the top of the page
+Quote Post
Lord
post 3.08.2017, 19:18:10
Post #2





Grupa: Zarejestrowani
Postów: 239
Pomógł: 32
Dołączył: 10.03.2004

Ostrzeżenie: (10%)
X----


nie zwracasz ani nieprzekazujesz zmiennej $mysqli

ona jest widoczna tylko w zakresie funkcji

db_connect() a potem nie mam prawa jej nikt widzieć
Go to the top of the page
+Quote Post
Pyton_000
post 3.08.2017, 19:18:44
Post #3





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


$mysqli nie jest widoczne w funkcji, musisz ją przekazać jako parametr.

I to co wyżej kolega. Nie zwracasz $mysql spoza connect.

Ten post edytował Pyton_000 3.08.2017, 19:19:19
Go to the top of the page
+Quote Post
Laxus
post 3.08.2017, 19:27:58
Post #4





Grupa: Zarejestrowani
Postów: 12
Pomógł: 0
Dołączył: 5.03.2017

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


OK. Chyba już rozumiem.
Poprawiłem w ten sposób i błędów nie ma:

connect.php
  1. <?php
  2.  
  3. $db_host = 'localhost';
  4. $db_usr = 'root';
  5. $db_pass = '';
  6. $db_name = 'test';
  7.  
  8. function db_connect( $host, $user, $password, $name ) {
  9.  
  10. try {
  11.  
  12. $mysqli = new Mysqli( $host, $user, $password, $name );
  13. $mysqli -> set_charset( 'utf8' );
  14. return $mysqli;
  15.  
  16. } catch( Exception $e ) {
  17.  
  18. echo 'ERROR: ' . $e -> getMessage();
  19.  
  20. }
  21.  
  22. }
  23.  
  24. ?>


lista_kontrahentow.php
  1. <?php
  2.  
  3. include_once( 'connect.php' );
  4.  
  5.  
  6. function wyswietl_kontrahentow( $db_host, $db_usr, $db_pass, $db_name ) {
  7.  
  8. $mysqli = db_connect( $db_host, $db_usr, $db_pass, $db_name );
  9. $sql = $mysqli -> query( "SELECT * FROM kontrahenci" );
  10.  
  11. }
  12.  
  13. ?>


kontrahenci.php
  1. <?php
  2.  
  3. include_once( 'lista_kontrahentow.php' );
  4.  
  5. wyswietl_kontrahentow( $db_host, $db_usr, $db_pass, $db_name );
  6.  
  7. ?>

Go to the top of the page
+Quote Post
viking
post 4.08.2017, 05:16:22
Post #5





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

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


Troszkę masz bez sensu wyswietl_kontrahentow bo jak już to powinno przyjmować gotowy obiekt mysqli a nie całą konfigurację bazy. A najlepiej tylko dane specyficzne czyli np jakieś warunki filtrowania.


--------------------
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: 29.03.2024 - 12:43