Jak pobrać dane z bazy za pomocą pola select?

0

Witam jestem poczatkujacy w PHP i mySQL, proszę o pomoc, to jest pewnie prosta sprawa dla kogoś kto się zna na bazach danych.

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.
Jest w tych tabelach kilkanaście wierszy z id nr 1.

Mam tu kod który trzeba by było zmienić, znalazlem taki przykład w internecie i powstawiałem swoje nazwy:

<form action="" method="get"> <select name="id_nr_1_z_tabeli_nr" onchange="this.form.submit()"> <option value="">Wybierz tabelę</option> <option value="tabela_nr1">tabela_nr1</option> <option value="tabela_nr2">tabela_nr2</option> <option value="tabela_nr3">tabela_nr3</option> </select> </form> <?php // parametry serwera $serwer = "localhost"; // nazwa serwera mysql $login = "root"; // login do bazy $haslo = "haslo1"; // haslo do bazy $baza = "baza1"; // nazwa bazy $tabela = "tabela_nr1"; // nazwa tabeli $id_nr_1_z_tabeli_nr = $_GET['id_nr_1_z_tabeli_nr']; if($id_nr_1_z_tabeli_nr) { // łączymy się z bazą danych if (mysql_connect($serwer, $login, $haslo) and mysql_select_db($baza)) { // zapytanie do bazy danych $wynik = mysql_query("SELECT * FROM tabela_nr1 WHERE id='$id_nr_1_z_tabeli_nr'") or die("Błąd w zapytaniu!"); mysql_close(); } else echo "Nie mogę połączyć się z bazą danych!"; // wyświetlany wyniki zapytania while($rek = mysql_fetch_array($wynik)) { echo $rek['nazwa']."
"; } } ?>

Jest na forum Ktoś kto by mógłby poprawić ten przykładowy kod. Dziekuję.

0

Ma jeszcze jedno pytanie czy to w ogóle da się zrobić?

2

Wszystko się da zrobić.

Musisz:

  • przesłać formularz,
  • odczytać go po stronie serwera,
  • pobrać wartość wybraną w formularzu przez select,
  • wyświetlić ją.

Ew. w bardziej ambitnej wersji przesyłać zapytanie AJAX-em i dynamicznie uzupełniać treść strony bez jej przeładowywania.

Na początek sugeruję zmienić:

if($id_nr_1_z_tabeli_nr) {

na

if(isset($_GET['id_nr_1_z_tabeli_nr')) {
  $id_nr_1_z_tabeli_nr = $_GET['id_nr_1_z_tabeli_nr'];
  // łączymy się z bazą danych
...

A do samego czytania bazy sugeruję coś w stylu:

$db =  new mysqli($serwer, $login, $haslo, $baza);

$zapytanie = "SELECT * FROM tabela_nr1 WHERE id = ?";

$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($tab_wiersz = $o_odczyt -> fetch_assoc()) {
    echo "<b>kolumna1:</b> " . $tab_wiersz["nazwa kolumny1 w twojej bazie"]. " - <b>kolumna2:</b> " . $tab_wiersz["nazwa klolumny 2 w twojej bazie"]. "<br>";
  }
} else {
  echo "wyników: 0";
}


$o_szablon_odczytu -> close();

$db -> close();

Jeśli są jakieś blędy,

$db_blad = $db -> error;

wykonane przed zamknięciem $db, powinno odczytać ci ostatni, jaki wystąpił.

0



<form action="" method="get">
<select name="id_nr_1_z_tabeli_nr" onchange="this.form.submit()">
<option value="">Wybierz tabelę</option>
<option value="tabela_nr1">tabela_nr1</option>
<option value="tabela_nr2">tabela_nr2</option>
<option value="tabela_nr3">tabela_nr3</option>
</select>
</form><form action="" method="get"> <select name="id_nr_1_z_tabeli_nr" onchange="this.form.submit()"> <option value="">Wybierz tabelę</option> <option value="adra_history">Adra</option> <option value="antica_history">Antica</option> <option value="assombra_history">Assombra</option> </select> </form>

<?php

// parametry serwera
$serwer = "localhost";  // nazwa serwera mysql
$login  = "root";  // login do bazy
$haslo  = "haslo1";  // haslo do bazy
$baza   = "baza1";  // nazwa bazy



if(isset($_GET['id_nr_1_z_tabeli_nr')) {                // w tej linijce pokazuje błąd: Parse error: syntax error, unexpected ')', expecting ']'
$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 tabela_nr1 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($tab_wiersz = $o_odczyt -> fetch_assoc()) {
     echo "<b>kolumna1:</b> " . $tab_wiersz["nazwa kolumny1 w twojej bazie"]. " - <b>kolumna2:</b> " . $tab_wiersz["nazwa klolumny 2 w twojej bazie"]. "<br>";
  }
} else {
  echo "wyników: 0";
}

$o_szablon_odczytu -> close();

$db_blad = $db -> error;

$db -> close();

?>




W tej linijce pokazuje bład:

if(isset($_GET['id_nr_1_z_tabeli_nr')) {                // w tej linijce pokazuje błąd: Parse error: syntax error, unexpected ')', expecting ']'

1
if(isset($_GET['id_nr_1_z_tabeli_nr'])) {  
0

Dziękuję to pomogło a teraz jeszcze takie coś: Parse error: syntax error, unexpected end of file.
To ostatnia linia całego pliku.

0

Już działa tylko jak załaduje stronę po raz pierwszy to mam pod lista taki komunikat: Fatal error: Call to a member function close() on null in /index.php ,a jak usunę

$o_szablon_odczytu -> close();

oraz 

$db -> close();

to komunikat znika tylko nie wiem czy to tak może zostać?

I drugi komunikat pojawia się kiedy wybiorę jakąś tabele z listy:
Warning: mysqli_stmt::bind_param(): Number of variables doesn't match number of parameters in prepared statement in /index.php
Zawartość tabeli się wyświetla.

Co tu zmienić w kodzie żeby te komunikaty znikły.

4

Jak wchodzisz na stronę za pierwszym razem to zapewne nie masz niczego w tablicy $_GET. Potem masz warunek który to sprawdza i wewnątrz inicjujesz połączenie do bazy.
Tym samym za pierwszym razem masz null jako niezincjowane połączenie. Możesz po prostu przesunąć zamykanie połączenia do wewnątrz stworzonego waeunku.

0

Próbuje ale nie wychodzi mi, cały czas są te komunikaty:

Fatal error: Call to a member function close() on null in /index.php
Warning: mysqli_stmt::bind_param(): Number of variables doesn't match number of parameters in prepared statement in /index.php

Może Ktoś da jakiś przykład jak mam przesunąć zamykanie połączenia do wewnątrz stworzonego warunku.

2

<?php

// parametry serwera
$serwer = "localhost";  // nazwa serwera mysql
$login  = "root";  // login do bazy
$haslo  = "haslo1";  // haslo do bazy
$baza   = "baza1";  // nazwa bazy
// Tutaj otwierasz warunek
if(isset($_GET['id_nr_1_z_tabeli_nr')) { 

// łączymy się z bazą danych
$db =  new mysqli($serwer, $login, $haslo, $baza);

$zapytanie = "SELECT * FROM tabela_nr1 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($tab_wiersz = $o_odczyt -> fetch_assoc()) {
     echo "<b>kolumna1:</b> " . $tab_wiersz["nazwa kolumny1 w twojej bazie"]. " - <b>kolumna2:</b> " . $tab_wiersz["nazwa klolumny 2 w twojej bazie"]. "<br>";
  }
} else {
  echo "wyników: 0";
}

$o_szablon_odczytu -> close();

$db_blad = $db -> error;

$db -> close();
// Ten otwarty warunek musisz zamknąć dopiero tutaj. N
?>

Będzie Ci łatwiej jak sformatujesz dobrze kod i będziesz widzieć gdzie co się otwiera a gdzie zamyka.

0

Dzieki.

Fatal error: Call to a member function close() on null in /index.php

Zniknął

Ale jest jeszcze jeden komunikat, jak wybiorę jedną tabelę z listy wyboru, tabela się wczytuje prawidłowo ale pomiędzy listą wyboru a tabelą jest komunikat:

Warning: mysqli_stmt::bind_param(): Number of variables doesn't match number of parameters in prepared statement in /index.php

 $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   <----- Ta linia: Warning: mysqli_stmt::bind_param(): Number of variables doesn't match number of parameters in prepared statement in /index.php
    $o_szablon_odczytu -> execute();
    $o_odczyt = $o_szablon_odczytu -> get_result();
2
omi napisał(a):

I drugi komunikat pojawia się kiedy wybiorę jakąś tabele z listy:
Warning: mysqli_stmt::bind_param(): Number of variables doesn't match number of parameters in prepared statement in /index.php

Bo zmieniłeś treść zapytania:

$zapytanie = "SELECT * FROM tabela_nr1 WHERE id = 1";

Każdy znak zapytania w hm... zapytaniu :) ma w bind_param odpowiadać jednemu literowemu oznaczeniu typu zmiennej i jej nazwie:

$zapytanie = "SELECT * FROM tabela_nr1 WHERE id = ?";
(...)
$o_szablon_odczytu -> bind_param('i', $id_nr_1_z_tabeli_nr); // zakładając, że twoje ID to integer

0
omi napisał(a):
if(isset($_GET['id_nr_1_z_tabeli_nr')) {                // w tej linijce pokazuje błąd: Parse error: syntax error, unexpected ')', expecting ']'

Wykaż MINIMUM własnej aktywności.
Sprawdzenie, czy nawiasy są symetrycznie nie wymaga ani wiedzy, ani 15 lat doświadczenia.
A komunikat mówi praktycznie WSZYSTKO.

Ostawiasz po prostu kaszanę.

0

Ok komunikat zniknął, dziękuję wszystkim za pomoc a szczególnie Freja Draco.

1 użytkowników online, w tym zalogowanych: 0, gości: 1