Autor Zpráva
Martin21000
Profil
Prosím vás poraďte, už pár dnů hledám nějakou chybu na řádku 83 a stále nemůžu nic najít :-( . Už jsem to zkoušel všemi různými způsoby opravit, ale pořád mi to píše stejnou chybovou hlášku - " Parse error: syntax error, unexpected T_VARIABLE in C:\ComplexWebServer\http_docs\pridavani.php on line 83 ". Je to na zbláznění. :-(
Budu vděčný za každou radu! :-)

Jinak tento kód je zkopírovaný a upravený z jedné stránky. Jsem stále začátečník a teprve se to učím, tak na mě prosím berte ohledy :-)

 <?php
if(isset($_POST['submit'])){    //jestli tlačítko bylo zmačknuté tak jdi dál, jinak budete přesměrování na stránku pro registraci nového uživatele

    if(isset($_POST['jmeno']))
    {
        $jmeno = stripslashes(htmlspecialchars(trim($_POST['jmeno'])));
        if($jmeno == '')
        {
                unset($jmeno);
        }
    }
//uložime do proměnné $name jméno, které uživatel zadál ve formuláři, 
//a hned ji ošetříme několika funkcemi, aby ani tagy ani skripty nefungovali a odstraníme mezery ( trim ) 
//Jestli je proměnná prázdna tak ji odstraníme.

    
    if(isset($_POST['prijmeni']))
    {
        $prijmeni = stripslashes(htmlspecialchars(trim($_POST['prijmeni'])));
        if($prijmeni == '')
        {
                unset($prijmeni);
        }
    }
//uložime do proměnné $login login, který uživatel zadál ve formuláři, 
//a hned ji ošetříme několika funkcemi, aby ani tagy ani skripty nefungovali a odstraníme mezery ( trim ) 
//Jestli je proměnná prázdna tak ji odstraníme.
    
    if(isset($_POST['email']))
    {
        $email = stripslashes(htmlspecialchars(trim($_POST['email'])));
        if($email == '')
        {
                unset($email);
        }
    }
//uložime do proměnné $heslo heslo, které uživatel zadál ve formuláři, 
//a hned ji ošetříme několika funkcemi, aby ani tagy ani skripty nefungovali a odstraníme mezery ( trim ) 
//Jestli je proměnná prázdna tak ji odstraníme.


    
    if(isset($_POST['heslo']))
    {
        $heslo = stripslashes(htmlspecialchars(trim($_POST['heslo'])));
        if($heslo == '')
        {
                unset($heslo);
        }
    }


    
    if(isset($_POST['mesto']))
    {
        $mesto = stripslashes(htmlspecialchars(trim($_POST['mesto'])));
        if($mesto == '')
        {
                unset($mesto);
        }
    }

    
    if(isset($_POST['ulice']))
    {
        $ulice = stripslashes(htmlspecialchars(trim($_POST['ulice'])));
        if($ulice == '')
        {
                unset($ulice);
        }
    }

//V případě, že jakákoli proměnná je prázdna, zastavíme skript a vyvedeme hlášení    
    if(empty($jmeno) or empty($prijmeni) or empty($email)) or empty($heslo)) or empty($mesto)) or empty($ulice))
    {
        exit("Vyplňte všechna pole");
    }


//Vložíme soubor s připojením k databázi. ( musí se nacházet ve stejné složce )    
    require_once 'db.php';

//Ověřujeme, zda jíž není uživatel se stejným loginem    
    $q1 = mysql_query("SELECT * FROM uzivatel WHERE email = .$email.");
    if(!$q1) { echo mysql_error() . ' - ' . mysql_errno(); }
    else {
//Jestli existuje tak vyvedeme hlášení
        if(mysql_num_rows($q1)==1){
            exit("Uživatelské jméno je obsazené, vyberte si jiné");
        } else {
//V případě, že není tak vložíme data o novém uživateli do databáze
            $q2 = mysql_query("INSERT INTO `uzivatel`(`jmeno`,`prijmeni`,`email`,`heslo`,`mesto`,`ulice`) VALUES('".$jmeno."','".$prijmeni."','".$email."','".

$heslo."','".$mesto."','".$ulice."')");
            if(!$q2) { echo mysql_error() . ' - ' . mysql_errno(); }
            else {
                echo "Děkuji za registraci, teď se můžete <a href="index.php">přihlásit</a>.";
            }
        }
    }
    
} else { header("Location: ".$_SERVER['SERVER_ROOT']."registration.php"); }
?>
jenikkozak
Profil
Na řádku 74 máš o 3 zavírací závorky víc, než by bylo potřeba.
Na řádku 97 máš uvozovky v řetězci obaleném uvozovkami. Buď vnitřní uvozovky escapuj zpětným lomítkem, nebo použij jiné řešení. Toto je ale zcela základní věc, která se učí na začátku první kapitoly výuky PHP.
Použití tohoto skriptu není dobrým způsobem, jak se PHP učit. Je sestaven hrozně. Kdyby mohl fungovat, pracoval by neefektivně a byl by nebezpečný. Naštěstí ale fungovat vůbec nebude.
Zdá se, že ani autor komentářů u skriptu nevěděl, co to vlastně má dělat.
Tori
Profil
A na ř.84 je chyba v SQL, porovnejte vložení proměnné se zápisem na ř.92.
Martin21000
Profil
Ano, řádek 84 měl být udělaný tímto způsobem:
 $q1 = mysql_query("SELECT * FROM uzivatel WHERE email = '.$email.'");
Děkuji za výpomoc :-)

jenikkozak: V čem Vám to připadá hrozné? Mě se zdá, že zatím to zapisování do databáze funguje :-)
anonymníí
Profil *
Martin21000:
Ano, řádek 84 měl být udělaný tímto způsobem:
ne.

V čem Vám to připadá hrozné? Mě se zdá, že zatím to zapisování do databáze funguje :-)
dovedeš si podobným způsobem "ošetřený" představit formulář o 100 kolonkách? Má pravdu, je to celé děsné, spíše návod, jak určitě ne. Byť to zdánlivě funguje.
Martin21000
Profil
Myslíte ten řádek 92? Nebo co konkrétně se vám nelíbí? Prosím o vysvětlení, jsem vážně začátečník a na této práci mi velmi záleží, tak potřebuji vědět všechny možné chyby.
lionel messi
Profil
Martin21000:
Ja som tiež začiatočník, ale skúsim vyjadriť názor, kde vidím chybu ja:

V skripte je strašne veľa podmienok - najprv podmienkuješ odoslanie, potom pre každé jedno políčko zostavuješ podmienku, myslím si, že by sa to dalo spojiť a zhustiť. Taktiež trochu nerozumiem tomu unset. Prečo? Ak to je prázdny reťazec, zachytí ho empty na 74. riadku.

Ide hlavne o prehľadnosť a tvoj skript prehľadný nie je - ak by si mal obriadiť 100 položiek, asi by si sa zbláznil.
Martin21000
Profil
Díky za specifikaci. :-) Uvidím jestli to půjde nějak zkrátit a zmenšit.. Toto byl asi vážně špatný tutoriál, protože už i já narážím na další chyby v dalších příkladech.
lionel messi
Profil
Ako by som postupoval ja (podotýkam, že úplne najlepšie riešenie to asi nebude):
 <?php
