2015-11-22 3 views
2

Мне нужно создать форму входа в систему с помощью PHP SQlite. Регистрация работает, и я могу выбрать всех созданных пользователей и повторить их. Когда я пытаюсь проверить, совпадают ли имя пользователя и пароль, которые я получаю от $ _POST, он повторяет, что я вошел в систему сейчас. Но когда я печатаю в неверном пользователя/PW, он повторяет «недопустимый» -string, но есть также следующее сообщение об ошибке:PHP и SQlite: Логин

Notice: Undefined variable: row in D:\xampp\htdocs\phpProjektSnippets\blogLogin.php on line 17 

Line 17, где у меня есть, если ($ ряду [ 'имя пользователя «] ...

Это мой код:

$db = new PDO('sqlite:mysqlitedb.db'); 
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

$username = $_POST['username']; 
$password = $_POST['password']; 

$sql = "SELECT * FROM users WHERE user_name = :name AND user_password = :pass"; 
$statement = $db->prepare($sql); 
$statement->execute(array('name' => $username, 'pass' => $password)); 

try { 
    $statement = $db->prepare($sql); 
    $statement->execute(array('name' => $username, 'pass' => $password)); 

    foreach ($statement as $row); 

    if ($row['user_name'] == $username && $row['user_password'] == $password){ 
     echo "Welcome " .$row['user_name']. ", You are now logged in.<br/ >"; 
    }else{ 
     echo "User Name or Password is invalid"; 
    } 
} 
catch(PDOException $e) { 
    echo "Something went wrong: ".$e->getMessage(); 
} 

что случилось здесь

+1

Попробуйте, где user_name == '$ username' –

+0

Спасибо за вашу помощь, но, к сожалению, она не улучшилась ... Ошибка все еще существует – MichelleH

+0

эй, убедитесь, что имя столбца верное. это имя пользователя или имя_пользователя? –

ответ

2

Прежде всего, вы не должны использовать запрос SQL, который выглядит, как ваша Она уязвима для. SQL-инъекции и тем самым небезопасно!

Пожалуйста, ознакомьтесь с ответами на How can I prevent SQL-Injection in PHP за некоторыми очень полезными советами о том, как это сделать правильно.

Проблема заключается в том, что вы добавляете к строке SQL все, что пользователь отправляет на сервер - это может быть вредоносный код, который дает злоумышленнику доступ к вашей базе данных или удаляет данные или другие плохие вещи. См. Ссылку выше для получения дополнительной информации.

В вашем случае код будет выглядеть следующим образом:

<?php 
    $db = new PDO('sqlite:mysqlitedb.db'); 
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

    $username = $_POST['username']; 
    $password = md5($_POST['password']); 

    $sql = "SELECT * FROM users WHERE user_name = :name "; 

    try { 
     $statement = $db->prepare($sql); 
     $statement->execute(array('name' => $username)); 

     foreach ($statement as $row){ 
      echo $row['user_name'] . '<br />'; 
     } 
    } 
    catch(PDOException $e) { 
     echo "Something went wrong: ".$e->getMessage(); 
    } 
?> 

Edit: Поскольку вы настроили PDO с $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION) бросать исключения в случае ошибки, вы также должны поймать их. Я добавил код try/catch.

+0

Привет, спасибо за помощь. Безопасность здесь не нужна, так как это школьный проект, и мы просто изучаем основы. Теперь он работает, спасибо большое! Наверное, я вернусь, если я получу еще одну ошибку - я администратор и не могу понять эту вещь вообще ... :) – MichelleH

+1

@ MichelleH Рад, что я мог бы помочь. Но, пожалуйста, * никогда не говори «безопасность не нужна». Как вы можете видеть, это всего лишь несколько строк кода, которые значительно улучшают вашу программу. Лучше узнать это с самого начала, тем более, что это школьный проект. – Hexaholic

+0

Да, конечно :) Еще один вопрос - я знал, что не могу сделать это один ... Я хочу сделать заявление sql таким образом, чтобы я мог проверить, совпадают ли имя пользователя и пароль, но я получаю сообщение об ошибке. .. Я обновил свой вопрос, чтобы вы могли видеть мой код. – MichelleH

1

Добавляя к Гексахолическому ответу и следуя вашему вопросу.

Эта линия поймать ваш код ошибки

catch(PDOException $e) { 
    echo "Something went wrong: ".$e->getMessage(); 
} 

Если вы хотите, чтобы написать сообщение об ошибке в случае неверной идентификационной информации пользователя, использование если так ... еще ... заявление.

if(some argument){ 
    //do something if the argument result is true; 
    }else{ 
    do something if the argument is not true;} 

Таким образом, ваш код должен быть примерно таким.

<?php 
$db = new PDO('sqlite:mysqlitedb.db'); 
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
$username = $_POST['username']; 
$password = $_POST['password']; 
$sql = "SELECT * FROM users WHERE user_name = :name AND user_password = :pass"; 

try { 
    $statement = $db->prepare($sql); 
    $statement->execute(array('name' => $username, 'pass' => $password)); 
    $row = $statement->fetch(); 
     if ($row['user_name'] == $username && $row['user_password'] == $password){ 
      echo "Welcome " .$row['user_name']. ", You are now logged in.<br/ >"; 
     }else{ 
      echo "User Name or Password is invalid"; 
     }   
} 
catch(PDOException $e) { 
    echo "Something went wrong: ".$e->getMessage(); 
} 
?> 

И если это работает, не забудьте исправить проблему с хешированием.

Может быть, эта картина может лучше помочь вам понять, для вышеприведенного

Неправильный вывод пароля кода. wrong password

Правильный вывод пароля. correct password

+0

Хм, если я набираю пользователя и его pw, он перекликается с именем пользователя - так это работает. BUT: если я нахожу неправильный pw, я получаю следующую ошибку и echo: Примечание: неопределенная переменная: строка в D: \ xampp \ htdocs \ phpProjektSnippets \ blogLogin.php в строке 20 Имя пользователя или пароль недействительны -> строка 20, где вы делаете «if ($ row ['username']), – MichelleH

+0

Ошибка, которую вы получаете, состоит в том, что строка $ row не задана, попробуйте скопировать и вставить весь код из foreach ... вперед. что-то, отредактируйте: сначала обновите свой ответ, я внес некоторые изменения, чтобы лучше отразить то, что происходит –

+0

Итак, у меня есть тот же код, что и у вас, но я все равно получаю ту же ошибку ... – MichelleH

0

Проблемы есть с точкой с запятой в этой строке: foreach ($statement as $row);

Foreach просто ничего не делает, а не последующий if.