У меня проблемы с регистрационной информацией.
Предполагается, что он перейдет в базу данных под названием «mon» и в таблицу «user». Эта таблица содержит информацию «id», «name» и «pass». «Id» основан на автоматическом инкремент, поэтому на странице реестра не нужно указывать.
Ошибок не сообщается, просто перезагрузка страницы. Но при посещении таблицы с помощью phpMyAdmin она показывает, что новая строка не была создана. Мне нужна помощь в этом, потому что я довольно новичок в PHP и мало знаю от перегибов.
Код:
Pastebin, потому что stackoverflow действует странно с моим кодом, хотя я его разнес.
register.php:
<?php require_once 'connect.php'; if(!empty($_POST)) { if(isset($_POST['username'], $_POST['password'], $_POST['desc'])) { $username = $_POST['username']; $password = $_POST['password']; if(!empty($username) && !empty($password)) { $insert = $db->prepare("INSERT INTO 'user' ('name', 'pass') VALUES (?, ?)"); $insert->bind_param('ss', $username, $password); } } } ?> <html> <head> <?php require_once 'style.php'; ?> <title>si | Registering an Account</title> </head> <body> <?php require_once 'header.php'; ?> <div id="page"> <h2>Register an Account on Si</h2> <form action="" method="post"> <input type="text" name="username" placeholder="Username" autocomplete="off"> <input type="password" name="password" placeholder="Password" autocomplete="off"> <button>Register</button> </form> </div> </body> </html>
connect.php:
<?php $db = new mysqli('127.0.0.1', 'root', ''); if($db->connect_errno) { echo "<p id='gotem'>Something has gone wrong.Tell J to fix it.</p>"; } ?>
Любая помощь по этому поводу, создание сеанса, который знаменует логин и перенаправление на индексную страницу с сеансом, очень ценится.
В сочетании с другими полученными ответами вы используете регулярные кавычки вокруг своей таблицы и столбцов, которые являются недопустимыми квалификаторами идентификаторов.
("INSERT INTO 'user' ('name', 'pass') ^ ^ ^ ^ ^ ^
Который должен быть удален
("INSERT INTO user (name, pass)
или с использованием тиков, которые напоминают цитату, но на самом деле это не цитата; это два разных животных.
("INSERT INTO `user` (`name`, `pass`)
Ссылка на идентификаторы для MySQL:
Пароли
Я также заметил, что вы можете хранить пароли в виде простого текста. Это не рекомендуется.
Используйте одно из следующих действий:
crypt()
bcrypt()
scrypt()
password_hash()
PHP 5.5. Другие ссылки:
Важное примечание о длине столбца:
Если и когда вы решите использовать password_hash()
или crypt, важно отметить, что если длина текущего столбца пароля меньше 60, его нужно будет изменить на это (или выше). В руководстве предлагается длина 255.
Вам потребуется ALTER length вашей колонки и начать с нового хеша, чтобы он вступил в силу. В противном случае MySQL будет терпеть неудачу.
Прежде всего, вы забыли добавить свое имя базы данных и пароль в свой экземпляр mysqli
<?php $db = new mysqli('127.0.0.1', 'root', 'your_password_for_the_user_root','yout_database_name'); if($db->connect_errno) { echo "<p id='gotem'>Something has gone wrong.Tell J to fix it.</p>"; } ?>
Затем в вашем файле register.php вы добавили индекс сообщения, который не будет установлен ( $_POST['desc']
), поэтому ваш код внутри вашего оператора if никогда не будет выполняться, так как ваша форма не содержит имени ввода desc .Я думаю, что лучше удалите его и, пожалуйста, не забудьте выполнить ваше подготовленное заявление. Код может быть таким.
ОБНОВЛЕНО ИЗМЕНЕНИЕ «К»
if(!empty($_POST)) { if(isset($_POST['username'], $_POST['password'])) { $username = $_POST['username']; $password = $_POST['password']; if(!empty($username) && !empty($password)) { $insert = $db->prepare("INSERT INTO `user` (`name`, `pass`) VALUES (?, ?)"); $insert->bind_param('ss', $username, $password); if (!$insert->execute()) { echo "Execute failed: (" . $stmt->errno . ") " . $stmt->error; } } } }
Также может быть полезно добавить тип атрибута вашей кнопки
<form action="" method="post"> <input type="text" name="username" placeholder="Username" autocomplete="off"> <input type="password" name="password" placeholder="Password" autocomplete="off"> <button type="submit">Register</button> </form>
в вашем файле, строка 6
if(isset($_POST['username'], $_POST['password'], $_POST['desc'])) {
вы не отправляете $_POST['desc']
проверьте это.
ПРИМЕЧАНИЕ. Лучше всего, иметь еще для всех ваших, если, чтобы увидеть, что произошло
РЕДАКТИРОВАТЬ:
используйте $insert->execute();
после
$insert->bind_param('ss', $username, $password);
Номер строки. 6
Я думаю, вы добавили дополнительный параметр «desc» в инструкцию isset, которая нигде не используется.
Изменить эту строку
if(isset($_POST['username'], $_POST['password'], $_POST['desc'])) {
Следующее
if(isset($_POST['username'], $_POST['password'])) {
Добавьте следующий код.
Вы привязываете параметр к запросу sql, но еще не выполняетесь.
Добавьте следующий код сразу после $ insert-> bind_param ('ss', $ username, $ password);
$insert->execute();
Создание сеанса
Чтобы создать сеанс, вам нужно сохранить значение сеанса в переменной сеанса. Вы можете сделать это, сохранив вновь зарегистрированный идентификатор пользователя в переменной сеанса. Добавьте следующий код сразу после $ insert-> execute ();
$userid = mysqli_insert_id($db); // get newly registred userid $_SESSION['userid'] = $userid // store the registred userid in session.
Перенаправление на страницу индекса
Перенаправление страницы с использованием функции заголовка в php
Добавьте следующий код.
header("Location: index.php");
На странице индекса
Чтобы получить доступ к переменной сеанса и сессии. Добавьте следующий код в первой строке.
session_start(); $userid = $_SESSION['userid']; if(isset($userid) && !empty($userid)) { echo "User is logged In using user id:".$userid; } else { echo "User is not logged In" }