Я написал запрос для проверки логина и пароля пользователя, и он работал до тех пор, пока мне не пришлось вынести запрос в промежуточный, отдельный .php файл. Само собой мне пришлось его немного изменить. Сейчас запрос отрабатывает до цикла while. Я много раз перепроверял синтаксис, казалось бы всё правильно, но что-то всё равно не то. Помогите разобраться, я новичок в этом деле, в запросах на PHP явно не силён.
Вот текст запроса:
if(isset($_POST['username']) and isset($_POST['password'])) {
$username = $_POST['username'];
$password = $_POST['password'];
$sql = ("SELECT US, PAS FROM [Название_базы]. [dbo].[Название_таблицы] WHERE (US = '".$username."') AND (PAS = '".$password."') ");
$result = sqlsrv_query($conn, $sql);
while ($row = sqlsrv_fetch_array($result, SQLSRV_FETCH_ASSOC)){
if ($row['US'] == $username) && ($row['PAS'] == $password) {
$_SESSION['US'] = $row['US'];
}
else {die('Такого логина нет');
}
}
}
P.S.: "US" и "PAS" это названия полей в таблице.
Если кто поймёт в чём проблема распишите по нормальному суть проблемы и как её решить.
SQL
Помогите разобраться с синтаксисом, серверный MySQL на PHP.
if(isset($_POST['username']) and isset($_POST['password'])) {
$username = $_POST['username'];
$password = $_POST['password'];
$sql = ("SELECT US, PAS FROM [Название_базы]. [dbo].[Название_таблицы] WHERE (US = '".$username."') AND (PAS = '".$password."') ");
$result = sqlsrv_query($conn, $sql, array(), array("Scrollable" => SQLSRV_CURSOR_KEYSET));
if(sqlsrv_num_rows($result) >= 1){
$_SESSION['US'] = $row['US'];
}else{
die('Такого логина нет');
}
}
ну как то так На уровне запроса ты и так проверяешь есть такой логин с паролем в базе или нет. Но такой подход очень уязвим для sql injection. Хотя бы экранирование сделай логин и пароля прежде чем в запрос делать или по длине логина и пароля хотябы. И в базу хеш надо сохранять пароли а не открыто
$username = $_POST['username'];
$password = $_POST['password'];
$sql = ("SELECT US, PAS FROM [Название_базы]. [dbo].[Название_таблицы] WHERE (US = '".$username."') AND (PAS = '".$password."') ");
$result = sqlsrv_query($conn, $sql, array(), array("Scrollable" => SQLSRV_CURSOR_KEYSET));
if(sqlsrv_num_rows($result) >= 1){
$_SESSION['US'] = $row['US'];
}else{
die('Такого логина нет');
}
}
ну как то так На уровне запроса ты и так проверяешь есть такой логин с паролем в базе или нет. Но такой подход очень уязвим для sql injection. Хотя бы экранирование сделай логин и пароля прежде чем в запрос делать или по длине логина и пароля хотябы. И в базу хеш надо сохранять пароли а не открыто
Чему равно значение $conn в момент выполнения $result = sqlsrv_query($conn, $sql);? Очень вероятно, что этой переменной в этой точке программы либо вообще нет, либо её значение - совсем не подключение к БД.
С какого бока в твоём вопросе "серверный MySQL", если у тебя MS SQL Server? MySQL и MS SQL - это РАЗНЫЕ СУБД.
Вместо того, чтобы сначала проверить значение $result на предмет возможных ошибок, ты сразу вызываешь sqlsrv_fetch_array - причём зачем-то в while, хотя твой запрос возвращает не более одной строки.
База данных УЖЕ проверила совпадение $username и $password - зачем ты вручную проверяешь совпадение?
SQL-инъекция? Нет, не слышал...
Подготовленные запросы? Нет, не слышал...
Хэширование паролей? Нет, не слышал...
Твой код - даже не дыра в безопасности, а широко распахнутые ворота с транспарантом: "Заходите, дорогие хакеры".
Специально для того, чтобы понять причины проблем с SQL, существует функция https://www.php.net/manual/ru/function.sqlsrv-errors.php
P.S. Складывается впечатление, что ты даже не пытаешься задуматься над тем, что твой код делает: как "научили", так и штампуешь - без единой мысли. Зачем круглые скобки в выражении $sql = ...;? И зачем переменные $username и $password?
С какого бока в твоём вопросе "серверный MySQL", если у тебя MS SQL Server? MySQL и MS SQL - это РАЗНЫЕ СУБД.
Вместо того, чтобы сначала проверить значение $result на предмет возможных ошибок, ты сразу вызываешь sqlsrv_fetch_array - причём зачем-то в while, хотя твой запрос возвращает не более одной строки.
База данных УЖЕ проверила совпадение $username и $password - зачем ты вручную проверяешь совпадение?
SQL-инъекция? Нет, не слышал...
Подготовленные запросы? Нет, не слышал...
Хэширование паролей? Нет, не слышал...
Твой код - даже не дыра в безопасности, а широко распахнутые ворота с транспарантом: "Заходите, дорогие хакеры".
Специально для того, чтобы понять причины проблем с SQL, существует функция https://www.php.net/manual/ru/function.sqlsrv-errors.php
P.S. Складывается впечатление, что ты даже не пытаешься задуматься над тем, что твой код делает: как "научили", так и штампуешь - без единой мысли. Зачем круглые скобки в выражении $sql = ...;? И зачем переменные $username и $password?
Black ...
Значение $conn в момент выполнения находится за пределами файла, который проводит проверку логина и пароля, и подключается с помощью метода include();. Таким образом за непосредственное подключение к базам данных отвечает совсем другой файл .php, который в последствие подключается к каждому файлу во избежание дублирования кода.
Люди не задумываются над тем как правильно оформить текст вопроса, потому что пишут на скорую руку. Да я действительно ошибся и написал MySQL вместо MS SQL. Но надо так же понимать, что это из разряда, когда ты задаёшь вопрос про чистый PHP на форуме про Java.
Нужно так же понимать, что нарекания не есть решение проблемы. Из этого можно следовать, что очевидных вещей, тебе никогда, в жизни не понять.
Люди не задумываются над тем как правильно оформить текст вопроса, потому что пишут на скорую руку. Да я действительно ошибся и написал MySQL вместо MS SQL. Но надо так же понимать, что это из разряда, когда ты задаёшь вопрос про чистый PHP на форуме про Java.
Нужно так же понимать, что нарекания не есть решение проблемы. Из этого можно следовать, что очевидных вещей, тебе никогда, в жизни не понять.
Похожие вопросы
- PHP & MySQL Помогите разобраться, как это решать. У меня голова уже опухла.
- Форма ввода в базу данных MySQL через Php
- Помогите решить 2 проблемы с Mysql
- Друзья пожалуйста скажите любой бесплатный хостинг чтобы работал и поддерживал PHP + MySQL.
- Какой тип данных использовать для хранения времени в секундах (php time()) mySQL
- Под каким пользователем нужно работать в MySQL?
- MySQL Truncate/Delete - как это работает?
- Почему так нужен mysql?
- Не отрабатывает вложенный MySQL запрос
- Не очень понятен синтаксис запросов SQL
Если поместить "while ($row = sqlsrv_fetch_array($result)){" между "$result" и "if", и вернуть закрывающую "}" на родину. Таким образом происходит переход на след. страницу с помощью:
if (isset($_SESSION['US'])){
$row['US'] = $_SESSION['US'];
header("Location: simple.php");
}
Ведь данный запрос находится на промежуточной странице, между страницей авторизации и страницы куда попадает пользователь.
А по поводу экранирования я полностью согласен, это безусловно будет делаться и прорабатываться.