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

Poradnik PHP - Parse error: syntax error, unexpected '@', expecting identifier

Object Storage Arubacloud
0 głosów
1,272 wizyt
pytanie zadane 25 stycznia 2020 w PHP przez Borys Użytkownik (830 p.)

Witam, ostatnio zainteresowałem się php'em. Podczas oglądania 2 odcinku kursu Pana Zelenta, podczas testu napodkałem błąd o treści ""Parse error: syntax error, unexpected '@', expecting identifier (T_STRING) or variable (T_VARIABLE) or '{' or '$' in /opt/lampp/htdocs/website-2020/php/login.php on line 15"". Mój kod  wygląda tak:

<?php
    require_once "connect.php";

    $connection = @new mysqli($host, $db_user, $db_password, $db_name);

    if($connection->connect_errno!=0){
        echo "Error".$connection->connect_errno;
    }
    else{
        $login = $_POST['login'];
        $password = $_POST['password'];

        $sql = "SELECT * FROM uzytkownicy WHERE user='$login' AND pass='$password'";

        if($result->@$connection->query($sql)){

            $users_number = $result->num_rows;

            if($users_number>0){
                $all_user_data = $result->fetch_assoc();
                $password = $all_user_data['pass'];
                echo $password;
            }
            else{

            }
        }

        $connection->close();
    }
?>

Po usunięciu "@" ukazują się 3 błędy:
Notice: Undefined variable: result in /opt/lampp/htdocs/website-2020/php/login.php on line 15

Notice: Trying to get property '' of non-object in /opt/lampp/htdocs/website-2020/php/login.php on line 15

Fatal error: Uncaught Error: Object of class mysqli could not be converted to string in /opt/lampp/htdocs/website-2020/php/login.php:15 Stack trace: #0 {main} thrown in /opt/lampp/htdocs/website-2020/php/login.php on line 15

1 odpowiedź

0 głosów
odpowiedź 25 stycznia 2020 przez Arkadiusz Waluk Ekspert (287,950 p.)

Co próbujesz zrobić w 15 linii? Może raczej chcesz przypisać odpowiedź z zapytania do zmiennej $result?

Sama @ jeśli już to powinna się znaleźć zaraz za if(, a nie gdzieś w środku. Jednak zakładam, że i tak nie chciałeś się odwołać do właściwości o nazwie wartości zmiennej z $connection na obiekcie $result, bo to nie za bardzo ma sens. Stąd też te błędy po usunięciu - zmienna $result nie istnieje, a próbujesz się odwołać we wspomnianej linii do właściwości obiektu w niej. Kolejny błąd mówi, że próbujesz odwołać się do właściwości nie na obiekcie (bo $result nie jest obiektem) i ostatni, że próbujesz zamienić klasę mysqli (jest w zmiennej $connection) na stringa (bo próbujesz szukać właściwości obiektu $result o nazwie ze zmiennej $connection, a tam w rzeczywistości nie ma nazwy tylko cały obiekt połączenia).

No i poza tym generalnie nie używaj @, bo one ukrywają błędy, a zamiast je ukrywać lepiej w razie czego zobaczyć i rozwiązać. Samo wykonywanie zapytań w taki sposób z wartościami pobranymi bezpośrednio użytkownika oraz niehaszowanie haseł też jest nie do przyjęcia, ale to wszystko kolejne odcinki kursu chyba poprawiają.

komentarz 25 stycznia 2020 przez Borys Użytkownik (830 p.)

@Arkadiusz Waluk

 

dobra, tego ifa mam zamienić na

if($connection->query($sql)){
    cos
}

i zrobić obiekt z $result objekt - moje pytanie brzmi jak?

Co do tego ifa i zmiennej result w nim to tak jest w tutorialu (czas 48:40):

https://www.youtube.com/watch?v=Pp578w7C9hE

 

 

komentarz 25 stycznia 2020 przez Arkadiusz Waluk Ekspert (287,950 p.)

"zrobić obiekt z $result objekt" - chyba nie zrozumiałem?

Możesz zamienić ifa tak jak pokazałeś, ale wtedy nigdzie nie odczytasz tego co zwróci query(), czyli rekordów z bazy.

W tutorialu w podanym czasie widzę wszędzie przypisanie do $rezultat, a nie wykonanie czegoś na nieistniejącym obiekcie, jak Ty to pierwotnie zrobiłeś. -> a = to jednak znacznie coś innego.

komentarz 25 stycznia 2020 przez Borys Użytkownik (830 p.)
AAA faktycznie, dziękuję, ale wyświetla mi się pusta strona(mam echo)
komentarz 25 stycznia 2020 przez Borys Użytkownik (830 p.)

@Arkadiusz Waluk,
 ok po zrobieniu else tego 1 ifa okazalo sie że on się nie wykonuje

mam tą samą db co z odcinka, kiedy wpisuje `adam` i `qwerty` (if się nie wykonuje)

nowy kod:

<?php
    require_once "connect.php";

    $connection = @new mysqli($host, $db_user, $db_password, $db_name);

    if($connection->connect_errno!=0){
        echo "Error".$connection->connect_errno;
    }
    else{
        $login = $_POST['login'];
        $password = $_POST['password'];

        $sql = "SELECT * FROM uzytkownicy WHERE user=$login AND pass=$password";

        if($result = @$connection->query($sql))
        {

            $users_number = $result->num_rows;
            echo $users_number;

            if($users_number>0)
            {
                $all_user_data = $result->fetch_assoc();
                $user = $all_user_data['user'];

                $result->free_result();
                echo $user;
            }
            else
            {
                echo "2 if";
            }
        }
        else{
            echo "1 if";
        }

        $connection->close();
    }
?>

 

komentarz 25 stycznia 2020 przez Arkadiusz Waluk Ekspert (287,950 p.)

A więc zapytanie do bazy jest błędne. Wydaje się, że brakuje apostrofów/cudzysłowów dla wartości tekstowych. Powinno więc być np. user='$login' (choć to bardzo zły sposób wstawiania wartości, ale o tym juz wspomniałem i mam nadzieję nauczysz się dalej). Sprawdź dokładnie też nazwę tabeli, nazwy kolumn.

Podobne pytania

0 głosów
2 odpowiedzi 336 wizyt
pytanie zadane 20 października 2018 w PHP przez Śmieszek_;3 Użytkownik (780 p.)
0 głosów
1 odpowiedź 737 wizyt
+1 głos
2 odpowiedzi 577 wizyt

92,579 zapytań

141,432 odpowiedzi

319,664 komentarzy

61,964 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

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!

...