Błąd z połączeniem bazy MySQL

1

Witam.

Jestem tu nowy, zainteresowało mnie programowanie stron www. Jestem samoukiem w kodowaniu HTML, CSS, JavaScript i php. Próbuje się pobawić z php i MySql ze stworzeniem sobie prostej bazy danych ale tutaj napotykam problem ze zwykłym połączeniem się z bazą MySql z formularza Html i php.

Tworze plik w html formularz i dodatkowo w php sprawdzenie połączenia i za każdym razem albo nic nie ma, albo pokazuje mi cały skrypt php na stronie. Mam włączony Xamp i załączony Apache i MySql, Baza danych też jest utworzona.

Co robię źle?

Kod HTML

<!DOCTYPE html>
<html lang="pl">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Test połączenia z bazą danych</title>
</head>
<body>
    <h1>Sprawdź połączenie z bazą danych</h1>
    <form action="connection.php" method="post">
        <button type="submit">Testuj połączenie</button>
    </form>
</body>
</html>

Kod PHP (connetion.php)

<?php
// Parametry połączenia z bazą danych
$host = 'localhost'; // Adres serwera
$username = 'root';  // Domyślny użytkownik MySQL
$password = "";      // Hasło użytkownika MySQL (domyślnie puste)
$dbname = 'test_db'; // Nazwa bazy danych

// Próba połączenia z bazą danych
$conn = new mysqli($host, $username, $password, $dbname);

// Sprawdzenie, czy połączenie się powiodło
if ($conn->connect_error) {
    die("Nie udało się połączyć z bazą danych: " . $conn->connect_error);
}
echo "Połączenie z bazą danych zakończone sukcesem!";
?>

Proszę o pomoc.

0

Adam, cześć!

Jak konkretnie błąd wygladą? co pisze?

dodaj echo $mysqli->connect_errno . "\n"; zaraz po $conn = new mysqli(...).

Ten if powinen sprawdzić errno zamiast error ale nie pamietam czy to koniecznie.

1

Spróbuj skorzystać z PDO. mysqli ma sporo wad i jest przestarzałe, jest też łatwiej zrobić lukę w bezpieczeństwie, np. przez brak prepared statements. Zamiast tego polecam PDO, które też jest wbudowane w PHP 😉

<?php

$hostname = "localhost";
$database = "test_db";
$username = 'root';
$password = 'pass';

$pdo = new PDO("mysql:host=$hostname;dbname=$database", $username, $password);

$unbufferedResult = $pdo->query("SELECT 'foo' AS name;");
foreach ($unbufferedResult as $row) {
    echo $row['name'] . PHP_EOL;
}
0

Kombinowałem to co podaliście i dalej nic nie wychodzi. W chrome po kliknięciu w odnośnik pojawia się biała strona z kodem php.

0
Adam85Pń napisał(a):

Kombinowałem to co podaliście i dalej nic nie wychodzi. W chrome po kliknięciu w odnośnik pojawia się biała strona z kodem php.

To najprawdopodobniej baza danych albo się nie uruchomiła, albo nasłuchuje na innym porcie niż domyślny, albo odrzuca połączenie, albo dane dostępowe są niepoprawne, albo ewentualnie Twój skrypt nie może się połączyć z bazą bo albo nie ma dostępu albo jest w innej sieci.

W jaki sposób uruchomiłeś bazę?

0
Riddle napisał(a):
Adam85Pń napisał(a):

Kombinowałem to co podaliście i dalej nic nie wychodzi. W chrome po kliknięciu w odnośnik pojawia się biała strona z kodem php.

To najprawdopodobniej baza danych albo się nie uruchomiła, albo nasłuchuje na innym porcie niż domyślny, albo odrzuca połączenie, albo dane dostępowe są niepoprawne, albo ewentualnie Twój skrypt nie może się połączyć z bazą bo albo nie ma dostępu albo jest w innej sieci.

W jaki sposób uruchomiłeś bazę?

Uruchomiłem w panelu kontrolnym klikając start na Apache i MySql. W database stworzyłem tabela i nic więcej nie grzebałem. A może sprawdzić na innym serwerze lokalnym? (Jak tak to jaki byś polecił?)

0
Adam85Pń napisał(a):

Uruchomiłem w panelu kontrolnym klikając start na Apache i MySql. W database stworzyłem tabela i nic więcej nie grzebałem. A może sprawdzić na innym serwerze lokalnym? (Jak tak to jaki byś polecił?)

Jeśli masz dockera, to lokalną bazę danych można postawić jednym poleceniem:

docker run -e MYSQL_ROOT_PASSWORD=pass -e MYSQL_DATABASE=test_db -p 3306:3306 mysql:5.6

Ja właśnie w taki sposób uruchamiam lokalnie bazy, a sam serwer uruchamiam poleceniem wbudowanym w PHP: php -S localhost:8080, nie potrzebuję Apache ani LAMP/WAMP żeby zacząć tworzyć aplikację.

