Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Не могу отправить данные в БД

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: Некорректно работает запрос в БД
Yan9
Отправлено: 06 Августа, 2015 - 19:15:43
Post Id


Новичок


Покинул форум
Сообщений всего: 41
Дата рег-ции: Авг. 2015  


Помог: 0 раз(а)




Добрый день! Пишу обработчик для формы, в которую пользователь вносит логин, пароль. Создаю запрос в БД для проверки существующего пароля, если такого нет, то вносим новые данные, все работает, запрос выглядит так:
CODE (htmlphp):
скопировать код в буфер обмена
  1. $res=mysql_query("SELECT * FROM users WHERE pass=".$password); // users-таблица, pass-поле

Далее писал условие и если пароль совпадал, то данные не вносились, все работает ОК.
Но нужно еще проверить существует ли в базе такой логин (в БД поле name) и пароль, написал такую строку:
CODE (htmlphp):
скопировать код в буфер обмена
  1. $res=mysql_query("SELECT * FROM users WHERE name=".$log." AND pass=".$password);

Но все это начало работать некорректно, потом я решил сделать только проверку логина и написал:
CODE (htmlphp):
скопировать код в буфер обмена
  1. $res=mysql_query("SELECT * FROM users WHERE name=".$log);

Все дальнейшие условия начали игнорироваться, данные с одинаковым логином вносились, появилась ошибка
CODE (htmlphp):
скопировать код в буфер обмена
  1. mysql_fetch_array() expects parameter 1 to be resource, boolean given

Поискал по форуму, нашел одну функцию, если пишу:

то на экране:

Если пишу:
CODE (htmlphp):
скопировать код в буфер обмена
  1. mysql_query("select * from users WHERE name=".$log) || die(mysql_error());

то на экране:
CODE (htmlphp):
скопировать код в буфер обмена
  1. Unknown column 'Логин' in 'where clause'


Почему так происходит, я ведь только заменил одно поле на другое и пароль на логин, должно же работать одинаково, правильно? Спасибо!

Вопрос закрыт! Решение: надо было переменную, в которой лежит новый логин, обрамить кавычками (таков синтаксис)
CODE (htmlphp):
скопировать код в буфер обмена
  1. $res=mysql_query("SELECT * FROM users WHERE name='.$log'");

(Отредактировано автором: 06 Августа, 2015 - 22:30:49)

 
 Top
DelphinPRO
Отправлено: 06 Августа, 2015 - 19:32:07
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




PHP:
скопировать код в буфер обмена
  1. $dsn = 'mysql:dbname=testdb;host=127.0.0.1';
  2. $user = 'dbuser';
  3. $password = 'dbpass';
  4.  
  5. $pdo = new \PDO($dsn, $user, $password);
  6.  
  7. $stmt = $pdo->prepare("SELECT * FROM `users` WHERE `name` = :login");
  8. $stmt->execute(array('login' => $login));
  9.        
  10. $res = $stmt->fetch();
  11.  
  12. if ($res) {
  13.         echo 'Пользователь с таким логином уже зарегистрирован';
  14. }

(Отредактировано автором: 06 Августа, 2015 - 19:32:41)



-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
Yan9
Отправлено: 06 Августа, 2015 - 19:50:07
Post Id


Новичок


Покинул форум
Сообщений всего: 41
Дата рег-ции: Авг. 2015  


Помог: 0 раз(а)




DelphinPRO пишет:
PHP:
скопировать код в буфер обмена
  1. $dsn = 'mysql:dbname=testdb;host=127.0.0.1';
  2. $user = 'dbuser';
  3. $password = 'dbpass';
  4.  
  5. $pdo = new \PDO($dsn, $user, $password);
  6.  
  7. $stmt = $pdo->prepare("SELECT * FROM `users` WHERE `name` = :login");
  8. $stmt->execute(array('login' => $login));
  9.        
  10. $res = $stmt->fetch();
  11.  
  12. if ($res) {
  13.         echo 'Пользователь с таким логином уже зарегистрирован';
  14. }


Я вообще ничего не понял в этом коде, но исправил на свои данные таким образом:
$dsn = 'mysql:yan=testdb;host=127.0.0.1'; // yan-имя БД
$log=htmlspecialchars(trim($_REQUEST['uname'])); // uname-имя формы логина
$password=htmlspecialchars(trim($_REQUEST['upass'])); // upass-имя формы пароля
$pdo = new \PDO($dsn, $log, $password);
$stmt = $pdo->prepare("SELECT * FROM `users` WHERE `name` = :login");
$stmt->execute(array('login' => $login));
$res = $stmt->fetch();
if ($res) {
echo 'Пользователь с таким логином уже зарегистрирован';
}

Показало три строчки какой-то ошибки, что проблема в строке $pdo = new \PDO($dsn, $log, $password);
Или я вообще что-то не то сделал?
 
 Top
DelphinPRO
Отправлено: 06 Августа, 2015 - 20:48:34
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




Это данные для подключения к БД (форма тут не при чем)
PHP:
скопировать код в буфер обмена
  1. $dsn = 'mysql:dbname=ИМЯ_БД;host=127.0.0.1';
  2. $user = 'ПОЛЬЗОВАТЕЛЬ_БД';
  3. $password = 'ПАРОЛЬ_ПОЛЬЗОВАТЕЛЯ БД';


Данные из формы передавать сюда

PHP:
скопировать код в буфер обмена
  1. $stmt->execute(array('login' => $_REQUEST['uname']));


PS
Оформляйте, пожалуйста, свой код, чтобы его можно было читать нормально.

PPS
пароль не нужно сравнивать при регистрации. Нужно только проверить не занят ли логин
(Добавление)
Yan9 пишет:
Я вообще ничего не понял в этом коде

