Pereiti prie turinio

Problema su login forma + MySQL


Rekomenduojami pranešimai

<?php 
$db = mysql_connect("localhost", "root", "");  
mysql_select_db("mysql");  
if (!$db) 
{ 
echo "Nu nah... Neprisijungia prie MySQL... \n"; 
} 
else 
{ 
echo "Prie MySQL prisijungti pavyko \n"; 
} 

echo "<fieldset>"; 
echo "<legend>Prisijungimas</legend>"; 
echo "<form>"; 
echo "<label for='user'>Vartotojo vardas</label>"; 
echo "<input type='text' name='user' />"; 
echo "<br />"; 
echo "<label for='pass'>Slaptazodis</label>"; 
echo "<input type='password' name='pass' />"; 
echo "<br />"; 
echo "<input type='submit' value='Prisijungti' />"; 
echo "</form>"; 
echo "</fieldset> \n"; 


$vartotojas=$_POST['user'];  
$slaptazodis=$_POST['pass'];  

$sql="SELECT * FROM vartotojai WHERE vardas='$vartotojas' and slaptazodis='$slaptazodis'"; 
$rezultatas=mysql_query($sql);  


$count=mysql_num_rows($rezultatas);  


if($count==1) 
{  
echo "Prisijungti pavyko!"; 
}  
else  
{  
echo "Neteisingas vartotojo vardas arba slaptazodis";  
}  
?>

Kažkodėl man niekad neišmeta "Prisijungti pavyko" :ph34r:

Kas čia negerai šitam skripte? ;]

Redagavo v1per
Nuoroda į pranešimą
Dalintis kituose puslapiuose
<?php 
$db = mysql_connect("localhost", "root", "");  
mysql_select_db("mysql");  
if (!$db) 
{ 
echo "Nu nah... Neprisijungia prie MySQL... \n"; 
} 
else 
{ 
echo "Prie MySQL prisijungti pavyko \n"; 
} 

echo "<fieldset>"; 
echo "<legend>Prisijungimas</legend>"; 
echo "<form>"; 
echo "<label for='user'>Vartotojo vardas</label>"; 
echo "<input type='text' name='user' />"; 
echo "<br />"; 
echo "<label for='pass'>Slaptazodis</label>"; 
echo "<input type='password' name='pass' />"; 
echo "<br />"; 
echo "<input type='submit' value='Prisijungti' />"; 
echo "</form>"; 
echo "</fieldset> \n"; 


$vartotojas=$_POST['user'];  
$slaptazodis=$_POST['pass'];  

$sql="SELECT * FROM vartotojai WHERE vardas='$vartotojas' and slaptazodis='$slaptazodis'"; 
$rezultatas=mysql_query($sql);  


$count=mysql_num_rows($rezultatas);  


if($count==1) 
{  
echo "Prisijungti pavyko!"; 
}  
else  
{  
echo "Neteisingas vartotojo vardas arba slaptazodis";  
}  
?>

Kažkodėl man niekad neišmeta "Prisijungti pavyko" :ph34r:

Kas čia negerai šitam skripte? ;]

"if ($count==1)" keisk į "if($count > 1)" arba užklausos gale pridėk "LIMIT 1"

Be to, įdėk apsaugą nuo sql injection:

$vartotojas=mysql_real_escape_string($_POST['user']);  
$slaptazodis=mysql_real_escape_string($_POST['pass']);

Redagavo Tech
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Tiesiog pamiršau nurodyt formos metodą :ph34r: ='post'

 

Bet gaunu kt. error'ą:

Warning: session_register() [function.session-register]: Cannot send session cookie - headers already sent by (output started at C:\wamp\www\index.php:10) in C:\wamp\www\index.php on line 39

Warning: session_register() [function.session-register]: Cannot send session cache limiter - headers already sent (output started at C:\wamp\www\index.php:10) in C:\wamp\www\index.php on line 39

Warning: Cannot modify header information - headers already sent by (output started at C:\wamp\www\index.php:10) in C:\wamp\www\index.php on line 40

 

Ką vėl ne taip darau..? ;P

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Mano nuomone, logiškiau tikrinti if($count==1), nes, jei $count reikšmė bus ne daugiau už vieną, būtų nekorektiški duomenis (nuo ko reikėtų įdėti apsaugas registruojant vartotoją). Jei būtų galimybė prisiregistruoti dviems vartotojams su identiškais login'ais ir slaptažodžiais, gali būti, kad kažkuris bus prijungtas prie kito vartotojo sąskaitos. Todėl $count turėtų būti lygus 1.

