Как и в теме, я новичок в программировании, но недавно я создал некоторый код, который пока выглядит нормально для меня (да, некоторые вещи испорчены, но я собираюсь над этим поработать), поэтому у меня есть обычная форма регистрации, похожая на этот:
include 'modules/translator.php';
include 'includes/database.php';
include 'includes/header.php';
echo '<div id="regbox">
<ul>
<li><a href="registration.php" class="rbutton" onclick="return regboxr();">'. $LANG['REGISTER'] .'</a></li>
<li><a href="login.php" class="sbutton" onclick="return regboxs();">'. $LANG['SIGNIN'] .'</a></li>
</ul>
<form action="registration_action.php" method="post" autocomplete="off">
<div class="input-w"><label for="name"><img src="theme/original/images/user.png"/></label><input type="text" name="regname" placeholder="'. $LANG['NAME'] .'"class="input"></div>
<div class="input-w"><label for="surname"><img src="theme/original/images/surname.png"/></label><input type="text" name="regsurname" placeholder="'. $LANG['SURNAME'] .'"class="input"></div>
<div class="input-w"><label for="nickname"><img src="theme/original/images/nick.png"/></label><input type="text" name="regnickname" placeholder="'. $LANG['NICKNAME'] .'"class="input"></div>
<div class="input-w"><label for="email"><img src="theme/original/images/email.png"/></label><input type="text" name="regemail" placeholder="'. $LANG['EMAIL'] .'"class="input"></div>
<div class="input-w"><label for="pass"><img src="theme/original/images/password.png"/></label><input type="password" name="regpass" placeholder="'. $LANG['PASSWORD'] .'"class="input"></div>
<div class="input-w"><label for="rpass"><img src="theme/original/images/rpassword.png"/></label><input type="password" name="regrpass" placeholder="'. $LANG['RPASSWORD'] .'"class="input"></div>
<div class="registerholder"><input type="submit" class="register" value="'.$LANG['REGISTER_SUBMIT'].'"></div>
</form>
</div>';
include 'includes/footer.php';
И это файл, который проверяет наличие ошибок (например, если формат электронной почты правильный), и если ошибок нет, следует вставить данные в базу данных:
/*Include translating module,database settings,
functions needed to prepare data from form,
to insert them into database and user interface header.*/
include 'modules/translator.php';
include 'includes/database.php';
include 'includes/functions.php';
include 'includes/header.php';
/*Variables including data from registration.php form.*/
$name=$_POST[regname];
$surname=$_POST[regsurname];
$nickname=$_POST[regnickname];
$email=$_POST[regemail];
$password=$_POST[regpass];
$rpassword=$_POST[regrpass];
/*Variable used to count errors occured during registration process.*/
$errorcounter=0;
/*Variables used to display errors that occured during registration process.*/
$errornameset='';
$errorname='';
$errornamelength='';
$errorsurnameset='';
$errorsurname='';
$errorsurnamelength='';
$errornicknameset='';
$errornickname='';
$errornicknamelength='';
$erroremailset='';
$erroremail='';
$errorpasswordset='';
$errorpassword='';
$errorpasswordlength='';
$errorpasswordcomparison='';
$registrationset1='';
$registrationset2='';
$errordbconnection='';if(empty($name)){
$errorcounter++;
$errornameset='•' . $LANG['ERR_REG_NAME_SET'] . '<br>';
}
elseif(!preg_match('/^[A-ZĄĆĘŁŃÓŚŹŻ][a-ząćęłńóśźż]{2,}$/', $name)){
$errorcounter++;
$errorname='•' . $LANG['ERR_REG_NAME_CHAR'] . '<br>';
}
elseif(strlen($name)<3 || strlen($name)>16){
$errorcounter++;
$errornamelength='•' . $LANG['ERR_REG_NAME_LENGTH'] . '<br>';
}
if(empty($surname)){
$errorcounter++;
$errorsurnameset='•' . $LANG['ERR_REG_SURNAME_SET'] . '<br>';
}
elseif(!preg_match('/^[A-ZĄĆĘŁŃÓŚŹŻ][a-ząćęłńóśźż]{2,}$/', $surname)){
$errorcounter++;
$errorsurname='•' . $LANG['ERR_REG_SURNAME_CHAR'] . '<br>';
}
elseif(strlen($surname)<3 || strlen($surname)>32){
$errorcounter++;
$errorsurnamelength='•' . $LANG['ERR_REG_SURNAME_LENGTH'] . '<br>';
}
if(empty($nickname)){
$errorcounter++;
$errornicknameset='•' . $LANG['ERR_REG_NICKNAME_SET'] . '<br>';
}
elseif(!preg_match('/^[A-Za-z0-9]{6,}$/', $nickname)){
$errorcounter++;
$errornickname='•' . $LANG['ERR_REG_NICKNAME_CHAR'] . '<br>';
}
elseif(strlen($nickname)<3 || strlen($nickname)>12){
$errorcounter++;
$errornicknamelength='•' . $LANG['ERR_REG_NICKNAME_LENGTH'] . '<br>';
}
if(empty($email)){
$errorcounter++;
$erroremailset='•' . $LANG['ERR_REG_EMAIL_SET'] . '<br>';
}
elseif(!preg_match('/^[A-Za-z0-9\.\-\_]{2,}\@[A-Za-z0-9\.\-\_]+\.[a-z]{2,4}$/', $email)){
$errorcounter++;
$erroremail='•' . $LANG['ERR_REG_EMAIL_CHAR'] . '<br>';
}
if(empty($password) || empty($rpassword)){
$errorcounter++;
$errorpasswordset='•' . $LANG['ERR_REG_PASSWORD_SET'] . '<br>';
}
elseif(!preg_match('/^[A-Za-z0-9\.\-_@#]{6,}$/', $password)){
$errorcounter++;
$errorpassword='•' . $LANG['ERR_REG_PASSWORD_CHAR'] . '<br>';
}
elseif(strlen($password)<6 || strlen($password)>32){
$errorcounter++;
$errorpasswordlength='•' . $LANG['ERR_REG_PASSWORD_LENGTH'] . '<br>';
}
elseif($password !== $rpassword){
$errorcounter++;
$errorpasswordcomparison='•' . $LANG['ERR_REG_PASSWORD_COMPARISON'] . '<br>';
}
if($errorcounter==1){
echo '<div class="warning"><div class="wimg"><img src="theme/original/images/warning.png"/></div><div class="wheaderc"><span class="wheader">'. $LANG['ERR_REG_COUNT_MESSAGE'] . $errorcounter . $LANG['ERR_REG_COUNT_1'] . '</span></div><div class="wspacer"></div><div class="errors">' .
$errornameset .
$errorname .
$errornamelength .
$errorsurnameset .
$errorsurname .
$errorsurnamelength .
$errornicknameset .
$errornickname .
$errornicknamelength .
$erroremailset .
$erroremail .
$errorpasswordset .
$errorpassword .
$errorpasswordlength .
$errorpasswordcomparison .
'</div><div class="aspacer"></div><a href="registration.php" class="reglink">' . $LANG['REG_FIX'] . '</a></div>';
}
elseif($errorcounter>1 && $errorcounter<5){
echo '<div class="warning"><div class="wimg"><img src="theme/original/images/warning.png"/></div><div class="wheaderc"><span class="wheader">'. $LANG['ERR_REG_COUNT_MESSAGE'] . $errorcounter . $LANG['ERR_REG_COUNT_1_5'] . '</span></div><div class="wspacer"></div><div class="errors">' .
$errornameset .
$errorname .
$errornamelength .
$errorsurnameset .
$errorsurname .
$errorsurnamelength .
$errornicknameset .
$errornickname .
$errornicknamelength .
$erroremailset .
$erroremail .
$errorpasswordset .
$errorpassword .
$errorpasswordlength .
$errorpasswordcomparison .
'</div><div class="aspacer"></div><a href="registration.php" class="reglink">' . $LANG['REG_FIX'] . '</a></div>';
}
elseif($errorcounter>4){
echo '<div class="warning"><div class="wimg"><img src="theme/original/images/warning.png"/></div><div class="wheaderc"><span class="wheader">'. $LANG['ERR_REG_COUNT_MESSAGE'] . $errorcounter . $LANG['ERR_REG_COUNT_4'] . '</span></div><div class="wspacer"></div><div class="errors">' .
$errornameset .
$errorname .
$errornamelength .
$errorsurnameset .
$errorsurname .
$errorsurnamelength .
$errornicknameset .
$errornickname .
$errornicknamelength .
$erroremailset .
$erroremail .
$errorpasswordset .
$errorpassword .
$errorpasswordlength .
$errorpasswordcomparison .
'</div><div class="aspacer"></div><a href="registration.php" class="reglink">' . $LANG['REG_FIX'] . '</a></div>';
}
else{
$group=1;
$token=md5(uniqid(rand(), true));
$connection=mysqli_connect(db_server, db_user, db_password, db_name);
$regquery="INSERT INTO users (name, surname, nickname, e-mail, password, group, token) VALUES ('".$name."', '".$surname."', '".$nickname."', '".$email."', '".$password."', '".$group."', '".$token."')";
if(mysqli_query($connection, $regquery)){
echo '<div class="alert"><div class="wimg"><img src="theme/original/images/alert.png"/></div><div class="aheaderc"><span class="aheader">'. $LANG['REG_COMPLETED_HEADER'] .'</span></div><div class="wspacer"></div><div class="alertm">' .
$registrationset1=$LANG['REG_COMPLETED_MESSAGE_1'] . $email . "." . $registrationset2=$LANG['REG_COMPLETED_MESSAGE_2'] .
'</div><div class="aspacer"></div><a href="index.php" class="mainlink">' . $LANG['REG_MAIN'] . '</a></div>';
mysqli_close($connection);
}
else{
echo '<div class="warning"><div class="wimg"><img src="theme/original/images/warning.png"/></div><div class="wheaderc"><span class="wheader">'. $LANG['DB_ERR_HEADER'] . '</span></div><div class="wspacer"></div><div class="errors">' .
$errordbconnection = $LANG['DB_ERR_CONNECTION'] .
'</div><div class="dbspacer"></div><a href="registration.php" class="reglink">' . $LANG['REG_FIX'] . '</a></div>';
}
}
include 'includes/footer.php';
И это все. В качестве дополнения могу сказать, что я проверил, работает ли соединение в этом файле должным образом, и был ли тест положительным. Еще одна вещь, которую я предполагаю, в div с классом предупреждений — все отрицательное, а в div с классом оповещений — все положительное. Мой скрипт выводит отрицательный div, что означает, что никакие записи не вставлены в БД (я проверил это в phpmyadmin-no records). Я перепробовал все, включая перестройку своего кода, но это не работает. MySQL Improved доступно в моих хостинговых сервисах. Есть идеи, уважаемые программисты? Спасибо за Ваше время и ожидание в надежде на хорошие ответы. 🙂
Строка запроса, которую вы используете
INSERT INTO users (name, surname, nickname, e-mail, password, group, token) VALUES ...
не будет работать в MySQL, как это. Причина в том, что e-mail
(без кавычек) не является допустимым именем столбца и что group
это ключевое слово. Таким образом, запрос не будет проанализирован. Имена обоих столбцов должны быть заключены в обратные кавычки, чтобы MySQL фактически воспринимал их как имена столбцов:
INSERT INTO users (name, surname, nickname, `e-mail`, password, `group`, token) VALUES ...
Вы обязательно должны включить отчет об ошибках, потому что это, вероятно, уже выявило бы эту ошибку (плюс еще несколько в скрипте). Кроме того, как уже отмечалось, ваш сценарий определенно уязвим для внедрения SQL-кода, и вам следует позаботиться об этом.
Других решений пока нет …