Значит нужно ознакомиться немного с теорией
http://php.net/manual/ru/book.pdo.php

(Отредактировано автором: 06 Августа, 2015 - 20:49:49)



-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
Yan9
Отправлено: 06 Августа, 2015 - 21:53:19
Post Id


Новичок


Покинул форум
Сообщений всего: 41
Дата рег-ции: Авг. 2015  


Помог: 0 раз(а)




DelphinPRO пишет:
Это данные для подключения к БД (форма тут не при чем)
PHP:
скопировать код в буфер обмена
  1. $dsn = 'mysql:dbname=ИМЯ_БД;host=127.0.0.1';
  2. $user = 'ПОЛЬЗОВАТЕЛЬ_БД';
  3. $password = 'ПАРОЛЬ_ПОЛЬЗОВАТЕЛЯ БД';


Данные из формы передавать сюда

PHP:
скопировать код в буфер обмена
  1. $stmt->execute(array('login' => $_REQUEST['uname']));


PS
Оформляйте, пожалуйста, свой код, чтобы его можно было читать нормально.

PPS
пароль не нужно сравнивать при регистрации. Нужно только проверить не занят ли логин
(Добавление)
Yan9 пишет:
Я вообще ничего не понял в этом коде

Значит нужно ознакомиться немного с теорией
http://php.net/manual/ru/book.pdo.php


Спасибо вам, что откликнулись! У меня была функция для подключения к БД, она хранится в другом файле, но у меня как-то все по-другому пишется.
Я знаю, что пароль не нужно проверять, а именно логин, не знаю почему решил проверить пароль, просто думал, что разницы никакой, поменять местами потом и все. Но оказалось, что я при проверке пароля видимо создал ошибку, но которую, наверное, php не видел и проверял так. А решение элементарное оказалось, просто надо было переменную, в которой новый логин, обрамить одинарными кавычками и все (я не полностью знал синтаксис запроса):
CODE (htmlphp):
скопировать код в буфер обмена
  1. $res=mysql_query("select * from users where log='$log'");

(Отредактировано автором: 06 Августа, 2015 - 21:59:30)

 
 Top
DelphinPRO
Отправлено: 06 Августа, 2015 - 22:02:37
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




Использование функций mysql_* ваша ошибка. Они сильно устарели и уже удалены из последней версии PHP

Именно ваша ошибка была не в php, а в sql синтаксисе. Я намерено об этом умолчал.
При использовании PDO, а именно параметризированных запросов (как в моем примере), подобной ошибки бы не возникло, и кроме того, защитило бы ваш код от sql-инъекций.


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
Yan9
Отправлено: 06 Августа, 2015 - 22:28:57
Post Id


Новичок


Покинул форум
Сообщений всего: 41
Дата рег-ции: Авг. 2015  


Помог: 0 раз(а)




DelphinPRO пишет:
Использование функций mysql_* ваша ошибка. Они сильно устарели и уже удалены из последней версии PHP

Именно ваша ошибка была не в php, а в sql синтаксисе. Я намерено об этом умолчал.
При использовании PDO, а именно параметризированных запросов (как в моем примере), подобной ошибки бы не возникло, и кроме того, защитило бы ваш код от sql-инъекций.


Можете, пожалуйста, подсказать хорошие ресурсы, где об этом можно подробно почитать? Я хожу на курсы по php и этот обработчик был частью д/з. То, о чем вы написали, нам преподаватель не говорил ни слова.
 
 Top
DelphinPRO
Отправлено: 06 Августа, 2015 - 23:45:33
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




Yan9 пишет:
Я хожу на курсы по php и этот обработчик был частью д/з.

Охренеть... Что за курсы такие... Попробуйте у преподавателя курсов поинтересоваться, слышал ли он что-нибудь о PDO


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
Yan9
Отправлено: 07 Августа, 2015 - 00:12:49
Post Id


Новичок


Покинул форум
Сообщений всего: 41
Дата рег-ции: Авг. 2015  


Помог: 0 раз(а)




DelphinPRO пишет:
Yan9 пишет:
Я хожу на курсы по php и этот обработчик был частью д/з.

Охренеть... Что за курсы такие... Попробуйте у преподавателя курсов поинтересоваться, слышал ли он что-нибудь о PDO


Уже за сегодня не только от вас слышу о PDO, похоже знания, которые мне даются, отсталые, жаль(
Обязательно об этом спрошу
Курсы в компьютерной академии ШАГ
 
 Top
DelphinPRO
Отправлено: 07 Августа, 2015 - 01:55:18
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




Yan9 пишет:
похоже знания, которые мне даются, отсталые

ага, лет на 10, если не больше.
В принципе базовые принципы работы с БД вы конечно уясните. Главное не зациклится на том, на чем вам дают эти базовые знания, и продолжить изучать современные методики.


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
Yan9
Отправлено: 07 Августа, 2015 - 13:18:12
Post Id


Новичок


Покинул форум
Сообщений всего: 41
Дата рег-ции: Авг. 2015  


Помог: 0 раз(а)




DelphinPRO пишет:
Yan9 пишет:
похоже знания, которые мне даются, отсталые

ага, лет на 10, если не больше.
В принципе базовые принципы работы с БД вы конечно уясните. Главное не зациклится на том, на чем вам дают эти базовые знания, и продолжить изучать современные методики.


Да, уже почитал про sql инъекции, про PDО, хорошая штука, не понимаю почему нам это не преподавать. Нам действительно там дают лишь самую базу. Спасибо за помощь!

(Отредактировано автором: 07 Августа, 2015 - 13:30:03)

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Работа с СУБД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB