Я изучаю PHP, PDO и MySQL самостоятельно и застрял здесь, пытаясь создать продвинутую систему входа в систему. Эта часть ниже «register.php«:
Все, видимо, идет хорошо, пока мы не достигнем ВСТАВИТЬ часть, потому что ничего не происходит.
Я дизайнер, и мне нравится все чистое, что не относится к моему коду, так что если один из вас, ребята, поможет мне дать советы о том, как очистить мой код, я буду очень благодарен 🙂
Я бразильский, поэтому некоторые тексты написаны на португальском языке, но я думаю, что мне не нужно переводить только потому, что они представляют собой обычные предупреждающие сообщения, за которыми следует код.
<?php
require('include/core.php');
require('include/func.php');
if(isset($_POST['submit'])) {
//Information
$user = htmlentities($_POST['user']);
$pass1 = $_POST['pass1'];
$pass2 = $_POST['pass2'];
$email = $_POST['email'];
$register_date = date('Y-m-d H:i:s');
$email_token = md5(uniqid(rand(),1));
$user_level = "normal";
$ip = get_ip();
//Validation
if(!isset($user)) {
echo "Você não digitou um nome de usuário";
} else if(strlen($user) < 4) {
echo "Digite um nome de usuário com pelo menos 3 Caractéres";
} else if(empty($pass1)) {
echo "Você precisa digitar uma senha.";
} else if(empty($pass2)) {
echo "Você precisa digitar a senha novamente, para confirmação.";
} else if(empty($email)) {
echo "Você precisa digitar um email.";
} else if($pass1 != $pass2) {
echo "As senhas não conferem.";
} else if(filter_var($email, FILTER_VALIDATE_EMAIL) == false) {
echo "Digite o email corretamente.";
} else {
//Checking for Existing User
$query = $database->prepare('SELECT user, email, ip
FROM sk_user WHERE user = ? OR email = ? OR ip = ?');
$query->bindParam(1, $user);
$query->bindParam(2, $email);
$query->bindParam(3, $ip);
$query->execute();
$row = $query->fetch(PDO::FETCH_NUM);
if($row > 0) {
echo "Já existe um usuário com esses dados!";
} else {
$query2 = $database->prepare("INSERT INTO sk_user(user, pass, email, register_date, email_token, user_level, ip) VALUES (:user, :pass, :email, :register_date, :email_token, :user_level, :ip");
$query2->bindParam(':user', $user);
$query2->bindParam(':pass', $pass2);
$query2->bindParam(':email', $email);
$query2->bindParam(':register_date', $register_date);
$query2->bindParam(':email_token', $email_token);
$query2->bindParam(':user_level', $user_level);
$query2->bindParam(':ip', $ip);
$query2->execute();
}
}
?>
В запросе INSERT есть небольшая ошибка:
$query2 = $database->prepare("INSERT INTO sk_user(user, pass, email, register_date, email_token, user_level, ip) VALUES (:user, :pass, :email, :register_date, :email_token, :user_level, :ip");
Должен быть заменен на:
$query2 = $database->prepare("INSERT INTO sk_user(user, pass, email, register_date, email_token, user_level, ip) VALUES (:user, :pass, :email, :register_date, :email_token, :user_level, :ip)");
Последняя скобка запроса отсутствует;)
Кроме того, почему вы не используете одну и ту же структуру для двух подготовительных операторов?
В следующей строке отсутствует закрывающая скобка )
закрыть открывающую скобку (
в $query2 = $database->prepare(...
где это заканчивается :user_level, :ip");
$query2 = $database->prepare("INSERT INTO sk_user(user, pass, email, register_date, email_token, user_level, ip) VALUES (:user, :pass, :email, :register_date, :email_token, :user_level, :ip");
Измените его на: (конец следующей строки читается как :user_level, :ip)");
$query2 = $database->prepare("INSERT INTO sk_user(user, pass, email, register_date, email_token, user_level, ip) VALUES (:user, :pass, :email, :register_date, :email_token, :user_level, :ip)");
добавлять $database->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
сразу после открытия соединения, включая сообщения об ошибках, размещенные в верхней части ваших файлов сразу после открытия <?php
тег
error_reporting(E_ALL); ini_set('display_errors', 1);
который помогает отлаживать код.
Это сигнализировало бы о синтаксической ошибке.
Важное замечание относительно хранения пароля:
Я заметил, что вы можете хранить пароли в виде простого текста, что не рекомендуется и небезопасно.
использование CRYPT_BLOWFISH или PHP 5.5 password_hash()
функция.
Для PHP < 5.5 использовать password_hash() compatibility pack
.
Если это для живого сайта, не делайте хранить пароли в виде простого текста, это просто вопрос времени, прежде чем ваш сайт будет взломан.
Я видел слишком много дел здесь в Stack по этому вопросу, потому что люди так и делали.