Autor Zpráva
Babemeta
Profil *
Zdravim,
mám jenom kratký dotaz:
Začal jsem teď dělat databáze a v databázi mám uloženou tabulku ve které jsou řádky jmeno a heslo s prozatimními daty pokus a pokus. Pak mám přihlašovací formulář, kterzý zpracovává data od uživatele:
$jmeno = $_POST['jmeno'];
$heslo = $_POST['heslo'];


No a teď je problém v tom, že jsem si vypsal data z databáze do proměnné a chtěl jsem je porovnat s proměnnou z formuláře. Problém je, že se mi sice nevypisuje žádná chyba, ale pořád mi to píše, že data nejsou shodná. Kontroloval jsem var_dumpem data z formuláře a ty jsou v pořádku:

$jmeno_dat = mysql_query('SELECT Jmeno FROM Uzivatele',$id_spojeni);
if (!$jmeno_dat)
  die('Nepodařilo se nám poslat SQL dotaz do databáze.');

$heslo_dat = mysql_query('SELECT Heslo FROM Uzivatele',$id_spojeni);
if (!$heslo_dat)
  die('Nepodařilo se nám poslat SQL dotaz do databáze.');

if ($jmeno == $jmeno_dat && $heslo == $heslo_dat)
echo "Přihlášení proběhlo úspěšně";
else
die ("Zadali jste neplatné údaje");


Díky moc
BuGeR
Profil
Zkus použít array :)
$jmeno_dat = mysql_fetch_array(mysql_query('SELECT Jmeno FROM Uzivatele',$id_spojeni));
if (!$jmeno_dat["Jmeno"])
  die('Nepodařilo se nám poslat SQL dotaz do databáze.');

$heslo_dat = mysql_fetch_array(mysql_query('SELECT Heslo FROM Uzivatele',$id_spojeni));
if (!$heslo_dat["Heslo"])
  die('Nepodařilo se nám poslat SQL dotaz do databáze.');

if ($jmeno == $jmeno_dat["Jmeno"] && $heslo["Heslo"] == $heslo_dat)
echo "Přihlášení proběhlo úspěšně";
else
die ("Zadali jste neplatné údaje");
Alphard
Profil
[#1] Babemeta
Tohle není moc promyšlené. V databázovém dotazu lze použít např. where. Smyslem databáze je právě, aby se podobné věci nemusely dělat v aplikaci.

Ten kód navíc přestane fungovat s druhým uživatelem.
panther
Profil
Babemeta:
smím se zeptat, proč potřebuješ na přihlášení uživatele dva dotazy? Kdybys chtěl vytáhnout ještě adresu, telefon a e-mail, dodal bys sadu dalších 3 dotazů?
Keeehi
Profil
Babemeta:
Musíš potom použít mysql_fetch_* (např. mysql_fetch_array)
Navíc tvůj dotaz ti vrátí všechny jména, ale postupně. Při prvním zavolání funkce mysql_fetch_array() se ti vrátí pole ve kterém bude první jméno z výsledku, při druhém zavolání se vrátí druhé jméno, atd..

Vlastně by to chtělo celé předělat. Kontrola přihlášení by mohla vypadat asi takto:
$vysledek=mysql_query("SELECT 1 FROM Uzivatele WHERE Jmeno='$jmeno' AND Heslo='$heslo'",$id_spojeni);
if(mysql_num_rows($vysledek)==1)
  echo "Přihlášení proběhlo úspěšně";
else
  die ("Zadali jste neplatné údaje");

Ovšem je to udělané jinak, než jsi to myslel. Takový modelový příklad: Vypsání všech jmen a hesel do tabulky
echo "<table>";

$vysledek=mysql_query("SELECT Jmeno,Heslo FROM Uzivatele",$id_spojeni);
while(list($jmeno_db,$heslo_db)=mysql_fetch_row($vysledek)){
  echo "<tr><td>$jmeno_db</td><td>$heslo_db</td></tr>";
}

echo "</table>";
Babemeta
Profil *
BuGeR: bohužel pořád ten samý problém :-(

Alphard: Jak jsem psal databázi jsem začal dělat teprve dneska a tohle je moje první práce s ní takže se jenom učím připojovat se číst z ní atd.
S druhým uživatelem jsem si toho vědom. Díky za odkaz.
Babemeta
Profil *
Keehi: Díky moc. Zrovna jsem si četl odkaz o funkci WHERE, když jsem si všimnul tvýho příspěvku. Už jsem to pochopil jen mi to vypisuje varování:
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /3w/wz.cz/c/castle-lord/prihlaseni.php on line 17

a hned potom zadali jste neplatné údaje, i když jsem zadal platné.

Ještě jsem se chtěl zeptat k zapamatování přihlášení je vhodný použít cookies, který budu na každý stránce znovu kontrolovat a budou mít platnost třeba půl hodiny. Nebo je lepší něco jinýho?

Díky moc
Babemeta
Profil
Už jsem se konečně zaregistroval takže nebudu muset psát furt nový příspěvky.

Ještě Keehi:
takže chápu to dobře, že jakmile vytáhnu nějaký data z databáze automaticky se mi uloží do proměnný $nazev_db ?
Díky
Keeehi
Profil
Babemeta:
Warning: …
Tipoval bych to na chybu v dotazu.
1) co se vypíše, pokud před ten dotaz napíšeš: echo "SELECT 1 FROM Uzivatele WHERE Jmeno='$jmeno' AND Heslo='$heslo'";?
2) co se vypíše, pokud za ten dotaz napíšeš: echo mysql_errno($link) . ": " . mysql_error($link). "\n";
3) určitě se tabulka jmenuje Uzivatele? Není to třeba uzivatele, nebo UZIVATELE (stejně tak sloupce)?