Wyjaśnienie komendy:

  • docker run polecenie dockera do uruchomienia kontenera (takiej mini-maszyny wirtualnej) z obrazu mysql
  • -e MYSQL_ROOT_PASSWORD=pass, przekazanie umówionej zmiennej środowiskowej do kontenera - obraz jest nauczony stworzyć użytkownika z hasłem z treści tej zmiennej
  • -e MYSQL_DATABASE to samo, tylko z nazwą bazy
  • -p 3306:3306 polecenie dockera, żeby otworzył port 3306 w taki sposób żebyś ze swojego lokalnego komputera mógł się połączyć z serverem mysql w kontenerze przez ten port.
  • mysql:5.6 nazwa obrazu oraz tag z hub.docker.com z obrazem. Tagi najczęściej oznaczają wersję serwera.
2

Tutaj problem raczej będzie po stronie serwera apache nie interpretuje skryptów php musisz w plikach konfiguracyjnych apacha znaleźć opcje, żeby pliki o rozrzerzeniu php uruchamiał.

1
tomixtomi0001 napisał(a):

Tutaj problem raczej będzie po stronie serwera apache nie interpretuje skryptów php musisz w plikach konfiguracyjnych apacha znaleźć opcje, żeby pliki o rozrzerzeniu php uruchamiał.

Dobry pomysł! 👍 Nie pomyślałem o tym 😄

@Adam85Pń Spróbuj tymczasowo zmienić swój plik na coś takiego:

<?php
echo "Hello, world!";

// Parametry połączenia z bazą danych
// $host = 'localhost'; // Adres serwera
// $username = 'root';  // Domyślny użytkownik MySQL
// $password = "";      // Hasło użytkownika MySQL (domyślnie puste)
// $dbname = 'test_db'; // Nazwa bazy danych
// 
// Próba połączenia z bazą danych
// $conn = new mysqli($host, $username, $password, $dbname);
// 
// Sprawdzenie, czy połączenie się powiodło
// if ($conn->connect_error) {
//     die("Nie udało się połączyć z bazą danych: " . $conn->connect_error);
// }
// echo "Połączenie z bazą danych zakończone sukcesem!";
?>

I daj znać czy jak odwiedzisz http://localhost/connection.php to czy to widzisz? 🤔

0
Riddle napisał(a):
tomixtomi0001 napisał(a):

Tutaj problem raczej będzie po stronie serwera apache nie interpretuje skryptów php musisz w plikach konfiguracyjnych apacha znaleźć opcje, żeby pliki o rozrzerzeniu php uruchamiał.

Dobry pomysł! 👍 Nie pomyślałem o tym 😄

@Adam85Pń Spróbuj tymczasowo zmienić swój plik na coś takiego:

<?php
echo "Hello, world!";

// Parametry połączenia z bazą danych
// $host = 'localhost'; // Adres serwera
// $username = 'root';  // Domyślny użytkownik MySQL
// $password = "";      // Hasło użytkownika MySQL (domyślnie puste)
// $dbname = 'test_db'; // Nazwa bazy danych
// 
// Próba połączenia z bazą danych
// $conn = new mysqli($host, $username, $password, $dbname);
// 
// Sprawdzenie, czy połączenie się powiodło
// if ($conn->connect_error) {
//     die("Nie udało się połączyć z bazą danych: " . $conn->connect_error);
// }
// echo "Połączenie z bazą danych zakończone sukcesem!";
?>

I daj znać czy jak odwiedzisz http://localhost/connection.php to czy to widzisz? 🤔

Zrobiłem tak. Na stronie wyświetliło się sam napis Hello World.

1
Adam85Pń napisał(a):

Zrobiłem tak. Na stronie wyświetliło się sam napis Hello World.

Okay, super! 🥳 Czyli skrypt się włącza, to dobra wiadomość.

Adam85Pń napisał(a):
Riddle napisał(a):

W jaki sposób uruchomiłeś bazę?

Uruchomiłem w panelu kontrolnym klikając start na Apache i MySql. W database stworzyłem tabela i nic więcej nie grzebałem.

Powiedz mi jeszcze, co to za panel kontrolny?

0
Riddle napisał(a):
Adam85Pń napisał(a):

Zrobiłem tak. Na stronie wyświetliło się sam napis Hello World.

Okay, super! 🥳 Czyli skrypt się włącza, to dobra wiadomość.

Adam85Pń napisał(a):
Riddle napisał(a):

W jaki sposób uruchomiłeś bazę?

Uruchomiłem w panelu kontrolnym klikając start na Apache i MySql. W database stworzyłem tabela i nic więcej nie grzebałem.

Powiedz mi jeszcze, co to za panel kontrolny?

Do włączania usług w xampie, nie wiem jak mam to opisać.

Nie wiem, może jak masz chwile czasu to rzucisz okiem na xampa. Bardziej się ogarniesz niż ja.

0
Adam85Pń napisał(a):

Do włączania usług w xampie, nie wiem jak mam to opisać.

