В настоящее время у меня есть система входа в систему, которую я пытался преобразовать в PDO из Mysqli.
В настоящее время у меня есть веб-сайт с базой данных, прикрепленной с помощью phpMyAdmin / MySQL.
Я попытался преобразовать все, и теперь я покажу вам часть системы Registration.inc.php, поскольку у меня уже есть часть входа, работающая с PDO.
Это то, что у меня есть.
SIGNUP.INC.PHP
<?php
//check if the user has clicked the login button
if (isset($_POST['submit'])) {
//Then we include the database connection
include_once 'dbh.inc.php';
require_once 'dbh.inc.php';
// then get the data from the signup form
$phone = $_POST['phone'];
$zip = $_POST['zip'];
$email = $_POST['email'];
$name = $_POST['name'];
$password = $_POST['password'];
//Error handlers
//Error handlers are important to avoid any mistakes the user might have made when filling out the form!
//Check for empty fields
if (empty($name) || empty($phone) || empty($email) || empty($zip) || empty($password)) {
header("Location: ../signup.php?signup=empty");
exit();
} else {
if (
!preg_match("/[\w\s]+/", $name) || !preg_match("/^(\\+)[0-9]{8,30}$/", $phone) ||
!preg_match("/[^@]+@[^@]+\.[^@]+/", $email) || !preg_match("/^[0-9]{4}$/", $zip) ||
!preg_match("/^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9]).{8,}$/", $password)
) {
header("Location: ../signup.php?signup=invalid");
exit();
} else {
//Check email
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
header("Location: ../signup.php?signup=email");
exit();
} else {
$stmt = $conn->prepare("SELECT * FROM users WHERE user_id=:$user_id");
$stmt->bindParam(':name', $user_id, PDO::PARAM_STR);
if (!$stmt->execute()) {
header("Location: ../signup.php?signup=usertaken");
exit();
} else {
//Hashing of the Password
$hashedPwd = password_hash($password, PASSWORD_DEFAULT);
//Insert user to database
$sql = "INSERT INTO users (user_name, user_phone, user_email,
user_zip, user_password) VALUES ('$name', '$phone', '$email',
'$zip', '$hashedPwd');";
$stmt= $pdo->prepare($sql);
$stmt->execute([$name, $phone, $email, $zip, $hashedPwd ]);
header("Location: ../signup.php?signup=success");
exit();
}
}
}}}
DBH.INC.PHP
<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "loginsystem";
try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname",
$username,
$password,
array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
}
catch(PDOException $e) {
echo $e->getMessage();
}
Всякий раз, когда я пытаюсь зарегистрироваться, меня перенаправляют на этот URL (http://localhost/php44/includes/signup.inc.php).
И показывается эта ошибка:
Примечание: неопределенная переменная: user_id в C: \ xampp \ htdocs \ php44 \ includes \ signup.inc.php в строке 40
Неустранимая ошибка: Uncaught PDOException: SQLSTATE [42000]: Синтаксическая ошибка или нарушение прав доступа: 1064 В синтаксисе SQL есть ошибка; проверьте руководство, соответствующее вашей версии сервера MariaDB, чтобы найти правильный синтаксис для использования рядом с ':' в строке 1 в C: \ xampp \ htdocs \ php44 \ includes \ signup.inc.php: 48 Трассировка стека: # 0 C: \ xampp \ htdocs \ php44 \ includes \ signup.inc.php (48): PDOStatement-> execute () # 1 {main}, брошенный в C: \ xampp \ htdocs \ php44 \ includes \ signup.inc.php в строке 48
Я понятия не имею, в чем проблема, и что я должен сделать, чтобы исправить ее, поэтому любая помощь будет очень признательна.
EDIT:
Это то, что у меня есть сейчас! :)
<?php
//check if the user has clicked the login button
if (isset($_POST['submit'])) {
//Then we include the database connection
include_once 'dbh.inc.php';
require_once 'dbh.inc.php';
// then get the data from the signup form
$phone = $_POST['phone'];
$zip = $_POST['zip'];
$email = $_POST['email'];
$name = $_POST['name'];
$password = $_POST['password'];
//Error handlers
//Error handlers are important to avoid any mistakes the user might have made when filling out the form!
//Check for empty fields
if (empty($name) || empty($phone) || empty($email) || empty($zip) || empty($password)) {
header("Location: ../signup.php?signup=empty");
exit();
} else {
if (
!preg_match("/[\w\s]+/", $name) || !preg_match("/^(\\+)[0-9]{8,30}$/", $phone) ||
!preg_match("/[^@]+@[^@]+\.[^@]+/", $email) || !preg_match("/^[0-9]{4}$/", $zip) ||
!preg_match("/^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9]).{8,}$/", $password)
) {
header("Location: ../signup.php?signup=invalid");
exit();
} else {
//Check email
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
header("Location: ../signup.php?signup=email");
exit();
} else {
$stmt = $conn->prepare("SELECT * FROM users WHERE user_id=:user_id");
$stmt->bindParam(':userid', $user_id, PDO::PARAM_STR);
if (!$stmt->execute()) {
header("Location: ../signup.php?signup=usertaken");
exit();
} else {
//Hashing of the Password
$hashedPwd = password_hash($password, PASSWORD_DEFAULT);
//Insert user to database
$sql = "INSERT INTO users (user_name, user_phone, user_email,
user_zip, user_password) VALUES ('name', 'phone', 'email',
'zip', 'hashedPwd');";
$stmt= $pdo->prepare($sql);
$stmt->execute([':name' => $name,
':phone' => $phone,
':email' => $email,
':zip' => $zip,
':hashedPwd'=> $hashedPwd
]);
header("Location: ../signup.php?signup=success");
exit();
}
}
}}}
Я все еще получаю эту ФАТАЛЬНУЮ ОШИБКУ:
Неустранимая ошибка: необработанное исключение PDO: SQLSTATE [HY093]: недопустимый номер параметра: параметр не был определен в C: \ xampp \ htdocs \ php44 \ includes \ signup.inc.php: 44 Трассировка стека: # 0 C: \ xampp \ htdocs \ php44 \ includes \ signup.inc.php (44): PDOStatement-> execute () # 1 {main}, брошенный в C: \ xampp \ htdocs \ php44 \ includes \ signup.inc.php в строке 44