Спустя 2 минуты, 9 секунд (26.09.2011 - 00:32) inpost написал(а):
Покажи запрос, в котором данные могут добавляться пустые?
И чем неправильно? Проверяй переменные, чтобы они были не пустые, если условие отвечает (!empty), то можешь добавлять.
И чем неправильно? Проверяй переменные, чтобы они были не пустые, если условие отвечает (!empty), то можешь добавлять.
Спустя 1 минута, 33 секунды (26.09.2011 - 00:33) Winston написал(а):
$var1 = '';
$var2 = 'text1';
$var3 = 'text2';
if(!empty($var1) && !empty($var2) && !empty($var3))
mysql_query("INSERT INTO `tbl` (`filed1`, `field2`, `field3`) VALUES('".$var1."','".$var2."','".$var3."')");
else
echo 'Присутствуют не все данные !';
Как-то так
Спустя 13 минут, 30 секунд (26.09.2011 - 00:47) neadekvat написал(а):
Winston, как минимум 0 не пройдет (про отсутствие числовых полей автор не говорил).
Да и зачем конкатенация, если запрос в двойных кавычках?
Да и зачем конкатенация, если запрос в двойных кавычках?
Спустя 5 минут, 49 секунд (26.09.2011 - 00:53) Winston написал(а):
Цитата (neadekvat @ 26.09.2011 - 00:47) |
Winston, как минимум 0 не пройдет (про отсутствие числовых полей автор не говорил). |
Я ему пример показал, дальше пусть думает..
Цитата (neadekvat @ 26.09.2011 - 00:47) |
Да и зачем конкатенация, если запрос в двойных кавычках? |
Привычка...
Спустя 5 минут, 54 секунды (26.09.2011 - 00:59) dager12 написал(а):
<?php
if($_POST)
{
$login = trim($_POST['rlogin']);
$password = trim($_POST['rpass']);
$password_r = trim($_POST['rpass_r']);
$email = trim($_POST['email']);
$_POST['rlogin'] = addslashes($_POST['rlogin']);
$_POST['rpass'] = addslashes($_POST['rpass']);
$_POST['rpass_r'] = addslashes($_POST['rpass_r']);
$_POST['email'] = addslashes($_POST['email']);
$_POST['rlogin'] = htmlspecialchars($_POST['rlogin']);
$_POST['rpass'] = htmlspecialchars($_POST['rpass']);
$_POST['rpass_r'] = htmlspecialchars($_POST['rpass_r']);
$_POST['email'] = htmlspecialchars($_POST['email']);
$error = false;
if($error == true){$errortext = "<div class='error_title'>При регистрации на сайте произошли следующие ошибки:</div>";}
if(empty($login))
{
$error = true;
$errortext .= "<li class='error_con'>Вы не заполнели поле Логин!</li>";
}
else
{
if(!preg_match('/^[a-z0-9\[\]\(\)\.-]{6,20}$/i', $login))
{
$error = true;
$errortext .= "<li class='error_con'>Убедитесь что Логин содержит от 6 до 20 символов, и состоит из латинских символов и цифр,разрешенные символы -_[].()</li>";
}
}
if(empty($password))
{
$error = true;
$errortext .= "<li class='error_con'>Вы не заполнили поле Пароль!</li>";
}
else
{
if(!preg_match('/^[a-z0-9]{6,20}$/i', $password))
{
$error = true;
$errortext .= "<li class='error_con'>Убедитесь что Пароль содержит от 6 до 20 символов, и состоит из латинских символов и цифр</li>";
}
}
if(empty($password_r))
{
$error = true;
$errortext .= "<li class='error_con'>Вы не заполнили поле Подтверждение пароля!</li>";
}
else
{
if($password != $password_r)
{
$error = true;
$errortext .= "<li class='error_con'>Поле Пароль и его Подтверждение не совпадают!</li>";
}
}
if(empty($email))
{
$error = true;
$errortext .= "<li class='error_con'>Вы не заполнили поле E-Mail</li>";
}
else
{
if(!preg_match('/^[-0-9a-z_\.]+@[-0-9a-z^\.]+\.[a-z]{2,4}$/i', $email))
{
$error = true;
$errortext .= "<li class='error_con'>Не правильно заполнено поле E-Mail. E-mail должен иметь вид user@somehost.com</li>";
}
}
$errortext .= '</ul>';
if(isset($login) && ($password) && ($email))
{
$db = '';
$dbhost = '';
$dblogin = '';
$dbpassword = '';
$dbcon = mysql_connect($dbhost, $dblogin, $dbpassword);
if(!$dbcon)
{
echo "<p>Произошла ошибка при подсоединении к MySQL!</p>". mysql_error();
exit();
}
else
{
if(!mysql_select_db($db, $dbcon))
{
echo ("<p>Выбранной базы данных не существует!</p>");
}
}
$query = 'INSERT INTO users (login, password, email) VALUES("'. $login .'", "'. $password .'", "'. $email .'")';
$sql = mysql_query($query);
if(mysql_affected_rows())
{
echo 'Ошибка регистрации';
}
mysql_close($dbcon);
}
}
?>
Вот весь код.Если какую то из переменных в запросе испортить,то будет пустая строка.Например:вместо $login написать $logi.C этим стоит бороться или это паранойя?
Спустя 22 минуты, 44 секунды (26.09.2011 - 01:21) Игорь_Vasinsky написал(а):
Цитата |
$login = trim($_POST['rlogin']); $password = trim($_POST['rpass']); $password_r = trim($_POST['rpass_r']); $email = trim($_POST['email']); $_POST['rlogin'] = addslashes($_POST['rlogin']); $_POST['rpass'] = addslashes($_POST['rpass']); $_POST['rpass_r'] = addslashes($_POST['rpass_r']); $_POST['email'] = addslashes($_POST['email']); $_POST['rlogin'] = htmlspecialchars($_POST['rlogin']); $_POST['rpass'] = htmlspecialchars($_POST['rpass']); $_POST['rpass_r'] = htmlspecialchars($_POST['rpass_r']); $_POST['email'] = htmlspecialchars($_POST['email']); |
вот эту проверку - удобней осуществлять при помощи тернарного оператора, например:
$rpass_r = !empty($_POST['rpass_r']) ? htmlspecialchars($_POST['rpass_r']) : null;
если переменная есть и !=null - то работаем
Про тернарный оператор в моём журнале.
Спустя 21 минута, 27 секунд (26.09.2011 - 01:43) dager12 написал(а):
Цитата (Игорь_Vasinsky @ 25.09.2011 - 22:21) |
вот эту проверку - удобней осуществлять при помощи тернарного оператора, например:$rpass_r = !empty($_POST['rpass_r']) ? htmlspecialchars($_POST['rpass_r']) : null; если переменная есть и !=null - то работаем Про тернарный оператор в моём журнале. |
Почитал спасибо,а можно в "если условие выполнено" вставить htmlspecialchars($_POST['rpass_r']) и trim($_POST['rpass_r']) одновремено ?
Спустя 4 минуты, 43 секунды (26.09.2011 - 01:47) Игорь_Vasinsky написал(а):
ну можно комечно
htmlspecialchars(trim($_POST['var']))
htmlspecialchars(trim($_POST['var']))
Спустя 28 секунд (26.09.2011 - 01:48) Winston написал(а):
Игорь_Vasinsky
Цитата (Игорь_Vasinsky @ 26.09.2011 - 01:21) |
$rpass_r = !empty($_POST['rpass_r']) ? htmlspecialchars($_POST['rpass_r']) : null; |
Так не надо делать! В базе данные должны хранится в таком виде в каком были отправлены, а вот на выводе из базы обязательно htmlspecialchars
Цитата (dager12 @ 26.09.2011 - 01:43) |
а можно в "если условие выполнено" вставить htmlspecialchars($_POST['rpass_r']) и trim($_POST['rpass_r']) одновремено ? |
Можно, но не нужно
Вот так тогда
$rpass_r = isset($_POST['rpass_r']) ? trim($_POST['rpass_r']) : null;
rpass_r я так понял, что это речек пароля? Зачем его вообще htmlspe.. обрабатывать ? :blink:
Спустя 3 минуты, 58 секунд (26.09.2011 - 01:52) Игорь_Vasinsky написал(а):
isset и так будет, так как ТС проверку на simbit сделал, а вот empty - быть может.
да... пароль тупо хешировать и в БД писать
да... пароль тупо хешировать и в БД писать
Спустя 1 минута, 13 секунд (26.09.2011 - 01:53) Игорь_Vasinsky написал(а):
Цитата |
в таком виде в каком были отправлены |
только mysql_real_escape_strings()
Спустя 8 минут, 53 секунды (26.09.2011 - 02:02) Winston написал(а):
Игорь_Vasinsky
Цитата (Игорь_Vasinsky @ 26.09.2011 - 01:52) |
isset и так будет |
Что будет выведено на экран? Так, не запуская код, скажи :)
Свернутый текст
$var1 = 0;
$var2;
echo isset($var1) ? 'yes' : 'no';
echo ' ';
echo !empty($var1) ? 'yes' : 'no';
echo '<br/>';
echo isset($var2) ? 'yes' : 'no';
echo ' ';
echo !empty($var2) ? 'yes' : 'no';
Спустя 14 минут, 44 секунды (26.09.2011 - 02:17) dager12 написал(а):
Цитата (Winston @ 25.09.2011 - 22:48) | ||
Так не надо делать! В базе данные должны хранится в таком виде в каком были отправлены, а вот на выводе из базы обязательно htmlspecialchars
Можно, но не нужно Вот так тогда $rpass_r = isset($_POST['rpass_r']) ? trim($_POST['rpass_r']) : null; rpass_r я так понял, что это речек пароля? Зачем его вообще htmlspe.. обрабатывать ? :blink: |
Нужно только когда прег матча нету?Насчет пароля сглупил я