takže chápu to dobře, že jakmile vytáhnu nějaký data z databáze automaticky se mi uloží do proměnný $nazev_db ?
Bohužel to chápeš špatně.
mysql_query pošle dotaz na databázi a vrátí jakýsi "ukazatel" na ten konkrétní dotaz.
potom, když zavoláš funkci mysql_fetch_assoc a jako parametr ji předáš tento ukazatel, tak ti vrátí pole. Toto pole vypadá takto:
Array(
["jmeno_prvniho_sloupce"]=>"hodnota prvního sloupce"
["jmeno_druheho_sloupce"]=>"hodnota druheho sloupce"
["jmeno_tretiho_sloupce"]=>"hodnota tretiho sloupce"

)
pokud toto pole bude uložené do proměnné pole ($pole=mysql_fetch_assoc($vysledek)) pak hodnota druhého sloupce bude přístupná takto: $pole["jmeno_druheho_sloupce"];

Toto pole je však seznamem hodnot prvního řádku výsledku. Pokud bych chtěl druhý řádek, musím funkci mysql_fetch_assoc provést ještě jednou. Kdybych chtěl třetí řádek, musím ji provést potřetí.

Takže můj výpis všech jmen a hesel do tabulky by mohl vypadat takto:
echo "<table>";

$vysledek=mysql_query("SELECT Jmeno,Heslo FROM Uzivatele",$id_spojeni);
for($i=0;$i<mysql_num_rows($vysledek);$i++){
  $pole = mysql_fetch_row($vysledek);
  echo "<tr><td>".$pole["Jmeno"]."</td><td>".$pole["Heslo"]."</td></tr>";
}

echo "</table>";