if(isset($_POST['submit'])){    //jestli tlačítko bylo zmačknuté tak jdi dál, jinak budete přesměrování na stránku pro registraci nového uživatele
//superglobálne premenné prehodíme do lokálnych, kvôli register_globals:
$jmeno = $_POST['jmeno'];
$prijmeni= $_POST['prijmeni'];
$email= $_POST['email'];
$heslo= $_POST['heslo'];
$mesto= $_POST['mesto'];
$ulice= $_POST['ulice'];
 //V případě, že jakákoli proměnná je prázdna, zastavíme skript a vyvedeme hlášení 
    
    if(empty($jmeno) or empty($prijmeni) or empty($email) or empty($heslo) or empty($mesto) or empty($ulice))
    {
        exit("Vyplňte všechna pole");
    }
//keďže sme kontrolu vyplnenia urobili už na začiatku, môžeme ďalšie issety vyhodiť, rovnako aj unsety, //pretože prázdnu al. nevyplnenú premennú nám odchytí empty na začiatku.
        $jmeno = stripslashes(htmlspecialchars(trim($_POST['jmeno'])));

//uložime do proměnné $name jméno, které uživatel zadál ve formuláři, 
//a hned ji ošetříme několika funkcemi, aby ani tagy ani skripty nefungovali a odstraníme mezery ( trim ) 

        $prijmeni = stripslashes(htmlspecialchars(trim($_POST['prijmeni'])));

//uložime do proměnné $login login, který uživatel zadál ve formuláři, 
//a hned ji ošetříme několika funkcemi, aby ani tagy ani skripty nefungovali a odstraníme mezery ( trim ) 


        $email = stripslashes(htmlspecialchars(trim($_POST['email'])));

//uložime do proměnné $heslo heslo, které uživatel zadál ve formuláři, 
//a hned ji ošetříme několika funkcemi, aby ani tagy ani skripty nefungovali a odstraníme mezery ( trim ) 

        $heslo = stripslashes(htmlspecialchars(trim($_POST['heslo'])));


        $mesto = stripslashes(htmlspecialchars(trim($_POST['mesto'])));

        $ulice = stripslashes(htmlspecialchars(trim($_POST['ulice'])));
  
//Vložíme soubor s připojením k databázi. ( musí se nacházet ve stejné složce )    
    require_once 'db.php';
 
//Ověřujeme, zda jíž není uživatel se stejným loginem    
    $q1 = mysql_query("SELECT * FROM uzivatel WHERE email = $email");
    if(!$q1) { echo mysql_error() . ' - ' . mysql_errno(); }
    else {
//Jestli existuje tak vyvedeme hlášení
        if(mysql_num_rows($q1)==1){
            exit("Uživatelské jméno je obsazené, vyberte si jiné");
        } else {
//V případě, že není tak vložíme data o novém uživateli do databáze
            $q2 = mysql_query("INSERT INTO `uzivatel`(`jmeno`,`prijmeni`,`email`,`heslo`,`mesto`,`ulice`) VALUES('".$jmeno."','".$prijmeni."','".$email."','".
 
$heslo."','".$mesto."','".$ulice."')");
            if(!$q2) { echo mysql_error() . ' - ' . mysql_errno(); }
            else {
                echo "Děkuji za registraci, teď se můžete <a href="index.php">přihlásit</a>.";
            }
        }
    }
    
} else { header("Location: ".$_SERVER['SERVER_ROOT']."registration.php"); }
?>



