• 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

VPS Starter Arubacloud
+1 głos
373 wizyt
pytanie zadane 26 lutego 2021 w SQL, bazy danych przez stanislawruszkowski Obywatel (1,310 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 Szeryf (87,220 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 Ekspert (255,440 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 4,195 wizyt
0 głosów
1 odpowiedź 114 wizyt
pytanie zadane 12 kwietnia 2017 w C i C++ przez Grant Nowicjusz (160 p.)
0 głosów
0 odpowiedzi 83 wizyt
pytanie zadane 13 maja 2020 w SQL, bazy danych przez Grzegorzko Obywatel (1,110 p.)

92,830 zapytań

141,771 odpowiedzi

320,817 komentarzy

62,159 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...