• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Problem z zapytaniem do bazy danych

+1 głos
125 wizyt
pytanie zadane 26 lutego 2021 w SQL, bazy danych przez stanislawruszkowski Obywatel (1,250 p.)

Witam, 

Kiedy w polach nic nie będzie wszystko działa dobrze (pojawiają się wszystkie rekordy)

ale, jak w jakimś polu coś będzie pojawia się taki błąd: Fatal error: Uncaught TypeError: mysqli_num_rows(): Argument #1 ($result) must be of type mysqli_result, bool given in C:\xampp\htdocs\baza\szukanie.php:103 Stack trace: #0 C:\xampp\htdocs\baza\szukanie.php(103): mysqli_num_rows(false) #1 {main} thrown in C:\xampp\htdocs\baza\szukanie.php on line 103

Strona z formularzem:

<!DOCTYPE html>

<html>

<head>

    <title>VOLANS 2.0</title>
    <link rel="stylesheet" href="style/form.css" type="text/css" />


</head>
    
<body>

    <div id="nazwa">

        VOLANS 2.O

    </div>

    <div id="basic" >

        <form action="s_g.php">
            <input type="submit" value="Wstecz" />    
        </form>
    
    </div>
	
	<br />

    <div id="form">

        <form action="szukanie.php" method="post">

            Imie: 
            <br />
            <input type="text" name="imie" />
            <br />
            Nazwisko: 
            <br />
            <input type="text" name="nazwisko" />
            <br />
            Indeks: 
            <br />
            <input type="text" name="indeks" />
            <br />
            Rok:
            <br />
            <input type="text" name="rok" />
            <br />
            Kierunek: 
            <br />
            <input type="text" name="kierunek" />
            <br />
            Semestr: 
            <br />
            <input type="text" name="semestr" />
            <br />
            Tryb:
            <br />
            <input type="text" name="tryb" />
            <br />
            Jezyk:
            <br />
            <input type="text" name="jezyk" />
            <br />
            <br />
            <input type="submit" value="szukaj" />

        </form>

    </div>

</body>

</html>

Strona z wynikiem

<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">
<html xmlns=\"http://www.w3.org/1999/xhtml\" lang=\"pl-PL\">
<head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
    <title>Wszyscy studenci</title>
    <style>
        #container 
        {

        }

        #nazwa
        {
            width: 1000px;
            font-size: 50px;
	        text-align: center;
	        margin-left: auto;
	        margin-right: auto;
        }
        #tabelka
        {
            padding: 2px;
        }
    </style>
</head>

<body>

    <!-- KONTENER Z TABEL� -->
    <div id="container">
        <div id="tabelka">
             <table width="1000" align="center" border="1" bordercolor="#d5d5d5" cellpadding="0" cellspacing="0" >
            <tr>

            
                <?php

                $slowo_klucz = "nie szukaj";

                $imie = $_POST['imie'];
                $nazwisko = $_POST['nazwisko'];
                $indeks = $_POST['indeks'];
                $rok = $_POST['rok'];
                $kierunek = $_POST['kierunek']; 
                $semestr = $_POST['semestr'];
                $tryb = $_POST['tryb'];
                $jezyk = $_POST['jezyk'];

                $imie_z = "AND imie='$imie'";
                $nazwisko_z = "AND nazwisko='$nazwisko'";
                $indeks_z = "AND indeks='$indeks'";
                $rok_z = "AND rok='$rok'";
                $kierunek_z = "AND kierunek='$kierunek'";
                $semestr_z = "AND semestr='$semestr'";
                $tryb_z = "AND tryb='$tryb'";
                $jezyk_z = "AND jezyk='$jezyk'";

                if ($imie == $slowo_klucz)
                {
                    $imie_z = "";
                }

                if ($nazwisko == $slowo_klucz)
                {
                    $nazwisko_z = "";
                }

                if ($indeks == $slowo_klucz)
                {
                    $indeks_z = "";
                }

                if ($rok == $slowo_klucz)
                {
                    $rok_z = "";
                }

                if ($kierunek == $slowo_klucz)
                {
                    $kierunek_z = "";
                }

                if ($semestr == $slowo_klucz)
                {
                    $semestr_z = "";
                }

                if ($tryb == $slowo_klucz)
                {
                    $tryb_z = "";
                }

                if ($jezyk == $slowo_klucz)
                {
                    $jezyk_z = "";
                }

                require_once "connect.php";
                $baza = @new mysqli($host, $db_user, $db_password, $db_name); //Po��czenie z baz� danych
                $sql = "SELECT * FROM old_studenci WHERE szukanie='0' '$imie_z' '$nazwisko_z' '$indeks_z' '$rok_z' '$kierunek_z' '$semestr_z' '$tryb_z' '$jezyk'"; //Wyci�gniecie z bazy rekordow

                $result = $baza->query($sql);
                $ile = mysqli_num_rows($result); //liczba wyciagnietych rekordow z bazy

                echo "<br /><br />".$ile." Studentów.<br /><br />";

                if ($ile>=1)
                {
                    echo<<<END
<td  align="center" bgcolor="e5e5e5">L.P.</td>
<td  align="center" bgcolor="e5e5e5">Imie</td>
<td  align="center" bgcolor="e5e5e5">Nazwisko</td>
<td  align="center" bgcolor="e5e5e5">Numer Indeksu</td>
<td  align="center" bgcolor="e5e5e5">Rok</td>
<td  align="center" bgcolor="e5e5e5">Kierunek</td>
<td  align="center" bgcolor="e5e5e5">Semestr</td>
<td  align="center" bgcolor="e5e5e5">Tryb</td>
<td  align="center" bgcolor="e5e5e5">Jezyk</td>

</tr><tr>
END;
                }

                for ($i = 1; $i <= $ile; $i++)
                {

                    $row = mysqli_fetch_assoc($result);
                    //zmienne rekordow
                    $id = $row['id'];
                    $imie = $row['imie'];
                    $nazwisko = $row['nazwisko'];
                    $indeks = $row['indeks'];
                    $rok = $row['rok'];
                    $kierunek = $row['kierunek'];
                    $semestr = $row['semestr'];
                    $tryb= $row['tryb'];
                    $jezyk = $row['jezyk'];




                    echo<<<END
<td align="center">$id</td>
<td align="center">$imie</td>
<td align="center">$nazwisko</td>
<td align="center">$indeks</td>
<td align="center">$rok</td>
<td align="center">$kierunek</td>
<td align="center">$semestr</td>
<td align="center">$tryb</td>
<td align="center">$jezyk</td>
</tr><tr>
END;

                }

                ?>
        </div>

            </tr>
        </table>
    </div>

</body>
</html>

Z góry dziękuję za odpowiedź

2 odpowiedzi

+1 głos
odpowiedź 26 lutego 2021 przez SzkolnyAdmin Maniak (67,660 p.)
Przed wysłaniem do bazy do bazy wyświetl sobie utworzone zapytanie. Zobaczysz, co jest w nim nie tak. Jak stosujesz MySQLi w wersji obiektowej to również użyj metody obiektowej do zwrócenia liczby wierszy rezultatu.
0 głosów
odpowiedź 28 lutego 2021 przez VBService Mędrzec (162,950 p.)
edycja 28 lutego 2021 przez VBService

Twój "pattern" sql wygląda tak: (pewna część)

$sql = "SELECT * FROM old_studenci WHERE szukanie='0' '$imie_z'

niech zmienna  $imie_z przyjmie wartość z $_POST['imie'] - Stanisław

to po

$imie_z = "AND imie='$imie'";

mamy

$sql = "SELECT * FROM old_studenci WHERE szukanie='0' 'And imie='Stanisław''

i tak z resztą zmiennych z końcówką _z, czyli zdecydowanie tworzy się nie do końca prawidłowa forma zapytania sql.  wink

po usunięciu tych apostrofów, powinno zadziałać.

$sql = "SELECT * FROM old_studenci WHERE szukanie='0' $imie_z $nazwisko_z " 

wtedy mam 

$sql = "SELECT * FROM old_studenci WHERE szukanie='0' And imie='Stanisław' AND nazwisko='Ruszkowski' " 

 

Propozycje zmian.  wink

Strona z formularzem:

<!DOCTYPE html>
<html lang="pl">
    <head>
        <meta charset="utf-8">
        <title>VOLANS 2.0</title>
        <link href="style/form.css" rel="stylesheet">

        <style>
            * {
                box-sizing: border-box;
            }
            #basic {
                margin-bottom: 1em;
            }
            #basic input[type="submit"] {
                margin: 0.5em 0;
            }
            #form label {
                display: block;
                margin-top: 0.5em;
            }
            #form input[type="submit"] {
                display: block;
                margin: 1.5em 0;
            }
        </style>
    </head>
    <body>
        <div id="nazwa">
            VOLANS 2.O
        </div>
        <div id="basic" >
            <form action="s_g.php">
                <input type="submit" value="Wstecz">
            </form>
        </div>
        <div id="form">
            <form action="szukanie.php" method="post">

                <label for="imie">Imie:</label>
                <input type="text" name="imie">

                <label for="nazwisko">Nazwisko:</label>
                <input type="text" name="nazwisko">

                <label for="indeks">Indeks:</label>
                <input type="text" name="indeks">

                <label for="rok">Rok:</label>
                <input type="text" name="rok">

                <label for="kierunek">Kierunek:</label>
                <input type="text" name="kierunek">

                <label for="semestr">Semestr:</label>
                <input type="text" name="semestr">

                <label for="tryb">Tryb:</label>
                <input type="text" name="tryb">

                <label for="jezyk">Jezyk:</label>
                <input type="text" name="jezyk">

                <input type="submit" value="szukaj">

            </form>
        </div>
    </body>
</html>

Strona z wynikiem

<?php
  if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    //var_dump($_POST);
    $sql_where = '';

    foreach ($_POST as $key => $value) {
      if (! empty($_POST[$key])) {
        $sql_where .= " AND {$key}='{$value}'";
      }
    }

    if (! empty($sql_where)) {
      require_once "connect.php";

      $connect = @new mysqli($host, $db_user, $db_password, $db_name);
      $sql = "SELECT * FROM old_studenci WHERE szukanie='0'{$sql_where}";

      if ($result = $mysqli->query($sql)) {
        $count_students = $result->num_rows;
        $rows = '';

        while($row = $result->fetch_assoc()) {
          $rows .= "<tr><td>{$row['id']}</td>"
                 . "<td>{$row['imie']}</td>"
                 . "<td>{$row['nazwisko']}</td>"
                 . "<td>{$row['indeks']}</td>"
                 . "<td>{$row['rok']}</td>"
                 . "<td>{$row['kierunek']}</td>"
                 . "<td>{$row['semestr']}</td>"
                 . "<td>{$row['tryb']}</td>"
                 . "<td>{$row['jezyk']}</td></tr>";
        }
      } else {
        $count_students = 0;
        $rows = noResultsFoundMessage();
      }

      $mysqli->close();
    } else { // if (! empty($sql_where))
      $count_students = 0;
      $rows = noResultsFoundMessage();
    }
  } else { // ($_SERVER['REQUEST_METHOD'] == 'POST')
    $count_students = 0;
    $rows = noResultsFoundMessage();
  }

  function noResultsFoundMessage() {
      return '<tr>'
           . '<td colspan="9">Nie znaleziono wyników dla podanych kryteriów</td>'
           . '</tr>';
  }
?>
<!DOCTYPE html>
<html lang="pl">
    <head>
        <meta charset="utf-8">
        <title>Wszyscy studenci</title>

        <style>
            * {
                box-sizing: border-box;
            }

            #container {

            }

            #nazwa {
                width: 1000px;
                font-size: 50px;
                text-align: center;
                margin-left: auto;
                margin-right: auto;
            }

            #tabelka {
                padding: 0.1em;
            }
            #tabelka table {
                width: 1000px;
                margin-left: auto;
                margin-right: auto;
                border: 1px solid rgba(124,124,124,0.8); /* #7c7c7c */
                border-collapse: separate;
                border-spacing: 0px; /* cellspacing="0" */
            }
            #tabelka caption {
                text-align: left;
                padding: 0.5em 1em;
            }
            #tabelka table tr:nth-child(2n+1) {
                background-color: rgba(247,247,247,1); /* #f7f7f7 */
            }
            #tabelka table tr:nth-child(2n+2) {
                background-color: rgba(235,235,235,1); /* #ebebeb */
            }
            #tabelka table tr:hover {
                background-color: rgba(242,236,216,1); /* #f2ecd8 */
                /* background-color: rgba(231,220,240,1); /* #e7dcf0 */ */
            }
            #tabelka table th {
                padding: 0px; /* cellpadding="0" */
                text-align: center;
                background-color: rgba(229,229,229,1); /* #e5e5e5 */
                border-bottom: 1px solid rgba(124,124,124,0.8); /* #7c7c7c */
            }
            #tabelka table td {
                padding: 0.5em 0;
                text-align: center;
            }
        </style>
    </head>
    <body>
        <div id="container">
            <div id="tabelka">
                 <table>
                    <caption><?php echo $count_students; ?> Studentów.</caption>
                    <thead>
                        <th>Lp.</th>
                        <th>Imie</th>
                        <th>Nazwisko</th>
                        <th>Numer Indeksu</th>
                        <th>Rok</th>
                        <th>Kierunek</th>
                        <th>Semestr</th>
                        <th>Tryb</th>
                        <th>Jezyk</th>
                    </thead>
                    <tbody>
                        <?php echo $rows; ?>
                    </tbody>
                 </table>
            </div>
        </div>
    </body>
</html>

została ewentualnie jeszcze jedna rzecz do zrobienia, Twój kod i Moja propozycja zmian (chodzi o Strona z wynikiem) skrypt nie jest "odporny" na ewentualny atak "SQL Injection", ale nie chciałem Tobie na tym etapie "rozbudowywać" kodu (co mogło by utrudnić ewentualne zrozumienie go) to można dodać "później"  wink

Podobne pytania

+1 głos
2 odpowiedzi 1,988 wizyt
0 głosów
1 odpowiedź 68 wizyt
pytanie zadane 12 kwietnia 2017 w C i C++ przez Grant Nowicjusz (160 p.)
0 głosów
0 odpowiedzi 35 wizyt
pytanie zadane 13 maja 2020 w SQL, bazy danych przez Grzegorzko Obywatel (1,110 p.)

87,946 zapytań

136,527 odpowiedzi

304,410 komentarzy

58,313 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Sklep oferujący ćwiczenia JavaScript, PHP, rozmowy rekrutacyjne dla programistów i inne materiały

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...