Dodawanie rekordów z formularza do bazy - nie działający kod

0

Mam za zadanie dodać do bazy podane przez formularz dane.
Dostaję błąd
Fatal error: Uncaught Error: Call to a member function query() on null in C:\xampp\htdocs\bazastudent2\baza.php:63 Stack trace: #0 C:\xampp\htdocs\bazastudent2\index.php(26): baza->dodajDoBazy() #1 {main} thrown in C:\xampp\htdocs\bazastudent2\baza.php on line 63
Gdzieś już znalazłam, że dotyczy to błędnego łączenia OOP z programowanie funkcjonalnym, ale niestety nie umiem sobie z tym poradzić.

Proszę o pomoc

Mój kod

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <?php
       include 'formularz.php';
       include 'baza.php';
       
       $akcja = isset($_REQUEST['submit']) ? $_REQUEST['submit'] : '';
       $b = new baza('localhost','root','','studenci');
       $wynikwalidacji = 0;
       if($akcja)
       {
           $wynikwalidacji = $b->walidacja();
       }
       if($wynikwalidacji === 1)
       {
          /*$wynikDodania =*/ $b->dodajDoBazy();
       }
      
        ?>
    </body>
</html>
<?php

class baza {
    
    //uchwyt
    private $msqli;
    
    public function _construct($serwer,$user,$pass,$baza)
    {
       $this->msqli = new msqli('localhost','root','','studenci');
       
       //test połączenia
       if($this->msqli->connect_errno)
       {
           echo "Połączenie zerwane";
           exit();
       }
    }
    
    public function walidacja()
    {
        $ok = 0;
        $args = ([
            'nazwisko' => ['filter' => FILTER_VALIDATE_REGEXP,
                            'options' => ['regexp' => '/^[A-Z]{1}[a-ząęłńśćźżó-]{1,25}$/']],
            'semestr_studiow' => ['filter' => FILTER_SANITIZE_NUMBER_INT],
            'ocena1' => ['filter' => FILTER_SANITIZE_NUMBER_FLOAT],
            'ocena2' => ['filter' => FILTER_SANITIZE_NUMBER_FLOAT],
            'ocena3' => ['filter' => FILTER_SANITIZE_NUMBER_FLOAT],
        ]);
        
        $dane = filter_input_array(INPUT_GET, $args);
        $errors ="";
        
        foreach ($dane as $key => $val)
        {
            if($val === false or $val === NULL)
            {
                $errors.=$key."";
            }
            if ($errors === "")
            {
               $ok=1;
               return $ok;
            }
            else
            {
                echo "Błąd " . $errors;
            }
        }
    }
    
    public function dodajDoBazy()
    {  
        
        $naz = isset($_GET['nazwisko']) ? $_GET['nazwisko'] : '';
        $sem = isset($_GET['semestr_studiow']) ? $_GET['semestr_studiow'] : '';
        $oc1 = isset($_GET['ocena1']) ? $_GET['ocena1'] : '';
        $oc2 = isset($_GET['ocena2']) ? $_GET['ocena2'] : '';
        $oc3 = isset($_GET['ocena3']) ? $_GET['ocena3'] : '';
        
        $sql = "INSERT INTO indeks_studenta (nazwisko, semestr_studiów, ocena_eg_1, ocena_eg_2, ocena_eg_3) VALUES ($naz,$sem,$oc1,$oc2,$oc3)";
         return $this->msqli->query($sql);
    }
}
<!DOCTYPE html>
<html>
    <body>
        <form method="GET" action="index.php">
            <div><label for="nazwisko">Nazwisko<input type="text" name="nazwisko"/></label></div>
            <div><label for="semestr_studiow">Semestr studiów<input type="text" name="semestr_studiow"/></label></div>
            <div><label for="ocena1">Ocena z przedmiotu 1<input type="text" name="ocena1"/></label></div>
            <div><label for="ocena2">Ocena z przedmiotu 2<input type="text" name="ocena2"/></label></div>
            <div><label for="ocena3">Ocena z przedmiotu 3<input type="text" name="ocena3"/></label></div>
            <button name="submit" value="submit">Wyślij do bazy</button>
        </form>
    </body>
</html>
1

__construct vs _construct

0

Dziękuję :) błąd zniknął. Ale do bazy nadal nic nie weszło

0

Zauważ, że w Twojej aktualnej wersji kodu zapytanie może się nie powieść (metoda dodajDoBazy() zwróci false), lecz nigdzie tego nie sprawdzasz.

0

Nie powodzi się. Dlatego pytam jak to zrobić poprawnie xd

Sprawdzenie, żeby nie było, że czekam aż ktoś zrobi za mnie

if ($this->mysqli->query($sql))
         {
             echo "true";
         }
         
         else  
         {
             echo "false"; 
         }

Chyba powinno wystarczyć takie.

0

Nie powodzi się

To wiemy - powiedz mi coś nowego, np. treść błędu z serwera SQL.

0

Nie ma błędu. Właśnie w tym problem. Klikam przycisk wyślij i wizualnie wygląda jakby polecenie się powiodło. Pod spodem formularza wyświetla się jedynie "false" tak jak w tym przypadku trzeba.

0

Nie ma błędu.

W jaki sposób (explicit) sprawdzasz, że tego błędu nie ma?

0

error logi xamppa nie pokazują błędów
od strony php nie sypie mi błędów (już)
połączenie z bazą danych (kod w pliku) nie wysypuje błędu o braku połączenia

Jeśli powinnam sprawdzić jakoś inaczej to tego nie wiem, nie pracowałam dotąd z PHP i bazą danych.

0

od strony php nie sypie mi błędów (już)

Domyślna konfiguracja mysqli w razie błędu nie rzuca wyjątkami, tylko zwraca false - i to właśnie ma miejsce w Twoim kodzie. Czyli "sypie ci błędem", tylko go świadomie ignorujesz.

W dokumentacji PHP znajdziesz informacje na temat tego, jak otrzymać konkretny komunikat zwracany przez bazę :-)

połączenie z bazą danych (kod w pliku) nie wysypuje błędu o braku połączenia

Brak połączenia to nie jedyny błąd, jaki może wystąpić - możesz mieć również np. literówkę w zapytaniu.

0

Nie chcę absolutnie być nie miła ale PHP nie jest moją dziedziną i nie uczę się go dla przyjemności i chęci znalezienia w nim pracy czy coś.
Muszę tylko "ogarnąć" to połączenie z bazą danych na jedną lekcję.
Także gdybyś Ty lub ktoś inny był skłonny wprost powiedzieć mi co zj****am to byłoby bardziej pomocne niż odsyłanie mnie do manuala php., w którym i tak nie wiem dokładnie czego szukać - bo nie rozumiem co jest błędem, a już tym bardziej jak go naprawić.

0

Także gdybyś Ty lub ktoś inny był skłonny wprost powiedzieć mi co zj****am

Ciężko powiedzieć, co dokładnie zepsułaś, skoro nawet nie znamy komunikatu błędu.

w którym i tak nie wiem dokładnie czego szukać

Wpisujesz w Google php mysqli error i lądujesz w miejscu, które dokładnie opisuje co z czym: https://www.php.net/manual/en/mysqli.error.php

bo nie rozumiem co jest błędem, a już tym bardziej jak go naprawić.

Nie powiedziałem, abyś szukała w dokumentacji poradnika jak naprawić ten błąd, tylko abyś znalazła informację w jaki sposób odczytać komunikat błędu z bazy danych?, abyśmy mogli przestać krążyć w miejscu.

0

Wobec tego zrobiłam wzorując się na linku. (mam nadzieję, że poprawnie)
Dodaje

if(!$this->mysqli->query("INSERT INTO indeks_studenta  VALUES ($naz,$sem,$oc1,$oc2,$oc3)"))
           {
               printf("Error message: %s\n", $this->mysqli -> error);
           }

I wciąż wyświetlane jest tylko false.

Jeśli zbudowałam polecenie niepoprawnie to proszę o poprawienie.
Wstawiłam je w funkcji dodajDoBazy() pod pobraniem danych z formularza do konkretnych zmiennych.

0

Ok, pokaż zaktualizowany kod.

0
<?php

class baza {
    
    //uchwyt
    private $mysqli;
    
    public function __construct($serwer,$user,$pass,$baza)
    {
       $this->mysqli = new mysqli('localhost','root','','studenci');
       
       //test połączenia
       if($this->mysqli->connect_errno)
       {
           printf ("Połączenie zerwane");
           exit(); 
    }
    }
    
   function walidacja()
    {
        $ok = 0;
        $args = ([
            'nazwisko' => ['filter' => FILTER_VALIDATE_REGEXP,
                            'options' => ['regexp' => '/^[A-Z]{1}[a-ząęłńśćźżó-]{1,25}$/']],
            'semestr_studiow' => ['filter' => FILTER_SANITIZE_NUMBER_INT],
            'ocena1' => ['filter' => FILTER_SANITIZE_NUMBER_FLOAT],
            'ocena2' => ['filter' => FILTER_SANITIZE_NUMBER_FLOAT],
            'ocena3' => ['filter' => FILTER_SANITIZE_NUMBER_FLOAT],
        ]);
        
        $dane = filter_input_array(INPUT_POST, $args);
        $errors ="";
        
        foreach ($dane as $key => $val) 
        {
            if($val === false or $val === NULL)
            {
                $errors.=$key."";
            }
            if ($errors === "")
            {
               $ok=1;
               return $ok;
            }
            else
            {
                echo "Błąd " . $errors;
            }
        }
    }
    
    function dodajDoBazy()
    {  
    
        $naz = isset($_POST['nazwisko']) ? $_POST['nazwisko'] : '';
        $sem = isset($_POST['semestr_studiow']) ? $_POST['semestr_studiow'] : '';
        $oc1 = isset($_POST['ocena1']) ? $_POST['ocena1'] : '';
        $oc2 = isset($_POST['ocena2']) ? $_POST['ocena2'] : '';
        $oc3 = isset($_POST['ocena3']) ? $_POST['ocena3'] : '';
        if(!$this->mysqli->query("INSERT INTO indeks_studenta  VALUES ('$naz',$sem,$oc1,$oc2,$oc3)"))
           {
               printf("Error message: %s\n", $this->mysqli -> error);
           }
        $sql = "INSERT INTO indeks_studenta (nazwisko, semestr_studiów, ocena_eg_1, ocena_eg_2, ocena_eg_3) VALUES ('$naz',$sem,$oc1,$oc2,$oc3)";
         if ($this->mysqli->query($sql))
         {
             echo "true"; 
         }
         else  
         {
             printf( "false");

         }
         
    }
}
0

Dlaczego porównujesz dwa różne zapytania?

INSERT INTO indeks_studenta  VALUES ('$naz',$sem,$oc1,$oc2,$oc3)

vs

INSERT INTO indeks_studenta (nazwisko, semestr_studiów, ocena_eg_1, ocena_eg_2, ocena_eg_3) VALUES ('$naz',$sem,$oc1,$oc2,$oc3)
0

Zapomniałam dać na to komentarz - mój błąd.
Natomiast bez tego po prostu nie dzieje się nic :(

0

Możesz pokazać jakiegoś screenshota?

0

$sql = "INSERT INTO indeks_studenta (nazwisko, semestr_studiów, ocena_eg_1, ocena_eg_2, ocena_eg_3) VALUES ('$naz',$sem,$oc1,$oc2,$oc3)";

$sql = "INSERT INTO indeks_studenta VALUES ('$naz','$sem','$oc1','$oc2','$oc3')";

?

0
4michal napisał(a):

$sql = "INSERT INTO indeks_studenta (nazwisko, semestr_studiów, ocena_eg_1, ocena_eg_2, ocena_eg_3) VALUES ('$naz',$sem,$oc1,$oc2,$oc3)";

$sql = "INSERT INTO indeks_studenta VALUES ('$naz','$sem','$oc1','$oc2','$oc3')";

?

Również nie :)
Tak naprawdę błąd był gdzieś (i nadal jest) w moim środowisku ponieważ całość na komputerze wykładowcy zadziałała. Temat zakończony dziękuję za pomoc :)

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