Здравствуйте! Я новичок в PHP. Писал систему логина и регистрации с помощью PHP MySQL и сессий. Использую MAMP для создания внутреннего сервера и PHPMYAdmin для создания таблиц и датабаз. Для самого сайта использую Phpstorm. Вроде все написал, однако на стадии проверки на наличие логина и пароля в таблице все идет не так. С кодом вроде бы все в порядке, синтаксических ошибок нет, логических вроде тоже. Внизу сам код для login.php и register.php а также подключение к датабазе db.php db.php: PHP: <?php $servername = "localhost"; $username = "root"; $password = "root123"; $db = 'Trains'; // Create connection $conn = mysqli_connect($servername, $username, $password, $db); // Check connection if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } else{ echo "Connected to server successfully"; } ?> login.php: PHP: <?php include("db.php"); if(isset($_SESSION['login_user'])){ header("location: welcome.php"); } session_start(); $error = ''; if (isset($_POST['submit'])) { if (empty($_POST['username']) or empty($_POST['password'])) { $error = "Please enter your login details"; } else { $username = mysqli_real_escape_string($conn, $_POST['username']); $password = $_POST['password']; $query = mysqli_query($conn, "SELECT * FROM workers WHERE user_name =$username, AND password = MD5($password) "); $rows = mysqli_num_rows($query); if ($rows == 1) { $_SESSION['login_user'] = $username; header('welcome.php'); } else { $error = "Username or Password is invalid"; } } } ?> Вместе с login.php идет HTML код для формы , но я думаю тут не в нем проблема. После ввода информации в login.php , всегда возвращается ошибка $error = "Username or Password is invalid", следовательно проблема в $query но найти никак не могу. Почти тоже самое происходит и в register.php PHP: <?php if( isset($_SESSION['login_user'])!="" ){ header("Location: welcome.php"); } include_once ('db.php'); session_start(); $error = false; $nameError = ''; $passwordError = ''; $usernameError = ''; $surnameError = ''; $emailError = ''; $MSG = ''; if ( isset($_POST['Register']) ) { // clean user inputs to prevent sql injections $name = trim($_POST['name']); $name = strip_tags($name); $name = htmlspecialchars($name); $surname = trim($_POST['surname']); $surname = strip_tags($surname); $surname = htmlspecialchars($surname); $email = trim($_POST['email']); $email = strip_tags($email); $email = htmlspecialchars($email); $password = trim($_POST['password']); $password = strip_tags($password); $password = htmlspecialchars($password); $username = trim($_POST['username']); $username = strip_tags($username); $username = htmlspecialchars($username); // Username validation if(empty($username)){ $error = true; $usernameError = 'Please enter your username'; }else { if (!preg_match('/^[a-zA-Z0-9]{5,}$/', $username)) { $error = true; $usernameError = 'Invalid Username'; } } //Name validation if (empty($name)) { $error = true; $nameError = "Please enter your full name."; } else if (strlen($name) < 3) { $error = true; $nameError = "Name must have at least 3 characters."; } else if (!preg_match("/^[a-zA-Z ]+$/",$name)) { $error = true; $nameError = "Name must contain alphabets and space."; } //surname validation if (empty($surname)){ $error = true; $surnameError = "Please enter your surname"; } else if (strlen($surname)< 3) { $error = true; $surnameError = "Surname must have at least 3 characters"; } else if (!preg_match("/^[a-zA-Z ]+$/",$surname)){ $error = true; $surnameError = "Surname must contain alphabets"; } //basic email validation if ( !filter_var($email,FILTER_VALIDATE_EMAIL) ) { $error = true; $emailError = "Please enter valid email"; } else { // check email exist or not $query = "SELECT email FROM workers WHERE email='$email'"; $result = mysqli_query($conn,$query); $count = mysqli_num_rows($result); if($count!=0){ $error = true; $emailError = "Provided Email is already in use."; } } // password validation if (empty($password)){ $error = true; $passwordError = "Please enter password."; } else if(strlen($password) < 6) { $error = true; $passwordError = "Password has to be at least 6 charachters long"; } // password encrypt using MD5(); $password = MD5($password); // if there's no error, continue to signup if( !$error ) { $query = mysqli_query($conn,"INSERT INTO workers(id,user_name,password,email,surname,name) VALUES(NULL ,$username,$password,$email,$surname,$name)"); if ($query) { $MSG= "Successfully registered, you may login now"; unset($name); unset($email); unset($password); unset($name); unset($surname); } else { $MSG = "Something went wrong, try again later..."; } } } ?> Здесь все время выводит $MSG следовательно опять проблема в query. Надеюсь на вашу помощь!
Если код не работает, с ним не может быть всё в порядке Вот здесь синтаксическая ошибка в запросе, перед and не нужна запятая. К тому же, запрос уязвим к SQL-инъекциям. Потом, пароль не рекомендуют подставлять в запрос, рекомендуется найти пользователя, а потом уже из php сравнить его пароль. Выпишите себе куда-нибудь этот снипет с пометкой "бесполезный идиотизм", и никогда больше не используйте. комментарий - отпад. Мы делаем со строкой кучу действий, никак не связанных с базой данный (обрезку пробелов, удаление тегов html, замену спец. символов html на сущности html), и ожидаем, что это как-то защит нас от SQL-инъекций. В какой из этих функций есть слово SQL в названии? --- Добавлено --- вот это защищает от инъекций. А также: https://php.ru/manual/mysqli.prepare.html
А я думаю, что весь код копипаст, пишет он систему регистрации А еще тут к сессии обращение идет, до ее старта.
Спасибо за замечания. Исправил login.php и register.php. Добавил prepared statement в login.php. Теперь при правельном вводе обновляется страница , а не переходит в welcome.php. login.php PHP: <?php include("db.php"); session_start(); if(isset($_SESSION['login_user'])){ header("location: welcome.php"); } $error = ''; if (isset($_POST['submit'])) { if (empty($_POST['username']) or empty($_POST['password'])) { $error = "Please enter your login details"; } else { $username = mysqli_real_escape_string($conn, $_POST['username']); $password = md5($_POST['password']); $query = mysqli_prepare($conn, "SELECT password FROM workers WHERE user_name=?"); if ($query){ mysqli_stmt_bind_param($query,"s",$username); mysqli_stmt_execute($query); mysqli_stmt_bind_result($query,$pass); mysqli_stmt_fetch($query); if ($password == $pass){ $_SESSION['login_user'] = $username; header('welcome.php'); }else{ $error = "You typed the wrong password"; unset($username,$password); } }else{ $error = "User Login doesn't exists"; unset($username,$password); } } } register.php Код (Text): <?php session_start(); if( isset($_SESSION['login_user'])!="" ){ header("Location: welcome.php"); } include_once ('db.php'); $error = false; $nameError = ''; $passwordError = ''; $usernameError = ''; $surnameError = ''; $emailError = ''; $MSG = ''; if ( isset($_POST['Register']) ) { $name = $_POST['name']; $name = mysqli_real_escape_string($conn,$name); $surname = ($_POST['surname']); $surname = mysqli_real_escape_string($conn,$name); $email = $_POST['email']; $email = mysqli_real_escape_string($conn,$name); $password = $_POST['password']; $password = mysqli_real_escape_string($conn,$password); $username = $_POST['username']; $username = mysqli_real_escape_string($conn,$username); // Username validation if(empty($username)){ $error = true; $usernameError = 'Please enter your username'; }else { if (!preg_match('/^[a-zA-Z0-9]{5,}$/', $username)) { $error = true; $usernameError = 'Invalid Username'; } } //Name validation if (empty($name)) { $error = true; $nameError = "Please enter your full name."; } else if (strlen($name) < 3) { $error = true; $nameError = "Name must have at least 3 characters."; } else if (!preg_match("/^[a-zA-Z ]+$/",$name)) { $error = true; $nameError = "Name must contain alphabets and space."; } //surname validation if (empty($surname)){ $error = true; $surnameError = "Please enter your surname"; } else if (strlen($surname)< 3) { $error = true; $surnameError = "Surname must have at least 3 characters"; } else if (!preg_match("/^[a-zA-Z ]+$/",$surname)){ $error = true; $surnameError = "Surname must contain alphabets"; } //basic email validation if ( !filter_var($email,FILTER_VALIDATE_EMAIL) ) { $error = true; $emailError = "Please enter valid email"; } else { // check email exist or not $query = "SELECT email FROM workers WHERE email='$email'"; $result = mysqli_query($conn,$query); $count = mysqli_num_rows($result); if($count!=0){ $error = true; $emailError = "Provided Email is already in use."; } } // password validation if (empty($password)){ $error = true; $passwordError = "Please enter password."; } else if(strlen($password) < 6) { $error = true; $passwordError = "Password has to be at least 6 charachters long"; } // password encrypt using MD5(); $password = MD5($password); // if there's no error, continue to signup if( !$error ) { $query = mysqli_query($conn,"INSERT INTO workers(id,user_name,password,email,surname,name) VALUES(NULL ,$username,$password,$email,$surname,$name)"); if ($query !== false) { $MSG= "Successfully registered, you may login now"; unset($name); unset($email); unset($password); unset($name); unset($surname); } else { $MSG = "Something went wrong, try again later..."; } } } ?> Здесь сheck.php который должен проверять залогинился ли юзер. PHP: <?php include('db.php'); session_start(); $user_check=$_SESSION['login_user']; $sql = mysqli_query($conn,"SELECT user_name FROM workers WHERE user_name='$user_check' "); $row=mysqli_fetch_array($sql,MYSQLI_ASSOC); $login_user=$row['user_name']; if(!isset($user_check)) { header("Location: login.php"); } ?>