Pobieranie danych z bazy danych error 500

Pobieranie danych z bazy danych error 500
M8
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 4
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.

Kopiuj
<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();
 
?>
jurek1980
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3581
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.

Kopiuj

<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();
}

?>
KA
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Gorlice
2

Tu jeszcze wygląda na błąd:

Kopiuj
    $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ć:

Kopiuj
    $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 = ?";
M8
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 4
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ć?

jurek1980
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3581
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.

Kopiuj

<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();
}
?>

M8
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 4
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.

jurek1980
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3581
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.

M8
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 4
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 😀

VBService
  • Rejestracja: dni
  • Ostatnio: dni
0

Może tabele na stronie zapisz tak, bo kolumna server, image, name dla każdego wiersza, jak zgaduję zawsze będą takie same.

Kopiuj
<table class="box">
  <caption>
    <strong>Server:</strong> Ambra | 
    <strong>Image:</strong> <img src="https://www.tibiabosses.pl/boss/img/shlorg.gif" alt="Shlorg Image"> | 
    <strong>Name:</strong> <a href="https://www.tibiabosses.pl/boss/shlorg">Weakened Shlorg</a>
  </caption>
  <tbody>
    <tr>
      <th>Minimum Waiting Days</th>
      <th>Last Seen Days Ago</th>
      <th>Killed by Players</th>
      <th>Killed Players</th>
      <th>Date Update</th>
    </tr>
    <tr>
      <td>12</td>
      <td id="c1">169</td>
      <td>1</td>
      <td>0</td>
      <td>2024-04-05 06:00:08</td>
    </tr>
    <tr>
      <td>12</td>
      <td id="c1">13</td>
      <td>1</td>
      <td>0</td>
      <td>2024-04-19 06:00:08</td>
    </tr>
    <tr>
      <td>12</td>
      <td id="c1">26</td>
      <td>1</td>
      <td>0</td>
      <td>2024-05-16 06:00:02</td>
    </tr>
    <tr>
      <td>12</td>
      <td id="c1">26</td>
      <td>1</td>
      <td>0</td>
      <td>2024-06-12 06:00:01</td>
    </tr>
    <tr>
      <td>12</td>
      <td id="c1">15</td>
      <td>1</td>
      <td>0</td>
      <td>2024-06-28 06:00:01</td>
    </tr>
    <tr>
      <td>12</td>
      <td id="c1">25</td>
      <td>1</td>
      <td>0</td>
      <td>2024-07-24 06:00:01</td>
    </tr>
    <tr>
      <td>12</td>
      <td id="c1">12</td>
      <td>1</td>
      <td>0</td>
      <td>2024-08-06 06:00:02</td>
    </tr>
    <tr>
      <td>12</td>
      <td id="c1">13</td>
      <td>1</td>
      <td>0</td>
      <td>2024-08-20 06:00:02</td>
    </tr>
    <tr>
      <td>12</td>
      <td id="c1">12</td>
      <td>1</td>
      <td>0</td>
      <td>2024-09-02 06:00:01</td>
    </tr>
    <tr>
      <td>12</td>
      <td id="c1">16</td>
      <td>1</td>
      <td>0</td>
      <td>2024-09-19 06:00:01</td>
    </tr>
    <tr>
      <td>12</td>
      <td id="c1">23</td>
      <td>1</td>
      <td>0</td>
      <td>2024-10-13 06:00:01</td>
    </tr>
    <tr>
      <td>12</td>
      <td id="c1">23</td>
      <td>1</td>
      <td>0</td>
      <td>2024-11-06 06:00:01</td>
    </tr>
    <tr>
      <td>12</td>
      <td id="c1">23</td>
      <td>1</td>
      <td>0</td>
      <td>2024-11-30 06:00:01</td>
    </tr>
  </tbody>
</table>

<style>
  table.box caption img {
    width: 20px;
  }
</style>

druga sprawa nie wiem do czego chcesz wykorzystać id

Kopiuj
...
<td id="c1">13</td>
...
<td id="c1">26</td>
...
<td id="c1">23</td>

ale

HTML id Attribute
The HTML id attribute is used to specify a unique id for an HTML element.
You cannot have more than one element with the same id in an HTML document.

dlatego, np.

Kopiuj
...
<td id="c1">13</td>
...
<td id="c10">26</td>
...
<td id="c21">23</td>

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.