Autor Zpráva
bicebs
Profil
Keď som to skúšal tak mi napiše Parse error: parse error in /3w/borec.cz/h/hrynah0vno/prvy skript.php on line 52

tu je skript
        <?
  function JeEmail ($cislo)
  {
    return ereg("^.+@.+..+$",$cislo);
  }

 function emailvdb ($email, $link)
  {
    $vysledok=mysql_query("select * from uzivatelia where email='".$email."'", $link);
    return (boolean) mysql_num_rows($vysledok);
  }  

 function prezivkavdb ($prezivka, $link)
  {
    $vysledok=mysql_query("select * from uzivatelia where prezivka='".$prezivka."'", $link);
    return (boolean) mysql_num_rows($vysledok);
  }  
  // telo skriptu - nejprve si vytvoříme odkaz na databázi
  $link=mysql_connect(mysql.webzdarma.cz, *****, *****);
  mysql_select_db(uzivatelia);
  mysql_query("SET NAMES 'utf8'");
  
 $BudemeZobrazovat=true;
  if (!empty($_POST)) // už se odeslalo
  {
    /*
    budeme kontrolovat následující věci:
    1) e-mailovou adresu
    2) zda tam již e-mail není
    3) zda tam již přezdívka není
    4) zda je přezdívka mezi 3 a 50 znaky délky
    5) zda je heslo 3 až 50 znaků dlouhé
    */
    if (!JeEmail($_POST["email"])) echo "Není zadán platný e-mail";
    elseif (emailvdb($_POST["email"], $link)) echo "Uvedený e-mail je již registrován";
    elseif (prezivkavdb ($_POST["prezivka"], $link)) echo "Uvedená přezdívka je již registrována";
    elseif ((strlen ($_POST["prezivka"])>50) | strlen ($_POST["prezivka"])<3)echo "Přezdívka musí mít 3-50 znaků";
    elseif ((strlen ($_POST["heslo"])>50) | strlen ($_POST["heslo"])<3) echo "Heslo musí mít 3-50 znaků";
    else
    {
      // kontolou jsme prošli
      $BudemeZobrazovat=false;
      // poděkujeme uživateli
      echo "Děkujeme za registraci. Na vaši adresu ".$_POST["email"]." byly zaslány informace pro její dokončení.";
      // uložíme to do databáze
      mysql_query ("insert into uzivatelia (email, prezivka, heslo) values ('".$_POST["email"]."', '".$_POST["prezivka"]."', '".$_POST["heslo"]."');", $link);
      $lastid=mysql_insert_id();
      // a sestavíme e-mail s instrukcemi, jak registraci dokončí
      $path="[url=http://".$_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["SCRIPT_NAME"]."?clanek=registracedokoncena&amp;id=".$lastid."&amp;email=".$_POST["email]http://".$_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["SCRIPT_NAME"]."?clanek=registracedokoncena&amp;id=".$lastid."&amp;email=".$_POST["email[/url]"];
      $telo = "Dekujeme Vam za registraci na nasem portale [nazev hudebniho portalu]. Pro dokonceni ".
      "registrace klepnete na nasledujici odkazn".
      "<a href="$path">$path</a>n".
      "Pokud jste se na nasem portale nechteli zaregistrovat, povazujte tento e-mail za bezpredmetny.n".
      "Vas [nazev hudebniho portalu] team.";
      $hlavicky="From: ".$_POST["email"]."nReturn-Path:".$_POST["email"];
      @mail ($_POST["email"], "Registrace na portalu", $telo, $hlavicky, "-f ".$_POST["email"]);
    }
  }
if ($BudemeZobrazovat):?>
Tori
Profil
Co z toho je řádek 52?


Tady musíte použít apostrofy okolo URL: "<a href='$path'>$path</a>n". anebo ty vnitřní uvozovky escapovat. Viz Úvodzovky
bicebs
Profil
pomohlo to
Taps
Profil
bicebs:
Zkus kod vložit do tagu pre, ať se nám snadněji hledá chyba.
bicebs
Profil
teraz tam píše Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /3w/borec.cz/h/hrynah0vno/prvy skript.php on line 10
bicebs
Profil
tu mi ukazuje chybu return (boolean) mysql_num_rows($vysledok);
Tori
Profil
1. Dejte prosím ten kód do [pre], tohle se nedá pořádně číst. (Klikněte si u prvního příspěvku na "Upravit", označte myší/klávesnicí celý ten kus kódu a klikněte na ikonku [<>] nebo stiskněte Ctrl+E.) Moderátorovi budiž díky.
2. Chybí vám tam všude escapování dat, která vkládáte do SQL dotazů. Doplňte si to do skriptu, a pokud to bude stále házet nějakou chybu, napište jakou.
Lkopo
Profil *
Lebo je absolútna hlúposť dávať boolean na mysl_num_rows(). Má to vrátiť číselnú hodnotu a vy od toho očakávate typ boolean?
lionel messi
Profil
bicebs:

Nie je to síce tvoj najväčší problém, ale nepoužívaj funkciu ereg, je zastaraná. Uprednostnil by som preg_match
Tori
Profil
Lkopo:
IMHO to je ok - chce vědět, jestli e-mail už existuje v DB a na to je odpověď ano/ne. Jiná věc, že by se to dalo řešit i pomocí SELECT COUNT(*), ale chyba je způsobená rozbitou syntaxí SQL dotazu, což zřejmě souvisí s chybějícím escapováním.
Tori
Profil
bicebs:
A teď je, díky zformátování kódu, vidět ještě několik dalších chyb. Nejhorší je to chybějící escapování. Na ř.4 není escapovaná tečka v reguláru. Na ř.19+20 nejsou řetězce v uvozovkách, funguje je to jen díky benevolenci PHP. Na ř.37+38 má místo | být v podmínce ||, jedno svislítko je logický (bitový) operátor. Zalomení řádku není n ale \n, navíc v hlavičkách e-mailu by, jestli se nepletu, bylo lepší používat \r\n.
bicebs
Profil
Riadky 19,20 som opravil - dal som tam tie úvodzovky ale stále mi píše chyba v riadku 10 a ako mám escapovať riadok 4 .
Pokiaľ si myslel riadok 37 a 38 toto
elseif ((strlen ($_POST["prezivka"])>50) | strlen ($_POST["prezivka"])<3)echo "Přezdívka musí mít 3-50 znaků";
    elseif ((strlen ($_POST["heslo"])>50) | strlen ($_POST["heslo"])<3) echo "Heslo musí mít 3-50 znaků";
    else
tak som to opravil .


Neviem či to dobre escapujem ale keď to upravim takto
$vysledok=mysql_query("select * from uzivatelia where email='\".$email.\"'", $link);
tak mi to po uložení vymaže \
Tori
Profil
Tečka v reguláru znamená "jakýkoli znak". Pokud má znamenat jen "tečka", tak před ní musí být zpětné lomítko. Jinak by vám tou kontrolou prošel jakýkoli řetězec, který obsahuje za zavináčem aspoň tři jakékoli znaky.
return ereg("^.+@.+\..+$",$cislo);

Řádek č.9 by měl (s escapováním pro MySQL) vypadat takto: $vysledok = mysql_query("select * from uzivatelia where email='".mysql_real_escape_string($email)."'", $link); Když si to tak změníte, stále vám to píše chybu na ř.10? A jakou?
bicebs
Profil
Teraz sa mi vymaže každé \ čo mám spraviť ?


Stále mi vypisuje
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /3w/borec.cz/h/hrynah0vno/prvy skript.php on line 10
Tori
Profil
Jaké každé \? Odkud?

K té chybě: příčina je v SQL dotazu, přesnou zjistíte podle FAQ: Nejčastější potíže s PHP (FAQ) » Warning mysql_fetch_array() (nebo jiná MySQL funkce): supplied argument is not a valid MySQL result resource…
bicebs
Profil
Všetky obrátené lomýtka mi to vymazalo


z tade
("^.+@.+\..+$",$cislo)
Tori
Profil
Co používáte za editor?
bicebs
Profil
webzdarma.cz
Našiel som chybu a opravil ju namiesto názvu databázy som dal názov tabuľky ale teraz mi nič nenapíše pred tím mi napísalo Děkujeme za registraci. Na vaši adresu...byly zaslány informace pro její dokončení.
bicebs
Profil
Keď mám rovnaké meno v phpmyadmin a názov databázy je to problém ?
jordan
Profil *
na radku 52:
"<a href="$path">$path</a>n". chybí tečky popřípadě {}

"<a href='".$path."'>".$path."</a>" řekl bych já
bicebs
Profil
Tvar emailu to overí ale ďalšie podmienky nie problém bude asi niekde tu
function emailvdb ($email, $link)
  {
    $vysledok=mysql_query("select * from uzivatelia where email='".mysql_real_escape_string($email)."'", $link);
    return (boolean) mysql_num_rows($vysledok)or
    die( mysql_error());
  }  

  function prezivkavdb ($prezivka, $link)
  {
    $vysledok=mysql_query("select * from uzivatelia where prezivka='".mysql_real_escape_string($prezivka)."'", $link);
    return (boolean) mysql_num_rows($vysledok) or
    die( mysql_error());
  }  
  // telo skriptu - nejprve si vytvoříme odkaz na databázi
  $link=mysql_connect("mysql.webzdarma.cz","hrynah0vno","heslo");
  mysql_select_db("hrynah0vno");
  mysql_query("SET NAMES 'utf8'");
keď ako server uvediem "mysql.webzdarma.cz" tak je to správne ?
Tori
Profil
Jestli vám skript nečekaně skončí někde u těch podmínek, tak příčina je tady:
return (boolean) mysql_num_rows($vysledok) or
    die( mysql_error());
Funguje to tak, že pokud funkce (tady mysql_num_rows) vrátí hodnotu, která se dá přetypovat na FALSE (tedy FALSE, 0, "", NULL apod.), tak se provede druhá část a skript se v tom místě ukončí (podívejte se do manuálu, jak funguje zkrácené vyhodnocování podmínek). Tu označenou část smažte a nechte tam jen return (boolean) mysql_num_rows($vysledok);
nemeja
Profil
Nestačilo by pro kontrolu, zda se příkaz provedl dát tu podmínku na mysql_query?
function prezivkavdb ($prezivka, $link)
  {
    return mysql_query("select * from uzivatelia where prezivka='".mysql_real_escape_string($prezivka)."'", $link);
  }  

Případně:
function prezivkavdb ($prezivka, $link)
  {
    if(mysql_query("select * from uzivatelia where prezivka='".mysql_real_escape_string($prezivka)."'", $link)){
       $return = true;
    } else {
        $return = mysql_error();
  }  
  return $return;

A nebo podmínku shrnout na jeden řádek

function prezivkavdb ($prezivka, $link)
  {
    $query = "select * from uzivatelia where prezivka='".mysql_real_escape_string($prezivka)."'";
    return (mysql_query($query, $link) ? true : mysql_error());
  }  
Tori
Profil
První příklad dělá něco úplně jiného (ověřuje syntaktickou správnost dotazu, nikoli existenci přezdívky v DB), u dalších dvou by si bicebs musel přepsat podmínky na porovnávání identity: if ( prezivkavdb($_POST['prezivka'], $link) === true ) { (jinak by to mohlo vracet nesprávné výsledky).
Kubo2
Profil
bicebs, nemeja:
Alebo na štrvtom riadku nemejovho posledného kódu poprípade:


// ...
return (bool) mysql_errno($link);
// ..

Ospravedlňujem sa za príspevok, príliš letmo som preletel fórum.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

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