Pobieranie danych z bazy danych error 500

0

Witam serdecznie jestem początkujący w PHP i MySQL, proszę o pomoc, to jest pewnie prosta sprawa dla kogoś kto się zna na bazach danych i php.

Mam w bazie danych 3 tabele (tabela_nr1, tabela_nr2, tabela_nr3)
i za pomocą listy rozwijanej chciałbym pobrać dane z jednej z tych 3 tabel,
w których to tabelach jest kolumna id,
a z tej kolumny id wszystkie wiersze co posiadają id nr 1(int).
Jest w tych tabelach kilkanaście wierszy z id nr 1.

<form action="" method="GET"> 
<select name="id_nr_1_z_tabeli_nr" onchange="this.form.submit()"> 
<option value="">Wybierz tabelę</option>
<option value="aethera_history">Aethera</option> 
<option value="ambra_history">Ambra</option> 
<option value="antica_history">Antica</option> 
</select> 
</form>


<?php

// parametry serwera
$serwer = "mysql8";  // nazwa serwera mysql
$login  = "login";  // login do bazy
$haslo  = "hasło";  // haslo do bazy
$baza   = "nazwa bazy";  // nazwa bazy



// Tutaj otwierasz warunek
  
 
if(isset($_GET['id_nr_1_z_tabeli_nr'])) {             // <---- Coś się dzieje w tej lini i wyskakuje error 500
$id_nr_1_z_tabeli_nr = isset($_GET['id_nr_1_z_tabeli_nr']);
 
// łączymy się z bazą danych
$db =  new mysqli($serwer, $login, $haslo, $baza);
$zapytanie = "SELECT * FROM $id_nr_1_z_tabeli_nr WHERE id = 1";
 
 
 
$o_szablon_odczytu =  $db -> prepare($zapytanie);
$o_szablon_odczytu -> bind_param('i', $id_nr_1_z_tabeli_nr); // zakładając, że twoje ID to integer
$o_szablon_odczytu -> execute();
$o_odczyt = $o_szablon_odczytu -> get_result();
 
if ($o_odczyt -> num_rows > 0) {
  // --- czytaj wiersze
  while($row = $o_odczyt -> fetch_assoc()) {
 echo "<tr>";
echo "<td>$row[0]</td>";
echo "<td id='cw'>$row[2]</td>";
echo "<td id='ne'>$row[3]</td>";
echo "<td>$row[4]</td>";
echo "<td id='c1'>$row[5]</td>";
echo "<td>$row[6]</td>";
echo "<td>$row[7]</td>";
echo "<td>$row[8]</td>";

echo "</tr>";    
	 
	 
	 }
} else {
  echo "wyników: 0";
}
 
$o_szablon_odczytu -> close();
 
$db_blad = $db -> error;
 
$db -> close();
 
?>
2

Wygląda na to, że brakuje jednego nawiasu. Formatuje sobie kod, będziesz widzieć takie rzeczy od razu. W linii 58 dodałem zamykający nawias dla instrukcji if.
Oczywiście najlepiej rozbijać to na funkcje i mniejsze pliki, wtedy kod staje się jeszcze bardziej czytelny.


<form action="" method="GET"> 
<select name="id_nr_1_z_tabeli_nr" onchange="this.form.submit()"> 
<option value="">Wybierz tabelę</option>
<option value="aethera_history">Aethera</option> 
<option value="ambra_history">Ambra</option> 
<option value="antica_history">Antica</option> 
</select> 
</form>


<?php
// parametry serwera
$serwer = "mysql8"; // nazwa serwera mysql
$login = "login"; // login do bazy
$haslo = "hasło"; // haslo do bazy
$baza = "nazwa bazy"; // nazwa bazy

// Tutaj otwierasz warunek

if (isset($_GET["id_nr_1_z_tabeli_nr"])) {
    // <---- Coś się dzieje w tej lini i wyskakuje error 500
    $id_nr_1_z_tabeli_nr = isset($_GET["id_nr_1_z_tabeli_nr"]);

    // łączymy się z bazą danych
    $db = new mysqli($serwer, $login, $haslo, $baza);
    $zapytanie = "SELECT * FROM $id_nr_1_z_tabeli_nr WHERE id = 1";

    $o_szablon_odczytu = $db->prepare($zapytanie);
    $o_szablon_odczytu->bind_param("i", $id_nr_1_z_tabeli_nr); // zakładając, że twoje ID to integer
    $o_szablon_odczytu->execute();
    $o_odczyt = $o_szablon_odczytu->get_result();

    if ($o_odczyt->num_rows > 0) {
        // --- czytaj wiersze
        while ($row = $o_odczyt->fetch_assoc()) {
            echo "<tr>";
            echo "<td>$row[0]</td>";
            echo "<td id='cw'>$row[2]</td>";
            echo "<td id='ne'>$row[3]</td>";
            echo "<td>$row[4]</td>";
            echo "<td id='c1'>$row[5]</td>";
            echo "<td>$row[6]</td>";
            echo "<td>$row[7]</td>";
            echo "<td>$row[8]</td>";

            echo "</tr>";
        }
    } else {
        echo "wyników: 0";
    }

    $o_szablon_odczytu->close();

    $db_blad = $db->error;

    $db->close();
}

?>
2

Tu jeszcze wygląda na błąd:

    $id_nr_1_z_tabeli_nr = isset($_GET["id_nr_1_z_tabeli_nr"]); //<---- dlaczego isset i w ogóle nazwa tebeli jako parametr?

    // łączymy się z bazą danych
    $db = new mysqli($serwer, $login, $haslo, $baza);
    $zapytanie = "SELECT * FROM $id_nr_1_z_tabeli_nr WHERE id = 1";

chyba powinno być:

    $id_nr_1_z_tabeli_nr = $_GET["id_nr_1_z_tabeli_nr"]);

    // łączymy się z bazą danych
    $db = new mysqli($serwer, $login, $haslo, $baza);
    $zapytanie = "SELECT * FROM TU_NAZWA_TWOJEJ_TABELI WHERE id = ?";
0

@kAzek: Wszystko dobrze tylko ja chciałem nazwę tabeli wybrać z listy rozwijanej.

@jurek1980: Dziękuję error 500 znikł tylko nic mi się nie wyświetla z tabeli jak użyje tego kodu co by tam poprawić?

2

Masz na pewno co najmniej kilka błędów.
1 to ten isset jak napisał @kAzek . Tak w zmiennej masz bool true/false zamiast wartości.
Dwa to potem bindujesz parametr którego nie ma w zapytaniu, bo masz zawsze where id = 1

Zobacz to, z pomocą mądrzejszej ode mnie sztucznej inteligencji. Przygotowane do tego by id można było też pobrać z formularza. No i ucz się debugować. var_dump() w odpowiednim miejscu + sprawdzanie logów prawdę Ci powie.


<form action="" method="GET"> 
    <select name="table_name" onchange="this.form.submit()"> 
        <option value="">Select table</option>
        <option value="aethera_history">Aethera</option> 
        <option value="ambra_history">Ambra</option> 
        <option value="antica_history">Antica</option> 
    </select> 
</form>

<?php
// Server parameters
$server = "mysql8"; // MySQL server name
$username = "login"; // Database username
$password = "password"; // Database password
$database = "database_name"; // Database name

/**
 * Establishes a connection to the database.
 * 
 * @return mysqli
 */
function connectToDatabase($server, $username, $password, $database) {
    $connection = new mysqli($server, $username, $password, $database);
    if ($connection->connect_error) {
        die("Connection failed: " . $connection->connect_error);
    }
    return $connection;
}

/**
 * Fetches data from the specified table for the given ID.
 * 
 * @param mysqli $connection
 * @param string $tableName
 * @param int $id
 * @return array|null
 */
function fetchDataById($connection, $tableName, $id) {
    $query = "SELECT * FROM $tableName WHERE id = ?";
    $statement = $connection->prepare($query);
    if ($statement === false) {
        die("Query preparation failed: " . $connection->error);
    }
    $statement->bind_param("i", $id);
    $statement->execute();
    $result = $statement->get_result();
    
    if ($result->num_rows > 0) {
        return $result->fetch_all(MYSQLI_ASSOC);
    } else {
        return null;
    }
}

/**
 * Displays the fetched data in an HTML table.
 * 
 * @param array $data
 */
function displayData($data) {
    echo "<table border='1'>";
    foreach ($data as $row) {
        echo "<tr>";
        foreach ($row as $column) {
            echo "<td>$column</td>";
        }
        echo "</tr>";
    }
    echo "</table>";
}

// Main logic
if (isset($_GET["table_name"])) {
    $tableName = $_GET["table_name"];
    $id = 1; // Assuming you want to search for ID = 1

    $connection = connectToDatabase($server, $username, $password, $database);

    $data = fetchDataById($connection, $tableName, $id);

    if ($data) {
        displayData($data);
    } else {
        echo "No results found.";
    }

    $connection->close();
}
?>

0

@jurek1980: Dziękuje bardzo Twój kod działa, właśnie wróciłem z pracy i go uruchomiłem. 😀

Mam jeszcze jedno pytanko, bo wyświetlają mi się wszystkie kolumny w tabeli, a chciałbym żeby się tylko wyświetlała kolumna
np.: 1,3,5,7,i 10.
Poza tym jeszcze chciałem dać opis do tych widocznych kolumn na samej górze.
I teraz jest pytanie jaki kod dopisać do Twojego kodu żeby to działało z tymi moimi dodatkami jw.

1

Na to masz dwa podejścia.
Modyfikujesz zapytanie do bazy i zamiast robić select * podajesz nazywa kolumn które mają być z bazy zwrócone.
Albo tam gdzie jest pętla od wyświetlania w funkcji dispaly() stosujesz warunek i wyświetlasz wybrane dane. Teraz do zastanowienia czy druga metoda jest słuszna. Bo możesz mieć dużo kolumn i dużo danych. Tym samym ilość danych w pamięci, ilość ifów w widoku będzie rosnąć do nieskończoności.
BTW.
Nie nazywaj kolumn cyframi. Daj im nazwę odzwierciedlającą trzymane tam dane.

0

@jurek1980: A to jest moja strona fanowska Tibii z bossami jeszcze trochę mi zajmie jej rozbudowa 😀 link

A tak wygląda gotowa strona z kodem link 😀

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.