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
Форумы портала PHP.SU :: Версия для печати :: Не могу отправить данные в БД
Форумы портала PHP.SU » » Работа с СУБД » Не могу отправить данные в БД

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

1. Yan9 - 06 Августа, 2015 - 19:15:43 - перейти к сообщению
Добрый день! Пишу обработчик для формы, в которую пользователь вносит логин, пароль. Создаю запрос в БД для проверки существующего пароля, если такого нет, то вносим новые данные, все работает, запрос выглядит так:
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):
скопировать код в буфер обмена

то на экране:
CODE (htmlphp):
скопировать код в буфер обмена
  1. Query was empty

Если пишу:
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'");
2. DelphinPRO - 06 Августа, 2015 - 19:32:07 - перейти к сообщению
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. }
3. Yan9 - 06 Августа, 2015 - 19:50:07 - перейти к сообщению
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);
Или я вообще что-то не то сделал?
4. DelphinPRO - 06 Августа, 2015 - 20:48:34 - перейти к сообщению
Это данные для подключения к БД (форма тут не при чем)
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
5. Yan9 - 06 Августа, 2015 - 21:53:19 - перейти к сообщению
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'");
6. DelphinPRO - 06 Августа, 2015 - 22:02:37 - перейти к сообщению
Использование функций mysql_* ваша ошибка. Они сильно устарели и уже удалены из последней версии PHP

Именно ваша ошибка была не в php, а в sql синтаксисе. Я намерено об этом умолчал.
При использовании PDO, а именно параметризированных запросов (как в моем примере), подобной ошибки бы не возникло, и кроме того, защитило бы ваш код от sql-инъекций.
7. Yan9 - 06 Августа, 2015 - 22:28:57 - перейти к сообщению
DelphinPRO пишет:
Использование функций mysql_* ваша ошибка. Они сильно устарели и уже удалены из последней версии PHP

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


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

Охренеть... Что за курсы такие... Попробуйте у преподавателя курсов поинтересоваться, слышал ли он что-нибудь о PDO
9. Yan9 - 07 Августа, 2015 - 00:12:49 - перейти к сообщению
DelphinPRO пишет:
Yan9 пишет:
Я хожу на курсы по php и этот обработчик был частью д/з.

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


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

ага, лет на 10, если не больше.
В принципе базовые принципы работы с БД вы конечно уясните. Главное не зациклится на том, на чем вам дают эти базовые знания, и продолжить изучать современные методики.
11. Yan9 - 07 Августа, 2015 - 13:18:12 - перейти к сообщению
DelphinPRO пишет:
Yan9 пишет:
похоже знания, которые мне даются, отсталые

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


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

 

Powered by ExBB FM 1.0 RC1