Toto je snad pochopitelné. Mně se to však nezdá elegantní. Proto jsem to zapsal tak, jak jsem to zapsal. Líbí se mi to tak víc. Pokusím se ti to vysvětlit, jak to funguje.
nejdůležitější je tento řádek:
while(list($jmeno_db,$heslo_db)=mysql_fetch_row($vysledek)){
cyklus while(podmínka) se provádí tak dlouho, dokud je podmínka splněna. Podmínka je list($jmeno_db,$heslo_db)=mysql_fetch_row($vysledek). Všimni si, že je v ní = a ne == jako u porovnávání, jde tedy o přiřazení výsledku funkce mysql_fetch_row funkci list. Dokud je co přiřazovat (jak jsem psal výše, funkce mysql_fetch_assoc bere řádek po řádku) tak se to přiřadí, podmínka se vyhodnotí jako true, cyklus se vykoná a znovu se testuje podmínka. Znovu se pokusí funkci list přiřadit výsledek (pole) funkce mysql_fetch_assoc. Tentokrát už se to vlastně testuje podruhé, takže m_f_a vrátí druhý řádek a takto pořád dokola až se dostaneme na konec tabulky výsledků. Tehdy, protože už není co přiřazovat se podmínka vyhodnotí jako false a cyklus skončí.

Tak a ještě to přiřazení list($jmeno_db,$heslo_db)=mysql_fetch_row($vysledek) funkce list funguje takto: Přiřazené pole "rozseká" do proměnných předaných jako parametry. Příklad:
$pole[0]="jabko";
$pole[1]="hrušky";
$pole[2]="švestky";
$list($ovoce1,$ovoce2,$ovoce3)=$pole;

echo "Mám rád ovoce, nejraději mám: $ovoce1, $ovoce2, $ovoce3.";
//výsledek je tento: Mám rád ovoce, nejraději mám: jabko, hrušky, švestky.
Babemeta
Profil
Díky, že ses tak rozepsal. Základní problém byl v tom, že jsem nikde neviděl definovaný ty proměnný, protoože ještě nemám úplně zažitý rozdíl mezi = a ==. Takhle už to chápu díky.

Když jsem tam dopsal (k tomu přihlašování) to co jsi psal:
$vysledek=mysql_query("SELECT 1 FROM Uzivatele WHERE Jmeno='$jmeno' AND Heslo='$heslo'",$id_spojeni);
 echo "SELECT 1 FROM Uzivatele WHERE Jmeno='$jmeno' AND Heslo='$heslo'";

if(mysql_num_rows($vysledek)==1)
  echo "Přihlášení proběhlo úspěšně";
else
  die ("Zadali jste neplatné údaje");
echo mysql_errno($link) . ": " . mysql_error($link). "n"; 


Vypisuje se tohle:
SELECT 1 FROM Uzivatele WHERE Jmeno='pokus' AND Heslo='pokus'
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /3w/wz.cz/c/castle-lord/prihlaseni.php on line 18
Zadali jste neplatné údaje


Pokud chceš můžeš se na ten skript podívat tady.

Jinak už jsem si na jeden dotaz odpověděl sám: Ne cookies, sessions
panther
Profil
Babemeta:
vypiš si mysql_error, máš chybu v dotazu. Základní věc, omílá se tu pořád dokola.

EDIT: je tam, ale na špatném místě, kde jsem ho nehledal.
Keeehi
Profil
takto:
$vysledek=mysql_query("SELECT 1 FROM Uzivatele WHERE Jmeno='$jmeno' AND Heslo='$heslo'",$id_spojeni);
echo mysql_errno($link) . ": " . mysql_error($link). "n";
Jelikož jsi to bylo až za die("xxx"), tak se to neprovedlo, protože po die script končí.
Babemeta
Profil
Díky. Tak se mi to vypsalo, že proměnný heslo a jmeno nejsou definovaný...Zkusil jsem si ještě vypsat var_dumpem, ale NULL NULL. Nechápu teda v čem je problém...

Vypisuje to přesně tohle

Odesílací formulář:
<h3>Přihlášení:</h3>
<form action="prihlaseni.php" method="post">
Jméno: <input type="text" name="jmeno"><br>
Heslo: <input type="password" name="heslo"><br>
<input type="submit" value="Přihlásit se">


A prihlaseni.php:
<?php
error_reporting(E_ALL);

$jmeno = $_POST['jmeno'];
$heslo = $_POST['heslo'];

var_dump($jmeno);
var_dump($heslo);


if($jmeno == "" || $heslo == "")
die("Musíte vyplnit všechny položky formuláře!");

$id_spojeni = mysql_connect('mysql.webzdarma.cz','castlelord','heslo');
if (!$id_spojeni)
  die('Spojení s MySQL databází se nezdařilo.');

$vysledek=mysql_query("SELECT 1 FROM Uzivatele WHERE Jmeno='$jmeno' AND Heslo='$heslo'",$id_spojeni);
echo mysql_errno($link) . ": " . mysql_error($link). "n";
 echo "SELECT 1 FROM Uzivatele WHERE Jmeno='$jmeno' AND Heslo='$heslo'";

if(mysql_num_rows($vysledek)==1)
  echo "Přihlášení proběhlo úspěšně";
else
  die ("Zadali jste neplatné údaje");


setcookie('prihlaseni', '$prihlaseni', time()+1800);
mysql_close($id_spojeni);

?>



(heslo je v kódu uvedeno správně...)
Keeehi
Profil
echo mysql_errno($link) . ": " . mysql_error($link). "n";
upravte na
echo mysql_errno($id_spojeni) . ": " . mysql_error($id_spojeni). "n";

To NULL NULL je tam jenom když se na stránku vleze přímo, když se na ni přijde z toho formuláře, tak už to null null není.
Babemeta
Profil
Pardon toho jsem si nevšiml. Upravil jsem to a pak mi to vypisovalo no database selected tak jsem kód upravil takto:
$id_spojeni = mysql_connect('mysql.webzdarma.cz','castlelord','heslo');
if (!$id_spojeni)
  die('Spojení s MySQL databází se nezdařilo.');

mysql_select_db ('castlelord','$id_spojeni');

$vysledek=mysql_query("SELECT 1 FROM Uzivatele WHERE Jmeno='$jmeno' AND Heslo='$heslo'",$id_spojeni);
echo mysql_errno($id_spojeni) . ": " . mysql_error($id_spojeni). "n";


Bohužel teď to vypisuje toto:
Warning: mysql_select_db(): supplied argument is not a valid MySQL-Link resource in /3w/wz.cz/c/castle-lord/prihlaseni.php on line 14
1046: No database selectedn
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /3w/wz.cz/c/castle-lord/prihlaseni.php on line 19
Zadali jste neplatné údaje


Teď zkoušim udělat registraci a vypisuje mi to opět "no database selected" a opět, že mysql_select_db není validní mysql link nebo co. Viz Odkaz
Keeehi
Profil
Babemeta:
1) smaž si z diskuse přihlašovací údaje k databázi
2) napiš toto:
mysql_select_db ('castlelord','$id_spojeni');
takto:
mysql_select_db ('castlelord',$id_spojeni);

A aby jsi do příště věděla proč, přečit si o uvozovkách.
Babemeta
Profil
Díky moc. Teď už funguje jak má i registrace. Díky moc.

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

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

0