Nuoroda į pranešimą
Dalintis kituose puslapiuose
Tiesiog pamiršau nurodyt formos metodą :ph34r: ='post'

 

Bet gaunu kt. error'ą:

Warning: session_register() [function.session-register]: Cannot send session cookie - headers already sent by (output started at C:\wamp\www\index.php:10) in C:\wamp\www\index.php on line 39

Warning: session_register() [function.session-register]: Cannot send session cache limiter - headers already sent (output started at C:\wamp\www\index.php:10) in C:\wamp\www\index.php on line 39

Warning: Cannot modify header information - headers already sent by (output started at C:\wamp\www\index.php:10) in C:\wamp\www\index.php on line 40

 

Ką vėl ne taip darau..? ;P

 

Patikrink, ar tose eilutėse, kur rašo neinclude'ini failo, kuriame, taip pat rašai session_start arba session_register. Sėkmės.

Nuoroda į pranešimą
Dalintis kituose puslapiuose
ob_start();

pačioje pradžioje įrašyk ir

ob_end_flush();

pačiame gale.

 

Pamiršau paminėt, kad truputį pakeičiau kodą:

if($count==1)
{ 
session_register('user');
header('location:pavyko.php');
}

 

 

Ta pati klaida išlieka, bet esmė, kad man reikia, jog skriptas permestų į kitą puslapį, jei login pavyko...

Sorry, jei pasirodžiau įkyrus, bet ką tiksliau daro tie:

ob_start();
ob_end_flush();

?

 

Dėkui visiems už nuomones ir pasiūlymus :ph34r:

Nuoroda į pranešimą
Dalintis kituose puslapiuose
Dėkui visiems už nuomones ir pasiūlymus :ph34r:

Va taip parašei? Jei neveikia, tada išsisaugok kitu formatu failą, kaip kažkas čia anksčiau čia minėjo (su notepad+ gali).

 

<?php
ob_start();
$db = mysql_connect("localhost", "root", "");  
mysql_select_db("mysql");  
if (!$db)
{
echo "Nu nah... Neprisijungia prie MySQL... \n";
}
else
{
echo "Prie MySQL prisijungti pavyko \n";
}

echo "<fieldset>";
echo "<legend>Prisijungimas</legend>";
echo "<form>";
echo "<label for='user'>Vartotojo vardas</label>";
echo "<input type='text' name='user' />";
echo "<br />";
echo "<label for='pass'>Slaptazodis</label>";
echo "<input type='password' name='pass' />";
echo "<br />";
echo "<input type='submit' value='Prisijungti' />";
echo "</form>";
echo "</fieldset> \n";


$vartotojas=$_POST['user'];  
$slaptazodis=$_POST['pass'];  

$sql="SELECT * FROM vartotojai WHERE vardas='$vartotojas' and slaptazodis='$slaptazodis'";
$rezultatas=mysql_query($sql);  


$count=mysql_num_rows($rezultatas);  


if($count==1)
{  
echo "Prisijungti pavyko!";
}  
else  
{  
echo "Neteisingas vartotojo vardas arba slaptazodis";  
}  
ob_end_flush();
?>

Redagavo Tom
Nuoroda į pranešimą
Dalintis kituose puslapiuose
Pamiršau paminėt, kad truputį pakeičiau kodą:

if($count==1)
{ 
session_register('user');
header('location:pavyko.php');
}

 

 

Ta pati klaida išlieka, bet esmė, kad man reikia, jog skriptas permestų į kitą puslapį, jei login pavyko...

Sorry, jei pasirodžiau įkyrus, bet ką tiksliau daro tie:

ob_start();
ob_end_flush();

?

 

Dėkui visiems už nuomones ir pasiūlymus :ph34r:

 

Prieš header('location:pavyko.php'); negali būti jokio atvaizduojamo teksto, šiuo atveju pas tave visa forma atvaizduojama.

Nuoroda į pranešimą
Dalintis kituose puslapiuose
Prieš header('location:pavyko.php'); negali būti jokio atvaizduojamo teksto, šiuo atveju pas tave visa forma atvaizduojama.

 

