Forum Webscript.Ru
Программирование => PHP => Тема начата: 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\'", то все замечательно работает...
Подскажите пожалуйста где кроется моя ошибка!
-
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.
-
можно просто mysql_error() вывести
Druggy , рекомендую прочитать: PHP FAQ: Ничего не работает! Что делать??? (http://phpfaq.ru/debug)
-
Делаю запрос через 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\';
Видимо где-то я чего-то невижу или не понимаю...
-
Druggy:
ALTER DATABASE `base` DEFAULT CHARACTER SET cp1251 COLLATE cp1251_general_cs;
а это зачем?
-
кодировка базы + кодировка в которой сравнивать... разве не надо? ж)
-
вообще, я думаю, тебе надо смотреть описание ошибки в документации по mysql
да и вообще - с тех пор, как ты выяснил ,в чём ошибка, выяснилось, чт о пхп тут совсем не при чём.
-
убрал 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)
Люди вы же умные! подскажите! ж))))
А то я уже совсем ничего не понимаю...
-
Если у тебя
Druggy:
Empty set
есть вероятность, что такой связки (логин + password(\'пароль\')) просто нету.
Ты как пользователя добавляешь?
-
Croaker:
Ты как пользователя добавляешь?
INSERT INTO users(username, passwd)
VALUES(\'username\', password(\'password\'));
-
через MySQL монитор, через импорт .sql файла все темже MySQL монитором, могу из сценария создать... результат всегда один и тот же... блин.
-
Druggy
Тогда попробуйте запрос детально разобрать.
SELECT * FROM users where username = "user";
Потом возьмите пароль user`а и руками введите такой запрос:
SELECT password(\'пароль user`а\');
-
блин теперь он мне на запрос 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 \'=\'
-
Ну дык вот тебе и ошибка. Данные в одной кодировке сравниваются с данными в другой.
http://lingvo.yandex.ru
-
я понимаю. просто не знаю как это исправить.
как я понимаю данные которые ввожу всетаки находятся в кодировке cp1251_general_ci, IMPLICIT, а то что лежит в базе находится в кодировке latin1_swedish_ci,COERCIBLE, так ведь? И как все сделать чтобы в одной кодировке работало?
Блин вообще не понимаю уже ничего. сколько часов одну это херню делаю =))) крыша едет! )))
-
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)
-
блин может у меня с кодировками что не так?
в конфигурационном файле такая строка:
default-character-set=cp1251
запустил phpMyAdmin
он вот что показывает:
MySQL-кодировка: UTF-8 Unicode (utf8)
Сопоставление соединения с MySQL: cp1251_general_cs
... ???
-
Druggy
MySQL на Windows или на Unix?
-
на винде.
-
Druggy
Что в файле my.cnf сказано по поводу кодировок?
-
default-character-set=cp1251
-
Druggy
А скажи пожалуйста, как получается, что у тебя данные в latin1_swedish_ci,COERCIBLE добавляются? У тебя сайт в какой кодировке?
-
А вот хрен его знает, как они так получаются.
в htm
может что с этим не так:
запустил phpMyAdmin
он вот что показывает:
MySQL-кодировка: UTF-8 Unicode (utf8)
Сопоставление соединения с MySQL: cp1251_general_cs
-
попробуйте запускать mysql с ключом:
--default-character-set=cp1251
-
делаю запрос 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 \'=\'.