Спустя 3 минуты, 17 секунд (26.09.2011 - 02:20) dager12 написал(а):
Цитата (Winston @ 25.09.2011 - 23:02) |
[QUOTE=Игорь_Vasinsky,26.09.2011 - 01:52]isset и так Что будет выведено на экран? Так, не запуская код, скажи :) Свернутый текст $var1 = 0; |
var3?

Спустя 7 минут, 25 секунд (26.09.2011 - 02:27) inpost написал(а):
dager12
С ЧПУ ознакомился? Понимаешь принципы построения сайтов через 1 точку входа, через index.php ?
Так вот в нём прописываешь:
Теперь нам не надо на каждой странице обрабатывать $_POST данные функцией trim.
Отключаем магические кавычки (если включены), и не используем более addslashes.
Запрос делаем так:
Далее банальная ошибка:
Ты делаешь проверку на то, были ли записи добавлены, а так как ТАБЛИЦА была изменена, а именно добавлена запись, поэтому при успешном добавлении в БД у тебя будет выходить надпись, что ошибка регистрации, а не наоборот. Тут надо отрицание в условие добавить: !mysql_affected_rows()
Проверку в начале делать стоит, но лучший её вариант:
Ну и плюс посмотри внимательно вообще на свой код, и на абсурд этой строчки:
В какой ситуации $error превратится вдруг в TRUE?
Тут лучше использовать массив, глянь как я реализовал это у себя:
И отдельно форму:
С ЧПУ ознакомился? Понимаешь принципы построения сайтов через 1 точку входа, через index.php ?
Так вот в нём прописываешь:
// Лучше всего в отдельном файле functions.php
// Именно стандартные функции сайта, которые используются на всех страницах
function trimAll($data)
{
if(is_array($data))
$data = array_map("trimAll", $data);
else
$data = trim($data);
return $data;
}
// Теперь в index.php в начале прописываем (после подключения файла functions.php):
if(count($_POST))
$_POST = trimAll($_POST);
Теперь нам не надо на каждой странице обрабатывать $_POST данные функцией trim.
Отключаем магические кавычки (если включены), и не используем более addslashes.
Запрос делаем так:
$sql = mysql_query("
INSERT INTO `users` SET
`login` = '".mysql_real_escape_string($_POST['login'])."',
`password` = '".mysql_real_escape_string($_POST['password'])."',
`email` = '".mysql_real_escape_string($_POST['email'])."'
") or die(mysql_error());
Далее банальная ошибка:
if(mysql_affected_rows())
{
echo 'Ошибка регистрации';
}
Ты делаешь проверку на то, были ли записи добавлены, а так как ТАБЛИЦА была изменена, а именно добавлена запись, поэтому при успешном добавлении в БД у тебя будет выходить надпись, что ошибка регистрации, а не наоборот. Тут надо отрицание в условие добавить: !mysql_affected_rows()
Проверку в начале делать стоит, но лучший её вариант:
if(isset($_POST['email'],$_POST['login'],$_POST['password'])) // перечисляем через запятую
{
тут действия, если данные были отправлены!
}
Ну и плюс посмотри внимательно вообще на свой код, и на абсурд этой строчки:
$error = false;
if($error == true){$errortext = "<div class='error_title'>При регистрации на сайте произошли следующие ошибки:</div>";}
В какой ситуации $error превратится вдруг в TRUE?
Тут лучше использовать массив, глянь как я реализовал это у себя:
if(isset($_POST['email'],$_POST['password'],$_POST['login'],$_POST['fio']))
{
$error = array();
if(mb_strlen($_POST['password']) < 6 || $_POST['password'] == 'Введите пароль')
$error['password'] = true;
if(mb_strlen($_POST['login']) < 2 || $_POST['login'] == 'Введите псевдоним')
$error['login'] = true;
if(mb_strlen($_POST['fio']) < 3 || $_POST['fio'] == 'Ваше ФИО')
$error['fio'] = true;
if(!preg_match("/^[a-z0-9_\.-]+@([-_a-z0-9]+\.)+[a-z]{2,6}$/i", $_POST['email']))
$error['email'] = true;
if(!isset($_SESSION['key']) || $_SESSION['key'] != mb_strtoupper($_POST['captcha'], 'UTF-8'))
$error['captcha'] = true;
if(!count($error))
{
mysqlQuery::Single(""); // это mysql_query
}
}
И отдельно форму:
<form action="" method="post" class="reg_form">
<p><input type="text" name="email" size="20" class="reg_input" value="<?php echo (isset($_POST['email']) ? htmlspecialchars($_POST['email']) : 'Ваш e-mail'); ?>" />
<?php if(isset($error['email'])) { ?><img src="/skins/images/reg_error.jpg" alt="" /><?php } ?><br />
<span class="reg_info"><span class="reg_name">* E-mail</span>: Вход на сайт будет осуществляться по email.</span></p>
<p><input type="text" name="password" size="20" class="reg_input" value="<?php echo (isset($_POST['password']) ? htmlspecialchars($_POST['password']) : 'Введите пароль'); ?>" />
<?php if(isset($error['password'])) { ?><img src="/skins/images/reg_error.jpg" alt="" /><?php } ?><br />
<span class="reg_info"><span class="reg_name">* Password</span>: Минимальное количество символов 6.</span></p>
<p><input type="text" name="login" size="20" class="reg_input" value="<?php echo (isset($_POST['login']) ? htmlspecialchars($_POST['login']) : 'Введите псевдоним'); ?>" />
<?php if(isset($error['login'])) { ?><img src="/skins/images/reg_error.jpg" alt="" /><?php } ?><br />
<span class="reg_info"><span class="reg_name">* Login</span>: Псевдоним (ник) будет использоваться на сайте.</span></p>
Спустя 36 минут, 36 секунд (26.09.2011 - 03:04) dager12 написал(а):
inpost
Спасибо,узнал много нового,теперь буду переписывать свой индусский код)
Спасибо,узнал много нового,теперь буду переписывать свой индусский код)
Спустя 5 часов, 28 минут, 34 секунды (26.09.2011 - 08:33) neadekvat написал(а):
Winston, уж не знаю, баг это или фича, но она мне нравится.
Т.к. в php динамическая типизация, то интерпритатор не поймет, сколько нужно выделить памяти под переменную, которой ничего не присвоено - вот и не выделяет вообще.
Логично же. А хочешь сделать дефолтное значение - приравняй к null или чему-нибудь еще. И выглядеть будет читабельнее.
Т.к. в php динамическая типизация, то интерпритатор не поймет, сколько нужно выделить памяти под переменную, которой ничего не присвоено - вот и не выделяет вообще.
Логично же. А хочешь сделать дефолтное значение - приравняй к null или чему-нибудь еще. И выглядеть будет читабельнее.