Labai ačiū, tiesiog visą tą "stuff" įdėjau prieš echo tag'us ir padėjo :ph34r:.

 

Tik turiu paskutinį klausimą. Kaip padaryt, kad tą eilutę "neteisingas vartot. vardas arba slp." padaryt, kad rašytų, tik po to kai paspaudi mygtuką "Prisijungti". Nes šiuo atveju, ji atvaizduojama visada, kai tik užkrauni tą login formą...

Nuoroda į pranešimą
Dalintis kituose puslapiuose
Labai ačiū, tiesiog visą tą "stuff" įdėjau prieš echo tag'us ir padėjo :ph34r:.

 

Tik turiu paskutinį klausimą. Kaip padaryt, kad tą eilutę "neteisingas vartot. vardas arba slp." padaryt, kad rašytų, tik po to kai paspaudi mygtuką "Prisijungti". Nes šiuo atveju, ji atvaizduojama visada, kai tik užkrauni tą login formą...

 

Tai reikia arba skripto, kuris patikrintų, arba įsirašyt į kokį nors sesijos kintamąjį, pvz. $_SESSION['msg'].

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Turbūt vėl kažką suvėliau... Nebe permeta į pavyko.php

 

<?php
$db = mysql_connect("localhost", "root", ""); 
mysql_select_db("mysql", $db); 


$vartotojas=$_POST['user']; 
$slaptazodis=$_POST['pass']; 

$sql="SELECT * FROM vartotojai WHERE vardas='$vartotojas' and slaptazodis='$slaptazodis'"; 
$rezultatas=mysql_query($sql); 

$count=mysql_num_rows($rezultatas); 


function jungtis()
{
if($count==1)
{ 
session_register('user');
header('location:pavyko.php');
} 
else 
{ 
echo "Neteisingas vartotojo vardas arba slaptazodis"; 
} 
}


if (!$db)
{
echo "Nu nah... Neprisijungia prie MySQL... Login nebus atliekamas. \n";
}

ob_start();
echo "<fieldset>";
echo "<legend>Prisijungimas</legend>";
echo "<form method='POST'>";
echo "<label for='user'>Vartotojo vardas</label>";
echo "<input type='text' name='user' />";
echo "<br />";
echo "<label for='pass'>Slaptazodis</label>";
echo "<input type='password' name='pass' />";
echo "<br />";
echo "<input type='submit' value='Prisijungti' />";
echo "</form>";
echo "</fieldset> \n";
ob_end_flush();
return jungtis();

 

O gal dėl to "prisijungti nepavyko" kaip nors galima jį atvaizduot per onsubmit ir tada funkciją jungtis() iškviest?

 

 

 

EDIT: padariau klaidą, kad į funkciją paėmiau tą if($count...);

Redagavo v1per
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Dar, kaip kažkas jau sakė anksčiau,

prieš $sql eilutę parašyk:

 

$vartotojas=mysql_real_escape_string($_POST['user']);  
$slaptazodis=mysql_real_escape_string($_POST['pass']);

 

nes priešingu atveju, lengvai gautum sql injection. :ph34r:

 

Taip, nesunkiai gali validuoti naudojant javascript'ą. Įrašyk į form tag'ą

"onsubmit="return validate(this);"

ir apsirašyk script'ą:

 

<script type="text/javascript">
function validate(form){

var errors = [];

// if neįvestas login
// errors[errors.length] = "neįvestas login"

// if neiįvestas passw
// ...

// if login su passw negražina iš sql 1 įrašo
// ...

if (errors.length > 0) {
 // pateiktiklaidas
 return false;
}

return true;
}
</script>

Nuoroda į pranešimą
Dalintis kituose puslapiuose
O be JavaScript kaip nors įmanoma? :D

 

Na paprastai naudojamas javascript.

Įmanoma. Kai submitini formą, kvieti kažkokį failą. Tame faile tikrini prisijungimo duomenis. Jei jie neatitinka, įsirašai kažką į sesijos kintamąjį, pvz.

$_SESSION['error']="loginas_neatitinka_slapt";

ir tada darai

header('location:index.php');

[tuo atveju, kai index.php buvo jungimosi forma]. O index.php turėtų būti tikrinimas maždaug:

 

if ($_SESSION['error']!="")

// atspausdinti error

// ištrini error pranešimą iš sesijos $_SESSION['error']="";

ir taip pat

paskui tikrini, ar užregistruotas koks nors vartotojas sesijoje. Jei ne, užkrauni login formą,

jei registruotas - rodai tai, ką turi matyti prisiregistravęs vartotojas. (Arba vėl darai puslapio nukreipimą į kitą puslapį).

 

Paprasčiau javascript, manau. :ph34r:

Sėkmės.

Redagavo labutukas
Nuoroda į pranešimą
Dalintis kituose puslapiuose

pabandyk taip

<?php

// prisijungiam prie mysql
$db = mysql_connect ( "localhost", "root", "" ); 

// prisijungiam prie duombazes
mysql_select_db ( "mysql", $db );

// klaida prisijungiant
if ( !$db ) echo "Nu nah... Neprisijungia prie MySQL... Login nebus atliekamas. \n";

// nustatom reismes jei dar nesijunge
$count = ( isset ( $count ) ? $count : null );
$vartotojas = ( isset ( $_POST [ 'user' ] ) ? $_POST [ 'user' ] : null );
$slaptazodis = ( isset ( $_POST [ 'pass' ] ) ? $_POST [ 'pass' ] : null );

// tikrinam ar yra gaunami duomenys is formos ir jei gaunami tikrinam duombazej
if ( $vartotojas != null || $slaptazodis != null )
{
$rezultatas = mysql_query( "SELECT * FROM vartotojai WHERE vardas='". mysql_real_escape_string ( $vartotojas ) ."' AND slaptazodis='". mysql_real_escape_string ( $slaptazodis ) ."'" ); 
$count = mysql_num_rows ( $rezultatas ); 
}

// tikrinam ar yra ir keliam toliau
if ( $count == 1 )
{ 
session_register ( 'user' );
header ( 'location:pavyko.php' );
die ();
} 
// rodom klaidos pranesima
else if ( $vartotojas != null || $slaptazodis != null )
{ 
echo "Neteisingas vartotojo vardas arba slaptazodis"; 
} 


echo "<fieldset>";
echo "<legend>Prisijungimas</legend>";
echo "<form method='POST'>";
echo "<label for='user'>Vartotojo vardas</label>";
echo "<input type='text' name='user' />";
echo "<br />";
echo "<label for='pass'>Slaptazodis</label>";
echo "<input type='password' name='pass' />";
echo "<br />";
echo "<input type='submit' value='Prisijungti' />";
echo "</form>";
echo "</fieldset> \n";

Redagavo MuniGod
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Ok, pastebėjau, akd viską galima buvo rašyt kaip ir ankščiau, tik į elseif kitokią sąlygą iterpt.

Ir kaip reikėtų padaryt, kad tą "neteisingi duom." rodyto žemiau formos, o ne prieš formą? ;]

Bandžiau sąlygą įterpt į funkciją, bet nesigavo...

 

 

EDIT: Viskas susitvarkė... Per daug sudėtingai galvojau, tiesiog reikėjo perkelt if'ą į skripto pabaigą.. :ph34r:

Redagavo v1per
Nuoroda į pranešimą
Dalintis kituose puslapiuose
Dar turiu klausimą: kaip padaryt, kuomet prisijungimas pavyksta ir nukeliamas vartotojas, tarkim, į "pavyko.php", kad rašytų naršyklės langely "pavyko.php,Useris" arba "pavyko.php,user;Ignas" ir t.t.

Friendly url

 

http://www.php.lt/render/Articles;aid,26

Redagavo MuniGod
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Prisijunkite prie diskusijos

Jūs galite rašyti dabar, o registruotis vėliau. Jeigu turite paskyrą, prisijunkite dabar, kad rašytumėte iš savo paskyros.

Svečias
Parašykite atsakymą...

×   Įdėta kaip raiškusis tekstas.   Atkurti formatavimą

  Only 75 emoji are allowed.

×   Nuorodos turinys įdėtas automatiškai.   Rodyti kaip įprastą nuorodą

×   Jūsų anksčiau įrašytas turinys buvo atkurtas.   Išvalyti redaktorių

×   You cannot paste images directly. Upload or insert images from URL.

Įkraunama...
  • Dabar naršo   0 narių

    Nei vienas registruotas narys šiuo metu nežiūri šio puslapio.

×
×
  • Pasirinkite naujai kuriamo turinio tipą...