Forum Webscript.Ru

Программирование => PHP => Тема начата: Druggy от 14 Апреля 2005, 17:15:59

Название: Помогите разобраться со скриптом
Отправлено: Druggy от 14 Апреля 2005, 17:15:59
есть скрипт:


$username = empty($_POST[\'username\']) ?null: $_POST[\'username\'];
$passwd = empty($_POST[\'passwd\']) ?null: $_POST[\'passwd\'];
$action_keeper = empty($_POST[\'action_keeper\']) ?null: $_POST[\'action_keeper\'];



function display_form()
{
?>


Имя пользователя

Пароль



}



if ($action_keeper != \'login\')
{
display_form();
}
else
{
if (!$username or !$passwd)
{
print \'Вы ввели не все необходимые для авторизации данные.\';
display_form();
}
else
{
$db_conn = mysql_connect(\'localhost\', \'db_login\', \'db_password\');
mysql_select_db(\'base\');
$query = "select * from users where username=\'$username\' and passwd = password(\'$passwd\')";
$result = mysql_query($query);
if(!$result)
{
print \'Невозможно выполнить запрос к базе данных.\';
display_form();
exit;
}
if (mysql_num_rows($result) > 0)
print \'Вы вошли
Скрытая информация.\';
else
{
print \'Вы не вошли
\';
display_form();
}
}
}

?>

в базе данных имя пользователя: username и пароль в зашифрованом виде: password.

Функция все время выводит мне: Невозможно выполнить запрос к базе данных.
В логах: PHP Warning:  mysql_num_rows(): supplied argument is not a valid MySQL result resource in d:\\\\Server\\\\www\\\\system\\\\cpanel\\\\index.php on line 34\\n

причем если хранить пароль в базе в незашифрованом виде и использовать запрос: "select * from users where username=\'$username\' and passwd = \'$passwd\'", то все замечательно работает...

Подскажите пожалуйста где кроется моя ошибка!
Название: Помогите разобраться со скриптом
Отправлено: Croaker от 14 Апреля 2005, 17:36:37
Цитировать
Druggy:
В логах: PHP Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in d:\\\\Server\\\\www\\\\system\\\\cpanel\\\\index.php on line 34\\n


Этот варнинг возникает тогда, когда у вас !$result и выполняется блок:

if (mysql_num_rows($result) > 0)
                print \'Вы вошли
Скрытая информация.\';


Прямого отношения он к проблеме не имеет.

Цитировать
Druggy:
Подскажите пожалуйста где кроется моя ошибка!


Вам надо вывести SQL запрос на экран, скоприровать его, вставить в консоль MySQL или PhpMyAdmin или что-там у вас, и посмотреть, что выдаст MySQL.
Название: Помогите разобраться со скриптом
Отправлено: Меняздесьдавнонет от 14 Апреля 2005, 19:54:36
можно просто mysql_error() вывести

Druggy , рекомендую прочитать: PHP FAQ: Ничего не работает! Что делать??? (http://phpfaq.ru/debug)
Название: Помогите разобраться со скриптом
Отправлено: Druggy от 15 Апреля 2005, 04:25:05
Делаю запрос через MySQL монитор:

запрос следующий: select * from users where username=\'username\' and passwd=password(\'password\');

Ответ MySQL: ERROR 1267 (HY000): Illegal mix of collations (cp1251_general_cs,IMPLICIT) and (
latin1_swedish_ci,COERCIBLE) for operation \'=\'



Делаю запрос через phpMyAdmin:

запрос следующий: select * from users where username=\'username\' and passwd=password(\'password\');

Ответ MySQL: empty set (0.00 sec)



Вот sql операторы при помощи которых делаю базу:

DROP DATABASE IF EXISTS base;
CREATE DATABASE base;
ALTER DATABASE `base` DEFAULT CHARACTER SET cp1251 COLLATE cp1251_general_cs;
USE base;
DROP TABLE IF EXISTS users;
CREATE TABLE users
(
   username   CHAR(16) NOT NULL PRIMARY KEY,
   passwd      CHAR(16) NOT NULL
);
GRANT SELECT, INSERT, UPDATE, DELETE
ON base.*
TO db_login@localhost IDENTIFIED BY \'db_password\';



Видимо где-то я чего-то невижу или не понимаю...
Название: Помогите разобраться со скриптом
Отправлено: Меняздесьдавнонет от 15 Апреля 2005, 09:30:08
Цитировать
Druggy:
ALTER DATABASE `base` DEFAULT CHARACTER SET cp1251 COLLATE cp1251_general_cs;

а это зачем?
Название: Помогите разобраться со скриптом
Отправлено: Druggy от 15 Апреля 2005, 12:06:02
кодировка базы + кодировка в которой сравнивать... разве не надо? ж)
Название: Помогите разобраться со скриптом
Отправлено: Меняздесьдавнонет от 15 Апреля 2005, 12:19:22
вообще, я думаю, тебе надо смотреть описание ошибки в документации по mysql
да и вообще - с тех пор, как ты выяснил ,в чём ошибка, выяснилось, чт о пхп тут совсем не при чём.
Название: Помогите разобраться со скриптом
Отправлено: Druggy от 15 Апреля 2005, 12:33:58
убрал ALTER DATABASE `base` DEFAULT CHARACTER SET cp1251 COLLATE cp1251_general_cs;



Вот значит вопрос всеравно имеет место:
Случай номер один:

Создаю базу используя операторы:
DROP DATABASE IF EXISTS base;
CREATE DATABASE base;
USE base;
DROP TABLE IF EXISTS users;
CREATE TABLE users
(
   username   CHAR(16) NOT NULL PRIMARY KEY,
   passwd      CHAR(16) NOT NULL
);
INSERT INTO users(username, passwd)
      VALUES(\'username\', \'password\');
GRANT SELECT, INSERT, UPDATE, DELETE
ON base.*
TO db_login@localhost IDENTIFIED BY \'db_password\';

Сценарий такой:


$username = empty($_POST[\'username\']) ?null: $_POST[\'username\'];
$passwd = empty($_POST[\'passwd\']) ?null: $_POST[\'passwd\'];
$action_keeper = empty($_POST[\'action_keeper\']) ?null: $_POST[\'action_keeper\'];



function display_form()
{
?>


Имя пользователя

Пароль



  }



if ($action_keeper != \'login\')
{
display_form();
}
else
{
if (!$username or !$passwd)
{
print \'Вы ввели не все необходимые для авторизации данные.\';
display_form();
}
else
{
$db_conn = mysql_connect(\'localhost\', \'hFdb48H3La5HJf1k\', \'q2hj56rG6RDstx7p\');
mysql_select_db(\'ion\');
$query = "select * from users where username=\'$username\' and passwd=\'$passwd\'";
$result = mysql_query($query);
if(!$result)
{
print \'Невозможно выполнить запрос к базе данных.\';
display_form();
exit;
}
if (mysql_num_rows($result) > 0)
print \'Вы вошли
Скрытая информация.\';
else
{
print \'Вы не вошли
\';
display_form();
}
}
}

?>


Ввожу нужную информацию - все работает, ввожу неправильно или не ввожу вовсе - выдает ошибки, которые нужно, типа там "не ввели"/"не вошли"... одним словом все хорошо, только вот пароль в базе данных храниться в незашифрованом виде.


Пытаемся его там зашифровать (Случай номер два):

Создаю базу используя операторы:
DROP DATABASE IF EXISTS base;
CREATE DATABASE base;
USE base;
DROP TABLE IF EXISTS users;
CREATE TABLE users
(
   username   CHAR(16) NOT NULL PRIMARY KEY,
   passwd      CHAR(16) NOT NULL
);
INSERT INTO users(username, passwd)
      VALUES(\'username\', password(\'password\'));
GRANT SELECT, INSERT, UPDATE, DELETE
ON base.*
TO db_login@localhost IDENTIFIED BY \'db_password\';

Сценарий такой:


$username = empty($_POST[\'username\']) ?null: $_POST[\'username\'];
$passwd = empty($_POST[\'passwd\']) ?null: $_POST[\'passwd\'];
$action_keeper = empty($_POST[\'action_keeper\']) ?null: $_POST[\'action_keeper\'];



function display_form()
{
?>


Имя пользователя

Пароль



  }



if ($action_keeper != \'login\')
{
display_form();
}
else
{
if (!$username or !$passwd)
{
print \'Вы ввели не все необходимые для авторизации данные.\';
display_form();
}
else
{
$db_conn = mysql_connect(\'localhost\', \'hFdb48H3La5HJf1k\', \'q2hj56rG6RDstx7p\');
mysql_select_db(\'ion\');
$query = "select * from users where username=\'$username\' and passwd=password(\'$passwd\')";
$result = mysql_query($query);
if(!$result)
{
print \'Невозможно выполнить запрос к базе данных.\';
display_form();
exit;
}
if (mysql_num_rows($result) > 0)
print \'Вы вошли
Скрытая информация.\';
else
{
print \'Вы не вошли
\';
display_form();
}
}
}

?>


Неработает, пишет все время что не вошли.

Ввожу запрос "select * from users where username=\'username\' and passwd=password(\'password\');" напрямую, через MySQL монитор.
Ответ MySQL: Empty set (0.00 sec)


Люди вы же умные! подскажите! ж))))
А то я уже совсем ничего не понимаю...
Название: Помогите разобраться со скриптом
Отправлено: Croaker от 15 Апреля 2005, 13:12:53
Если у тебя
Цитировать
Druggy:
Empty set

есть вероятность, что такой связки (логин + password(\'пароль\')) просто нету.

Ты как пользователя добавляешь?
Название: Помогите разобраться со скриптом
Отправлено: Druggy от 15 Апреля 2005, 13:35:46
Цитировать
Croaker:
Ты как пользователя добавляешь?

INSERT INTO users(username, passwd)
VALUES(\'username\', password(\'password\'));
Название: Помогите разобраться со скриптом
Отправлено: Druggy от 15 Апреля 2005, 13:37:37
через MySQL монитор, через импорт .sql файла все темже MySQL монитором, могу из сценария создать... результат всегда один и тот же... блин.
Название: Помогите разобраться со скриптом
Отправлено: Croaker от 15 Апреля 2005, 13:42:51
Druggy
Тогда попробуйте запрос детально разобрать.

SELECT * FROM users where username = "user";

Потом возьмите пароль user`а и руками введите такой запрос:

SELECT password(\'пароль user`а\');
Название: Помогите разобраться со скриптом
Отправлено: Druggy от 15 Апреля 2005, 13:51:12
блин теперь он мне на запрос select * from users where username=\'name\' and passwd=password(\'pass\');
выдает следующее сообщение об ошибке:
ERROR 1267 (HY000): Illegal mix of collations (cp1251_general_ci,IMPLICIT) and (latin1_swedish_ci,COERCIBLE) for operation \'=\'
Название: Помогите разобраться со скриптом
Отправлено: Croaker от 15 Апреля 2005, 13:57:11
Ну дык вот тебе и ошибка. Данные в одной кодировке сравниваются с данными в другой.

http://lingvo.yandex.ru
Название: Помогите разобраться со скриптом
Отправлено: Druggy от 15 Апреля 2005, 14:14:07
я понимаю. просто не знаю как это исправить.
как я понимаю данные которые ввожу всетаки находятся в кодировке cp1251_general_ci, IMPLICIT, а то что лежит в базе находится в кодировке latin1_swedish_ci,COERCIBLE, так ведь? И как все сделать чтобы в одной кодировке работало?
Блин вообще не понимаю уже ничего. сколько часов одну это херню делаю =))) крыша едет! )))
Название: Помогите разобраться со скриптом
Отправлено: Croaker от 15 Апреля 2005, 14:21:17
Druggy
google (http://www.google.ru/search?q=%D0%BA%D0%BE%D0%B4%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0+MySQL&sourceid=mozilla-search&start=0&start=0&ie=utf-8&oe=utf-8&client=firefox-a&rls=org.mozilla:ru-RU:official)
Название: Помогите разобраться со скриптом
Отправлено: Druggy от 15 Апреля 2005, 14:22:00
блин может у меня с кодировками что не так?
в конфигурационном файле такая строка:
default-character-set=cp1251

запустил phpMyAdmin
он вот что показывает:
 MySQL-кодировка:  UTF-8 Unicode (utf8)
 Сопоставление соединения с MySQL: cp1251_general_cs

... ???
Название: Помогите разобраться со скриптом
Отправлено: Croaker от 15 Апреля 2005, 14:25:40
Druggy
MySQL на Windows или на Unix?
Название: Помогите разобраться со скриптом
Отправлено: Druggy от 15 Апреля 2005, 14:26:05
на винде.
Название: Помогите разобраться со скриптом
Отправлено: Croaker от 15 Апреля 2005, 14:45:21
Druggy
Что в файле my.cnf сказано по поводу кодировок?
Название: Помогите разобраться со скриптом
Отправлено: Druggy от 15 Апреля 2005, 14:46:25
default-character-set=cp1251
Название: Помогите разобраться со скриптом
Отправлено: Croaker от 15 Апреля 2005, 14:54:54
Druggy
А скажи пожалуйста, как получается, что у тебя данные в latin1_swedish_ci,COERCIBLE добавляются? У тебя сайт в какой кодировке?
Название: Помогите разобраться со скриптом
Отправлено: Druggy от 15 Апреля 2005, 15:06:01
А вот хрен его знает, как они так получаются.
в htm


может что с этим не так:
запустил phpMyAdmin
он вот что показывает:
MySQL-кодировка: UTF-8 Unicode (utf8)
Сопоставление соединения с MySQL: cp1251_general_cs
Название: Помогите разобраться со скриптом
Отправлено: Croaker от 15 Апреля 2005, 15:08:49
попробуйте запускать mysql с ключом:

--default-character-set=cp1251
Название: Помогите разобраться со скриптом
Отправлено: Druggy от 15 Апреля 2005, 15:15:30
делаю запрос  select * from users where username=\'name\' - все хорошо.
делаю запрос  select * from users where passwd=password(\'pass\') - сообщает об ошибке: ERROR 1267 (HY000): Illegal mix of collations (cp1251_general_cs,IMPLICIT) and (latin1_swedish_ci,COERCIBLE) for operation \'=\'.