PHP: <? require 'dbconect.php'; $login = filter_var(trim($_POST['login']),FILTER_SANITIZE_STRING); $pass = filter_var(trim($_POST['pass']),FILTER_SANITIZE_STRING); $pass2 = filter_var(trim($_POST['pass2']),FILTER_SANITIZE_STRING); if($pass !== $pass2){ echo "Пароли не совпалают"; exit(); } $sql = "SELECT `login` FROM `users` WHERE `login` = '$login'"; if($sql[`login`] == $login) { echo "Логин занят"; exit(); } $pass = md5($pass); $pass2 = md5($pass2); $msql = new mysqli($servername, $username, $password, $database); $msql->query ("INSERT INTO `users` (`login`, `pass`, `pass2`) VALUES ('$login', '$pass', '$pass2')"); echo "Регистрация успешна". " ". '<a href="http://localhost/mg/vhod.php">Войдите в игру</a>'; $msql -> close();
Warning: String offset cast occurred in C:\xampp\htdocs\mg\reg.php on line 12 Регистрация успешна Войдите в игру
Во первых, у вас $sql это строка, и пытаться там индексы проверять не надо Во вторых, от того что запрос записали в строку $sql, запрос не выполнится волшебным образом --- Добавлено --- Зачем пароль хранить два раза?????
Нужно делать запрос к бд,, а не просто строку формировать. Посмотрите как вы делаете второй запрос на вставку. Один и тот же пароль зачем два раза хранить в бд?
да --- Добавлено --- У меня в регистрации идет пароль и подтверждение пароля Это каждый такой запрос нужно делать по форме как у меня на вставку идет? --- Добавлено --- Такие поставил потому что сравниваю информацию из базы данных с введенным полем Поправьте если не так делаю, я совсем не давно начал изучать PHP
По большому счету - все не то. Прочитайте: - какие кавычки в php используются, в чем разница, где конкретно использовать обратный апостроф - как делать запросы к бд Логически подумайте, зачем хранить подтверждение пароля? Они же с паролем одинаковые!
@MouseZver добрее надо быть, терпимое. Ну реально новички же спрашивают... Для них пока нет разницы между кавычками...итд. Сам тоже стараюсь терпеть кажущиеся глупыми для нас продвинуты вопросов. Не знаю, насколько получается
Да не просто это все , но вроде как решилась проблема и теперь все читается и сохраняется корректно Так же прислушался и убрал с БД и кода повтор пароля Но не усепл я обрадоваться как здравствуйте новая проблема Warning: Trying to access array offset on value of type null in C:\xampp\htdocs\mg\reg.php on line 14 Почитав в интернете о ней , я кроме как менять версию PHP ничего не нашел , возможно есть какой другой способ. Проблема вот в этом куске кода Код (Text): <? $msql = new mysqli($servername, $username, $password, $database); $result = $msql->query("SELECT * FROM `users` WHERE `login` = '$login'"); $user = $result->fetch_assoc(); if($user['login'] == $login) { А именно ругается на последнюю строку [B][/B]
Совсем тю-тю версию пхп менять? Ошибку надо устранить и всё. Попробуй в отдельном скрипте написать: Код (Text): $a = NULL; echo $a['somekey']; У тебя в $user приходит false, потому что запрос не выполняется или нулевой результат.
Написал в отдельном скрипте , выдало такую же ошибку Да результат действительно нулевой ,так как в противном случае он не дает зарегистрировать пользователя Вот полный код Код (Text): <? <?php require 'dbconect.php'; $login = filter_var(trim($_POST['login']),FILTER_SANITIZE_STRING); $pass = filter_var(trim($_POST['pass']),FILTER_SANITIZE_STRING); $pass2 = filter_var(trim($_POST['pass2']),FILTER_SANITIZE_STRING); if($pass !== $pass2){ echo "Пароли не совпадают"; exit(); } $msql = new mysqli($servername, $username, $password, $database); $result = $msql->query("SELECT * FROM `users` WHERE `login` = '$login'"); $user = $result->fetch_assoc(); if($user['login'] == $login) { echo "Логин занят". " ". '<a href="http://localhost/mg/index.php">Назад</a>'; exit(); } $pass = md5($pass); $pass2 = md5($pass2); $msql = new mysqli($servername, $username, $password, $database); $msql->query ("INSERT INTO `users` (`login`, `pass`) VALUES ('$login', '$pass')"); echo "Регистрация успешна". " ". '<a href="http://localhost/mg/vhod.php">Войдите в игру</a>'; $msql -> close(); ?>
После PHP: $user = $result->fetch_assoc(); добавьте PHP: var_dump($user); Учитесь уже отлаживать код и при размещении на форуме язык кода указывать ))) И про ошибки указывайте строку и текст ошибки, почему каждый раз информацию выуживать надо?
1. переведи переводчиком - Trying to access array offset on value of type null, запомни что такая ошибка возникает при попытке обратиться в массиве к несуществующему индексу 2. чтоб не возникало ошибки, обычно применяют такое сравнение PHP: if(isset(($user['login']) && ($user['login'] == $login) )... 3. в твоем случае, проверку на успешный запрос можно и нужно сделать еще раньше PHP: if ($user = $result->fetch_assoc()) { if($user['login'] == $login) { .... P.S. и таки да - filter_var не гарантирует защиту от SQL иньекций, используйте real_escape_string, а еще лучше подготовленные запросы
здесь ошибка. убери короткий открывающий тег Когда пользователь с указанным логином НЕ найден, переменная $user содержит null, а не массив! Так что причина ошибки понятна. Замени условие на if (!empty($user)) { например. Или просто if ($user) { --- Добавлено --- Справка по языку содержит всё необходимое. https://www.php.net/manual/ru/mysqli-result.fetch-assoc --- Добавлено --- Пользуйся отладкой. В любом непонятном случае сначала посмотри что именно находится в строке, где происходит ошибка. var_dump() может помочь, а ещё лучше xdebug и пошаговая отладка в PhpStorm или NetBeans. --- Добавлено --- @MouseZver ты конечно молодец, но пожалуйста, сдерживайся. Ты пугаешь людей. --- Добавлено --- @Евгений765 Как работает обратная кавычка ` (backtick) в коде PHP: https://www.php.net/manual/ru/language.operators.execution Не используй его в коде, только внутри строки! --- Добавлено --- Был запрос RFC о том чтобы исключить такой оператор из языка. Потому что он потенциально опасен и трудно обнаружим. Возможно RFC даже приняли в новой версии.
@Евгений765, Запомни этот текст: Любой sql "SELECT" запрос после выполнения, перед использованием его результата - нужно проверить кол-во rows (строк): были ли найдены строки на стороне "БД" и возвращены в результат "PHP инструмента Mysql" Для этого существует ( в mysqli ): PHP: if ( $result -> num_rows ) { ... } https://www.php.net/manual/ru/mysqli-result.num-rows.php#example-1482 Для PDO инструмента: PHP: if ( $result -> rowCount() ) { ... } Советы с использованием isset и т.д. - эти чуваки не исправимы.
PHP: <?php error_reporting ( E_ALL ); //--------------- отдельный файл $connect = new PDO( 'mysql:host=localhost;dbname=pdo;charset=utf8', 'root', 'password' ); //--------------- //--------------- отдельный файл functions.php function getRequestValidation( string $method, array $atributes ): array { $filter_map = [ 'filter_default' => FILTER_DEFAULT, 'filter_validate_int' => FILTER_VALIDATE_INT, 'filter_validate_float' => FILTER_VALIDATE_FLOAT, 'filter_validate_email' => FILTER_VALIDATE_EMAIL, ]; $method_map = [ 'get' => INPUT_GET, 'post' => INPUT_POST, ]; $method = strtolower ( $method ); if ( ! isset ( $method_map[$method] ) ) { throw new \InvalidArgumentException( "Неизвестный метод '{$method}' запроса" ); } if ( empty ( $atributes ) ) { throw new \InvalidArgumentException( 'Второй аргумент функции \'getRequestValidation\' не должен содержать пустой массив' ); } $options = []; foreach ( $atributes AS $row ) { $explode = explode ( '|', $row ); if ( count ( $explode ) != 2 ) { throw new \InvalidArgumentException( "Должно (имя ключа)|(имя фильтра), а получил - " . $row ); } [ $key, $filter ] = $explode; $filter = strtolower ( $filter ); if ( ! isset ( $filter_map[$filter] ) ) { throw new \InvalidArgumentException( "Неизвестный фильтр '{$method}'" ); } $options[$key] = $filter_map[$filter]; } $input = filter_input_array ( $method_map[$method], $options ); $errors = []; if ( empty ( $input ) ) { $errors['*']['method'] = "Неудачный запрос"; } else { foreach ( $input AS $key => $value ) { if ( is_bool ( $value ) ) { $errors['*'][$key] = $key . ' - No valid value'; } if ( is_null ( $value ) ) { $errors['*'][$key] = $key . ' - Not found'; } } } if ( empty ( $errors ) ) { return $input; } $errors['err'] = true; return $errors; } //--------------- $request = getRequestValidation( 'POST', [ 'login|FILTER_DEFAULT', 'pass|FILTER_DEFAULT', 'pass2|FILTER_DEFAULT', ] ); if ( isset ( $request['err'] ) ) { echo implode ( '<br>', $request['*'] ); exit; } if ( $request['pass'] != $request['pass2'] ) { echo 'Пароли не совпадают'; exit; } $stmt = $connect -> prepare( 'SELECT `id` FROM `users` WHERE `login` = ?' ); $stmt -> execute( [ $request['login'] ] ); if ( $stmt -> rowCount() ) { echo 'Логин занят'; exit; } $stmt = $connect -> prepare( 'INSERT INTO `users` ( `login`, `pass` ) VALUES ( ?,? )' ); $stmt -> execute( [ $request['login'], password_hash ( $request['pass'] ) ] );