Ešte raz hovorím: Nie som žiadny expert, ale z fleku som to zrazil zo 103 riadkov na 57.
Martin21000
Profil
Zkusil jsem váš skript, nicméně pořád mu tam vadí jakési znaky v kolonce email jako je @ nebo . tak nevím co s tím. Asi to tam mělo nějaký smysl. Ukázka chyby: "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '@email.cz.' at line 1 - 1064"
Ale jinak krásně upravené :-) kéž by to tak i fungovalo :-(
jenikkozak
Profil
Martin21000:
To je proto, že i v tom „opraveném“ skriptu je stejná chyba v SQL dotazu, kterým se zjišťuje, zda v databázi není uživatel se stejným e-mailem.
anonymníí
Profil *
Martin21000:
Ale jinak krásně upravené
ani ne. Zkrácené ano, ale stále nebezpečné, viz. SQL injection.


navíc ten exit a vypsání bílé stránky, to je taky príma věc :-)
Taps
Profil
Martin21000:
Mohl by ti pomoci tento tutoriál http://pecan.cz/index.php?id=35&n=registrace-zpracovani-dat-z-formulare + navazující články
lionel messi
Profil
jenikkozak:
To je proto, že i v tom ‚opraveném‘ skriptu je stejná chyba v SQL dotazu, kterým se zjišťuje, zda v databázi není uživatel se stejným e-mailem.
Ja som sa zameral predovšetkým na „zhutnenie“ kódu, myslel som, že SQL dotazy sú dobre a nenapadlo mi pozrieť sa na ne… a priznám sa, že tam tú chybu nevidím :-(
anonymníí
Profil *
lionel messi:
proměnné uvedené na ř. 6 jsou nedefinované, budou vyhazovat noticku.


v tom SQL dotazu: neošetřené vstupy, ty tečky tam být nemají. Resp. mají, ale trochu jinak.
lionel messi
Profil
anonymníí:
Vďaka za upozornenie, skript v [#9] som upravil, úplne mi vypadlo, že spracúva dáta z formulára a treba myslieť na register_globals (bežne na to dávam pozor). Skript [#9] teraz predpokladá, že Martin21000 používa inputy so správnym atribútom name.

Keďže v [#10] autor nepísal, že by mu to hádzalo noticku, predpokladám, že testuje na localhoste so zapnutou direktívou register_globals…


Upravil som aj inkriminovaný nešťastný SQL dotaz, správne mal byť:

$q1 = mysql_query("SELECT * FROM uzivatel WHERE email = $email");
Martin21000
Profil
Mohl by ti pomoci tento tutoriál http://pecan.cz/index.php?id=35&n=registrace-zpracovani-dat-z-formulare + navazující články
Děkuji mnohokrát, vypadá to mnohem jednodušeji a dá se to i pochopit.

Takže co bych měl udělat aby mi to tu notičku nevyhazovalo? :-)
lionel messi
Profil
Martin21000:
Takže co bych měl udělat aby mi to tu notičku nevyhazovalo? :-)

Ten môj skript [#9] by už mal byť pri použití inputov s príslušným atributom name v tomto ohľade v poriadku.


Treba definovať premenné, čo som dopísal na riadky 4-9.
Martin21000
Profil
lionel messi:
Bohužel, zkusil jsem ho a stále to háže stejnou chybu.
Taps
Profil
Martin21000:
A jaká notice se ti zobrazuje ?
jenikkozak
Profil
lionel messi:
Upravil som aj inkriminovaný nešťastný SQL dotaz, správne mal byť:

$q1 = mysql_query("SELECT * FROM uzivatel WHERE email = $email");
Nemá. Proměnná $email evidentně obsahuje řetězec, musí být tedy nějakým způsobem ohraničen. To je chyba, která byla opravena už před patnácti příspěvky.

Keďže v [#10] autor nepísal, že by mu to hádzalo noticku, predpokladám, že testuje na localhoste so zapnutou direktívou register_globals…
A asi taky měl zapnout nějakou direktivu, aby mu uvozovky v uvozovkách nevyhodily syntax error. To jsou přece základy jakéhokoliv jazyka - když chceš použít řetězec, musíš ho něčím ohraničit, aby bylo jasné, co je součást řetězce a co příkazy jazyka. I kdybys tohle opravil, zůstane z toho děravá neefektivní blbost.

Na registraci uživatelů zkus nějaké lepší řešení, viz místní FAQ: Nejčastější potíže s PHP (FAQ) » Registrace uživatelů.

Edit: Skript odkázaný v [#13] taky nepoužívej, je totiž stejně děravý a evidentně nad ním nikdo dvakrát moc nepřemýšlel.
Martin21000
Profil
Tak já to tedy zkusím podle vašeho FAQu a uvidím.
Martin21000
Profil
jenikkozak:
Ten skript určitě není celý že? Zbytek si musíme dotvořit/upravit sami že? To abych mi už došla ta knížka o php a mysql. :-D
okolojsoucí
Profil
Martin21000:
Podle FAQ je script celý, co musíte udělat je propojit ho s databází a nahodit tabulky do databáze
Martin21000
Profil
Tak to nejspíš nechápu jak vytvořit ostatní stránky. Protože já na svých stránkách nepotřebuji, aby uživatel na sledování různých novinek byl přihlášený. Já potřebuji pouze aby byl přihlášený jen kdyby si chtěl něco objednat. A ten skript pokud jsem ho pochopil správně vyžaduje, aby byl uživatel přihlášený pořád.

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: