2013-05-27 11 views
1

Я пытаюсь создать скрипт входа с PHP. Пользователи перенаправляются на него с помощью формы входа в систему с полями имени пользователя и пароля. Моя проблема здесь в том, что mysqli fetch_assoc() ничего не возвращает. Я попробовал тот же запрос в базе данных, и он работает так, как ожидалось. Я попытался использовать fetch_array с mysql_assoc или как числовой массив, но все равно не повезло. Я попытался получить доступ как к $row[0], так и к $row[password] для возвращаемого значения, но при запуске я получаю «строки не найдены, ничего не печатать», поэтому я думаю, что все работает хорошо до этого момента.Получить значение из базы данных

Любые подсказки о том, что мне может не хватать?

<?php 
$con=mysqli_connect('localhost','root','','site'); 

if(!$con) 
{ 
die('Could not connect to database : ' . mysql.error()); 
} 

$result=mysqli_query($con,'SELECT Password FROM users WHERE Username="$_POST[iusrname]" LIMIT 1'); 

if (!$result) 
{ 
    Die("Could not successfully run query from DB: " . mysql_error()); 
} 

$row = mysqli_fetch_assoc($result); 

if (mysqli_num_rows($result) == 0) 
{ 
    die("No rows found, nothing to print"); 
} 


if($_POST[ipwd] == '$row[password]') 
{ 
echo "Authentication succeeded.You will be redirected to the main page shortly"; 
$_SESSION['loged']=true; 
$_SESSION['user']=$_POST[iusrname]; 
} 
else 
{ 
die("could not authenticate user"); 
} 

mysqli_close($con); 
?> 
+0

Для форматирования кода вы должны выбрать весь свой код, а затем нажать Ctrl + K вместо тысячи обратных выходов. – 11684

+0

Вы используете одинарные кавычки для определения своей строки SQL, которая рассматривает ее как литерал; это не интерполирует переменные вообще. Поскольку вы используете mysqli - почему бы не сделать этот SELECT в подготовленный оператор? – andrewsi

+2

Яркое предупреждение: я собираюсь уменьшить каждый ответ, который просто вставляет '$ _POST ['iusrname']' в SQL, даже не потрудившись избежать его. – cHao

ответ

1

Попробуйте изменить запрос от этого:

'SELECT Password FROM users WHERE Username="$_POST[iusrname]" LIMIT 1' 

к этому:

'SELECT Password FROM users WHERE Username='.$_POST['iusrname'].' LIMIT 1' 

также вы будете иметь проблемы здесь:

if($_POST[ipwd] == '$row[password]') 

должны быть:

if($_POST["ipwd"] == $row["password"]) 

и, скорее всего, здесь:

$_SESSION['user']=$_POST[iusrname]; 

, что должно быть:

$_SESSION['user']=$_POST['iusrname']; 
+0

после исправления ряда вопросов, которые вышеприведенный запрос по-прежнему не работает должным образом, но $ result = mysqli_query ($ con, "SELECT Password FROM users WHERE Username = '$ _ POST [iusrname]' LIMIT 1") ; работает как указано – MKougiouris

+0

Я забыл некоторые цитаты вокруг iusrname, исправлено. – Rafael

+0

Продвижение, потому что это исправит проблему, но НЕ, потому что она безопасна. Этот ответ должен указывать в самых сильных терминах, что Маленькие Таблицы Бобби (в первых двух блоках) неприемлемы. http://xkcd.com/327/ –

2

Я обнаружил ошибку, я думаю.

В одинарных кавычках ('') PHP не будет автоматически заменять имена переменных на значения переменных. Использование двойных кавычек должно сделать трюк:

$username = mysqli_real_escape_string($con, $_POST['iusrname']); // For @cHao 
$result=mysqli_query($con,"SELECT Password FROM users WHERE Username='$username' LIMIT 1"); 
+0

У вас есть еще одна ошибка ... – cHao

+0

@cHao Я тоже подумал, что, видя код OP, но абзац наверху указал, что это была единственная ошибка. – 11684

+0

По крайней мере, вам нужно будет использовать обратную косую черту этих переменных вокруг переменной. Но я говорил о большем вопросе, о котором OP выглядит блаженно не осознающим. Что происходит, когда кто-то решает сказать, что их имя - '' 'или role =' admin'' ... или что-то в этом роде. – cHao

Смежные вопросы