Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Выборка данных (http://forum.oszone.net/showthread.php?t=242096)

lora.1 05-09-2012 23:39 1983855

Выборка данных
 
Всем здравствовать.Осваиваю mysql и php на denwer.Создал форму регистрации.Регистрация работает,но данные из необязательных полей в бд заносятся выборочно и при попытки вытащить тоже не все выходят.Все поля и переменные сделал по одному шаблону.Почему одни заносятся,а другие нет?Подскажите где копать.Только попроще,если можно.

Coutty 06-09-2012 05:15 1983929

Цитата:

На передаче "Что? Где? Когда?":
- Уважаемые знатоки, у меня в подвале скрипит. Что это?
Слишком мало информации для размышления. Нужна значимая часть скрипта и SQL-запрос.
Может быть там в полях попадаются кавычки, может быть они отбрасываются по условию или вообще не передаются через $_POST, т.к. неправильно указан аттрибут name у поля.
Добавьте в начало скрипта строку print_r($_POST); чтобы увидеть, что передаётся в скрипт post-запросом, а что - нет.

Попробуйте поставить себе phpMyAdmin и посмотреть через него - есть ли вообще данные в БД, которые "не все выходят". Посмотрите там заодно как надо строить запросы на добавление и извлечение.

lora.1 06-09-2012 09:47 1983983

Вложений: 1
Часть обработчика:

<?php
//заносим введенный пользователем текст в переменную $x, если он пустой, то уничтожаем переменную
if (isset($_POST['sees'])) { $sees = $_POST['sees']; if ($login == '') { unset($sees);} }

if (isset($_POST['teep'])) { $teep = $_POST['teep']; if ($teep == '') { unset($teep);} }

if (isset($_POST['pl'])) { $pl = $_POST['pl']; if ($pl == '') { unset($pl);} }

if (isset($_POST['hd'])) { $hd = $_POST['hd']; if ($hd == '') { unset($hd);} }

if (isset($_POST['op'])) { $op = $_POST['op']; if ($op == '') { unset($op);} }

if (isset($_POST['bp'])) { $bp = $_POST['bp']; if ($bp == '') { unset($bp);} }

if (isset($_POST['mon'])) { $mon = $_POST['mon']; if ($mon == '') { unset($mon);} }





if (isset($_POST['login'])) { $login = $_POST['login']; if ($login == '') { unset($login);} }

if (isset($_POST['password'])) { $password=$_POST['password']; if ($password =='') { unset($password);} }

if (isset($_POST['code'])) { $code = $_POST['code']; if ($code == '') { unset($code);} }

if (isset($_POST['email'])) { $email = $_POST['email']; if ($email == '') { unset($email);} }


if (empty($login) or empty($password)or empty($code) or empty($email))
{
exit ("Вы ввели не всю информацию, вернитесь назад и заполните все поля!");

----------------------------------------------
$result2 = mysql_query ("INSERT INTO users (login,password,avatar,email,teep,sees,hd,op,bp,mon,pl,date)

VALUES('$login','$password','$avatar','$email','$teep','$sees','$hd','$op','$bp','$mon','$pl',NOW()) ");

if ($result2=='TRUE')

{
----------------------

Запрос:

<?php
$db = mysql_connect("localhost","root","");

mysql_select_db("nikita",$db);

$resultat = mysql_query("SELECT teep,sees,op,hd,pl,bp,mon FROM users WHERE id='43'",$db);

$array = mysql_fetch_array($resultat);

echo "<br>оперативка:".$array['op']."<br>диск:".$array['hd']."<br>пк:".$array['teep'];

echo "<br>монитор:".$array['mon']."<br>система:".$array['sees']."<br>материнка:".$array['pl'];
?>
-------------------------
скрин БД.прилагаю.

Временами регистрация с заполненными необязательными полями вообще не проходит.Иногда проходит.Там где в базе совсем пустые поля не захотела с ними регистрировать.
Запрос
print_r($_POST);
показывает тоже,что и в базе.Сам скрипт на извлечение работает,если все в базу занеслось.

ID45:

оперативка:aa
диск:jj
пк:fff
монитор:222
система:
материнка:hhh

Эта "система:"ни в какую не проходит.И имя менял и местами менял-хоть убей.

Coutty 06-09-2012 17:49 1984298

Логика построения условных выражений не совсем очевидна, но даже если смотреть "как есть", то видна ошибка в этой строке:
Цитата:

Цитата lora.1
if (isset($_POST['sees'])) { $sees = $_POST['sees']; if ($login == '') { unset($sees);} } »

вместо $login, наверное, должно быть $sees?

Ещё мне не нравится, что используется unset() для переменных, если они не заданы. Но если вы их удаляете, то по идее скрипт должен выдать ошибку в том месте, где вы формируете запрос INSERT, т.к. используется необъявленная переменная. Впрочем, я точно не скажу - возможно, PHP необъявленные переменные считает за NULL. Лучше оставлять пустую строку, чем NULL.

Я бы писал так:
PHP код:

$sees = (isset($_POST['sees'])) ? $_POST['sees'] : ''// если переменная $_POST['sees'] задана, то используем её. Если не задана, то присваиваем пустую строку 

хотя для начинающих такие конструкции могут казаться неочевидными.

Если в переменных будут попадаться кавычки, то должно с ошибкой падать.

Ну и в вашем скрипте ещё SQL-инъекции можно делать, т.ч. неплохо бы организовать проверку содержимого переменных.

Цитата:

Цитата lora.1
Запрос print_r($_POST); показывает тоже,что и в базе. »

Т.е. не всё? Тогда, быть может, у вас HTML-форма неправильно составлена?

Вкратце:
1. Заменить $login на $sees
2. Избавиться от unset()
3. Проверить HTML-форму

lora.1 06-09-2012 23:19 1984485

Вложений: 3
Всё сделал как сказали.Форму переделал.Ерунда какая то.Вот коды и скрипты,взгляните,время будет.Заполняю эти н.о. поля не идёт.удаляю проходит,всё нормально. Пока попробую новый скрипт найти.

Coutty 07-09-2012 05:23 1984536

Ух, как много сразу)

Когда "не идёт" - выдаёт ошибку или что-то другое пишет? Или просто не записывает в БД?

Опять же сразу в глаза бросается - в базе данных поле называется mahter, а в запросе Insert - mather.
Также на всякий случай сохраните скрипт в юникоде, а то мало ли... Я как-то раз из-за разных кодировок в скриптах целый день ошибку искал >_<

И ещё: в регулярном выражении проверки e-mail'а не допускаются адреса вида vasya.ivanov@gmail.com

lora.1 07-09-2012 11:38 1984659

Выдаёт ошибку,которая прописана в конце скрипта-- exit ("Ошибка! Вы не зарегистрированы.");--.Поля очищаю-работает.Я пока лох в php,и не понимаю какая разница(кроме имени)в этих строках:

if (isset($_POST['login'])) { $login = $_POST['login']; if ($login == '') { unset($login);} }

if (isset($_POST['sees'])) { $sees = $_POST['sees']; if ($sees == '') { unset($sees);} }

Почему с первой работает,а при добавлении второй нет?

Ведь данная ошибка распостраняется на эту часть скрипта,как я понимаю:

$result2 = mysql_query ("INSERT INTO users (login,password,avatar,email,teep_pc,sees,hd,member,block,disp,mather,date)
VALUES('$login','$password','$avatar','$email','$teep_pc','$sees','$hd','$member','$block','$disp',' $mather',NOW())");// Проверяем, есть ли ошибки
if ($result2=='TRUE')
{

Здесь тоже я просто добавил переменные.
(В БД mather исправил,спасибо)

Coutty 07-09-2012 16:56 1984828

Давайте ещё посмотрим какой SQL-запрос формируется.
Напишите так:
PHP код:

$sql "INSERT INTO users (login,password,avatar,email,teep_pc,sees,hd,member,block,disp,mather,date)
 VALUES('$login','$password','$avatar','$email','$teep_pc','$sees','$hd','$member','$block','$disp',' $mather',NOW())"
;
echo 
$sql;
$result2 mysql_query($sql); 

И посмотрим, что в $sql занесётся (когда не работает).

lora.1 07-09-2012 18:56 1984880

Провёл несколько регистраций.Теперь ошибка пропала(мистика),но все данные не заносятся.

INSERT INTO users (login,password,avatar,email,teep_pc,sees,hd,member,block,disp,mather,date)

VALUES('rrrrrr','07b432d25170b469b57095ca269bc202b3p6f','avatars/net-avatara.jpg','ew.bolgow@yandex.ru','ggggg','hhhh','','','','jjjjjj',' ',NOW())

Вам на E-mail выслано письмо с cсылкой, для подтверждения регистрации. Внимание! Ссылка действительна 1 час. Главная страница

lora.1 09-09-2012 14:54 1985535

P.S. Ошибка в скрипте найдена.Спасибо.


Время: 19:06.

Время: 19:06.
© OSzone.net 2001-