[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Пустое поле в таблице при неверном insert запросе
dager12
Если в insert запросе неправильно указано значение(values),то идет добавления пустого поля в таблицу.После запроса добавлял mysql_affected_rows() и выводил сообщение о ошибке,но запись уже добавлена и что с ней делать?Возможно ли как то проверять значение inserta перед добавлением или удалять запись из таблицы после mysql_affected_rows() ?



Спустя 2 минуты, 9 секунд (26.09.2011 - 00:32) inpost написал(а):
Покажи запрос, в котором данные могут добавляться пустые?
И чем неправильно? Проверяй переменные, чтобы они были не пустые, если условие отвечает (!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']))

Спустя 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
Цитата (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:

Нужно только когда прег матча нету?Насчет пароля сглупил я user posted image

Спустя 3 минуты, 17 секунд (26.09.2011 - 02:20) dager12 написал(а):
Цитата (Winston @ 25.09.2011 - 23:02)
[QUOTE=Игорь_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';

var3?smile.gif

Спустя 7 минут, 25 секунд (26.09.2011 - 02:27) inpost написал(а):
dager12
С ЧПУ ознакомился? Понимаешь принципы построения сайтов через 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 или чему-нибудь еще. И выглядеть будет читабельнее.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.