Nie wiem, może jak masz chwile czasu to rzucisz okiem na xampa. Bardziej się ogarniesz niż ja.

A koniecznie chcesz używać XAMPP'a?

0
Riddle napisał(a):
Adam85Pń napisał(a):

Do włączania usług w xampie, nie wiem jak mam to opisać.

Nie wiem, może jak masz chwile czasu to rzucisz okiem na xampa. Bardziej się ogarniesz niż ja.

A koniecznie chcesz używać XAMPP'a?

No właśnie szukam na necie jakiegoś innego w miarę łatwego programu który ogarnę z moim małym doświadczeniem żeby się pobawić i nabrać wiedzy w programowaniu. Taki żebym mógł stworzyć baze danych i dodawać tam rekordy i takie tam.

Polecisz coś?

0
Adam85Pń napisał(a):

No właśnie szukam na necie jakiegoś innego w miarę łatwego programu który ogarnę z moim małym doświadczeniem żeby się pobawić i nabrać wiedzy w programowaniu. Taki żebym mógł stworzyć baze danych i dodawać tam rekordy i takie tam.

Polecisz coś?

Mówiłem już - ja korzytam z dockera, to super technologia do korzystania z wielu różnych programów, szybko i łatwo. Można stawiać wiele różnych baz, nawet na raz, usuwać, wyłączać i włączać je bardzo prosto. No ale wymaga to zaznajomienia się z dockerem - co i tak jest plusem, bo to jest super technologia, warto ją znać. Jak się przekaże flagę -d, to można nawet wyłączyć terminal a baza nadal działa.

Alternatywa to po prostu zainstalować samego MySQL'a lokalnie bez XAMPPA, ale tego raczej bym nie polecał, z uwagi na to że korzystanie z bazy z dockerem jest dużo wygodniejsze.

Ja tak dobrze xamppa nie znam, więc nie pomogę z tym co tam nie działa. Pewnie nie postawił bazy odpowiednio, albo baza nasłuchuje na innym porcie.

0
Riddle napisał(a):
Adam85Pń napisał(a):

No właśnie szukam na necie jakiegoś innego w miarę łatwego programu który ogarnę z moim małym doświadczeniem żeby się pobawić i nabrać wiedzy w programowaniu. Taki żebym mógł stworzyć baze danych i dodawać tam rekordy i takie tam.

Polecisz coś?

Mówiłem już - ja korzytam z dockera, to super technologia do korzystania z wielu różnych programów, szybko i łatwo. Można stawiać wiele różnych baz, nawet na raz, usuwać, wyłączać i włączać je bardzo prosto. No ale wymaga to zaznajomienia się z dockerem - co i tak jest plusem, bo to jest super technologia, warto ją znać. Jak się przekaże flagę -d, to można nawet wyłączyć terminal a baza nadal działa.

Alternatywa to po prostu zainstalować samego MySQL'a lokalnie bez XAMPPA, ale tego raczej bym nie polecał, z uwagi na to że korzystanie z bazy z dockerem jest dużo wygodniejsze.

Ja tak dobrze xamppa nie znam, więc nie pomogę z tym co tam nie działa. Pewnie nie postawił bazy odpowiednio, albo baza nasłuchuje na innym porcie.

Robię to samo ale na WebServ. Test połączenia z bazą danych i wyskakuje biała strona i pokazuje kod php. Nie ogarniam tego. Poczytam na necie może dojdę do tego co jest nie tak.

Dzięki za odpowiedzi.

0

Jeśli w tym kodzie PHP wyświetlonym widzisz znaczniki rozpoczęcia skryptu czyli <?php to kod jednak nie jest Interpretowany. Gdzie umieszczasz ten kod? W jakim katalogu?
Zrezygnuj z tagu zamykającego.kod w pliku.
Plik connection.php możesz przetestować z linii komend czymś takim:

C:/mój/katalog/PHP.exe connection.php

Oczywiście z katalogu gdzie masz plik do połączenia.
Jeśli zadziała z linii komend to problemu nadal trzeba szukać w konfiguracji xamp/lokalizacji plików.

1
jurek1980 napisał(a):

Jeśli w tym kodzie PHP wyświetlonym widzisz znaczniki rozpoczęcia skryptu czyli <?php to kod jednak nie jest Interpretowany. Gdzie umieszczasz ten kod? W jakim katalogu?
Zrezygnuj z tagu zamykającego.kod w pliku.
Plik connection.php możesz przetestować z linii komend czymś takim:

C:/mój/katalog/PHP.exe connection.php

Oczywiście z katalogu gdzie masz plik do połączenia.
Jeśli zadziała z linii komend to problemu nadal trzeba szukać w konfiguracji xamp/lokalizacji plików.

Już sobie poradziłem. Kod działa, łączy się z bazą mogę dodawać do bazy rekordy z poziomu html i php. Więc tylko się bawić i nabywać doświadczenia.
Na pewno nie jeden problem jeszcze napotkam więc będę się radził doświadczonych koderów.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.