PHP

Помогите с PHP кодом! Где косяк?

Здравствуйте! Делаю валидацию на php. Вот код:

<?php
session_start();

$username = htmlspecialchars(trim($_POST['username']));
$name = htmlspecialchars(trim($_POST['name']));
$email = htmlspecialchars(trim($_POST['email']));
$password = htmlspecialchars(trim($_POST['password']));
$password = md5(md5(trim($_POST['password'])));

if ((preg_match($username, "/[a-z1234567890]{1,30}/")) || (preg_match($name, "/[а-яА-Я] {1,30}/")) || (preg_match($email, "/[a-z1234567890_.]{3,30}\@+[a-z1234567890-]{2,8}\.+[a-z]{2,6}/")) || (preg_match($password, "/[a-zA-Z1234567890]{7,30}/"))) {

mysqli_query($connect, "INSERT INTO `users` (`id`, `username`, `name`, `email`, `password`, `date`) VALUES (NULL, '$username', '$name', '$email', '$password', NOW())");

$_SESSION['good-message'] = 'Регистрация прошла успешно!';
header('Location: ../index');
}

else {
$_SESSION['bad-message'] = 'Поля заполнены неверно';
header('Location: ../registration');
}
?>

Где косяк? У меня постоянно выводится сообщение поля заполнены неверно, даже когда всё правильно, по требованию тех символов, которые я указал в качестве допустимых. Буду благодарен, любой помощи!
Serega Prokop
Serega Prokop
109
Косяк номер 1:
$username = htmlspecialchars(trim($_POST['username']));
$name = htmlspecialchars(trim($_POST['name']));
$email = htmlspecialchars(trim($_POST['email']));
$password = htmlspecialchars(trim($_POST['password']));
$password = md5(md5(trim($_POST['password'])));
htmlspecialchars НЕ спасает от SQL-инъекции, а md5(md5()) - это известная ламерская глупость. Судя по всему "курсы", по которым ты "учишься" достаточно популярны, т. к. подобный говнокод регулярно встречается на "ответах".

Косяк номер 2a:
if ((preg_match($username, "/[a-z1234567890]{1,30}/")) || (preg_match($name, "/[а-яА-Я] {1,30}/")) || (preg_match($email, "/[a-z1234567890_.]{3,30}\@+[a-z1234567890-]{2,8}\.+[a-z]{2,6}/")) || (preg_match($password, "/[a-zA-Z1234567890]{7,30}/"))) {
Условие верно, если хотя бы ОДИН preg_match вернут true. Все || надо заменить на &&. И, кстати, вот это вот [a-z1234567890] заменяется на [a-z\d].

Косяк номер 2b:
preg_match($email, "/[a-z1234567890_.]{3,30}\@+[a-z1234567890-]{2,8}\.+[a-z]{2,6}/")
НЕ НАДО проверять e-mail регулярными выражениями - обязательно найдётся корректный адрес, который твоё выражение посчитает ошибочным. Специально для проверки e-mail в PHP есть
filter_var($mail, FILTER_VALIDATE_EMAIL)

Косяк номер 3:
"INSERT INTO `users` (`id`, `username`, `name`, `email`, `password`, `date`) VALUES (NULL, '$username', '$name', '$email', '$password', NOW())".
Должно быть "INSERT INTO `users` (`username`, `name`, `email`, `password`, `date`) VALUES ('$username', '$name', '$email', '$password', NOW())". И, кстати, date тоже не нужно - если дефолтным значением поля date сделать CURRENT_TIMESTAMP.

Косяк номер 4:
Ты НЕ проверяешь, что возвращает mysqli_query и НЕ выводишь mysqli_error в случае ошибки. В результате, не знаешь, на что именно у тебя ругается MySQL.
if (mysqli_query(...) === false) {
echo mysqli_error($connect);
exit;
}
DS
Daulet Shugaiv
77 358
Лучший ответ
Serega Prokop Благодарю! Столь развернутый ответ. Возьму во внимание на указанные Вами ошибки. Язык осваиваю сам с нуля. Собственно, как и сам сайт, который я делаю, тоже полностью с нуля, без всякого движка. Как таковых, наставников не имею. На счет курсов, всё верно. Беру то, что в интернете имеется, в курсе, что это не самое лучшее, что может быть против инъекций, а точнее самое худшее, что есть. Ещё раз спасибо, буду осваивать.