Странности с запросом к базе MySQL под Windows

Allan Stark

Новичок
Странности с запросом к базе MySQL под Windows

Есть машина для отладки, Windows XP Проверенная связка последнего релиза РНР5 (PHP Version 5.0.4) и Apache HTTP Server 2.0.54 (знаю что кое-кто не рекомендует 5-ку РНР и 2-ку Апача, но так работает же и прекрасно)...

База, таблица и проч. существует - проверено на запросах ручками. Код скопирован из старого сценария с UNIX машины. Однако там он работает правильно, а здесь - нивкакую.

Код (сокращенный):
+++++++++++++++++++++++++++++
$dblink = mysql_pconnect("localhost", "php", "php") or die("Could not connect, ERROR: " . mysql_error());
mysql_select_db("dbusers", $dblink) or die("Could not select database, ERROR: " . mysql_error());

//Проверяем, может такой клиент уже есть
$dbquery = mysql_query(" SELECT username FROM tusers WHERE username = ' ".$f_username." ' ", $dblink);
$num = mysql_num_rows($dbquery);
if ($num > 0)
{
echo "Такой пользователь уже есть в базе !";
mysql_close($dblink);
exit;
}
else
//Иначе заносим его в базу данных
{
$dbresult = mysql_query("INSERT INTO tusers VALUES (NULL, ' ".$f_username. " ' )'", $dblink);
if ($dbresult) print mysql_affected_rows()." пользователь ".$f_username." добавлен";
mysql_close($dblink);
}
+++++++++++++++++++++++++++++

При этом пользователь добавляется без проблем, а вот проверка на его наличие как ни странно не отрабатывается, хотя при имитации запроса ручками - без проблем...
 

Фанат

oncle terrible
Команда форума
ты слышал когда-нибудь такое слово - отладка программы?
 

Allan Stark

Новичок
Фанат
Ага. В данном случае неправильно отрабатывает ф-ция mysql_num_rows(), которая ничего не возвращает при правильном запросе. Вернее почему-то возвращает 0.

Вот поэтому и вопрос: "А как это ?"
 

alexhemp

Новичок
Allan Stark

Если запрос синтаксически верный, но удовлетворяющих условию данных не было найдено - тогда количество рядов очевидно будет равно 0.
 

Allan Stark

Новичок
А такого быть не может, потому что например при ручном запросе SELECT username FROM tusers WHERE username = "имя пользователя, которое уже точно есть в базе, с правильной сортировкой, даже на английском" выдается правильный результат - "1"
 

Фанат

oncle terrible
Команда форума
вопрос неверный.

скажи, ты действительно считаешь, что кто-то, сидя на этом форуме, в сотнях километров от твоего комппьютера, может ответить, почему у тебя ф-ция mysql_num_rows() возвращает 0?

Раз ты знаешь слово отладка, то ты, должно быть, умный мальчик. поэтому больше не говори никогда таких глупостей.
"Почему функция возвращает" - это не вопрос.
потому, что ответ может быть любой. ПОТОМУ, ЧТО У ТЕБЯ БАЗЫ НИКАКОЙ НЕТУ! И поди докажи, что это не так.

Вопрос должен звучать так: "Как мне продолжить отладку? Научите меня отлаживать скрипты".

И тебя спросят: А ты запрос-то свой, который ноль возвращает, в глаза видел?

-~{}~ 07.09.05 13:27:

Allan Stark
вот, прекрасная иллюстрация моим словам.
тебе дали ответ.
На 100% удовлетворяющий условиям.
Ты спросил - почему ноль. ТЕБЕ ОТВЕТИЛИ!
И винить в том, что ответ тебе не понравился, ты можешь только себя.
Это должно тебя натолкнуть на мысли о том, что
- видимо, вопрос-то не так хорошо сформулирован, как тебе казалось.
- судя по всему, ты явно преувеличиваешь свои таланты в отладке программ, если локализацуия проблемы свелась к вопросу про нум ровс.
 

Allan Stark

Новичок
C:\Documents and Settings\SPhebylsky>mysql -u root -p
Enter password: ***************
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 249 to server version: 5.0.12-beta-nt

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| dbusers |
| mysql |
| test |
+--------------------+
4 rows in set (0.00 sec)

mysql> use dbusers;
Database changed
mysql> show tables;
+-------------------+
| Tables_in_dbusers |
+-------------------+
| tusers |
+-------------------+
1 row in set (0.00 sec)

mysql> describe tusers;
+----------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+------------------+------+-----+---------+----------------+
| userid | int(10) unsigned | NO | PRI | NULL | auto_increment |
| username | char(60) | NO | | | |
+----------+------------------+------+-----+---------+----------------+
2 rows in set (0.02 sec)

mysql> select username from tusers;
+----------+
| username |
+----------+
| ASD |
| ASD |
| ASD |
| ASD |
| ASD |
+----------+
5 rows in set (0.00 sec)

mysql> select username from tusers where username = "ASD";
+----------+
| username |
+----------+
| ASD |
| ASD |
| ASD |
| ASD |
| ASD |
+----------+
5 rows in set (0.00 sec)

================================================
Достаточно ?

-~{}~ 07.09.05 13:30:

php.ini и настройки MySQL выводить ?
 

Фанат

oncle terrible
Команда форума
какая печальная непонятливость.
я тебя не спрашивал, что ты пишешь в консоли.
я тебя спросил очень простой вопрос:
видел ли ты запрос, который возвращает тебе ноль?
или не видел?
 

Cougar

Кошак
Недостаточно. Сильно хочу посмотреть на результат выполнения вот этого:
PHP:
echo " SELECT username FROM tusers WHERE username = ' ".$f_username." ' "
 

Фанат

oncle terrible
Команда форума
php.ini и настройки MySQL выводить ?
за такие вопросы надо бить по рукам.
ты всё ближе продвигаешься к могучему племени ламеров.
одной из особенностей которых является святая вера вера в том, что в неработе их скрипта виноваты настройки, серверы, господь бог, плохие люди из форума. Но только не они сами.

Давай ты, всё-таки, попробуешь найти ОШИБКУ в СВОЁМ скрипте.
а не будешь валить на настройки?
или ХОТЯ БЫ быдешь искать настройку АДРЕСНО.
а не возить носом по сотне строчек.
даже гадалки поступают гуманнее - у них всего 36 карт.
а ты нам предлагаешь задить по сотне настроек.
может, ещё веб-сервер апач тут своими настройками помешал?
 

Allan Stark

Новичок
Автор оригинала: Cougar
Недостаточно. Сильно хочу посмотреть на результат выполнения вот этого:
PHP:
echo " SELECT username FROM tusers WHERE username = ' ".$f_username." ' "
На
echo "SELECT username FROM tusers WHERE username = ' ".$f_username." ' ";

Естественно:

SELECT username FROM tusers WHERE username = ' ASD '
 

Фанат

oncle terrible
Команда форума
поясни пожалуйста смысл этой фразы.
до меня не совсем он дошёл
 

Фанат

oncle terrible
Команда форума
а, вот теперь понятно.
надеюсь, ты действительно это посмотрел, а не сделалд нам одолжение.
подставлял ли ты этот запрос в консоль?
внимание. я сказал ЭТОТ. а не похожий.

-~{}~ 07.09.05 13:43:

ради бога.
никто навязывать помощь не будет.
тем более, что ты и сам не особо горишь себе помочь.
а ждёшь волшебника в голубом вертолёте, который волшебным образом ткнёт волшебной палочкой в твой волшебный скрипт и скажет "исправь здесь".
 

Allan Stark

Новичок
Фанат
"следи за моим движением..." ©

путем copy/paste...

mysql> SELECT username FROM tusers WHERE username = ' ASD ';
+----------+
| username |
+----------+
| ASD |
| ASD |
| ASD |
| ASD |
| ASD |
| ASD |
| ASD |
+----------+
7 rows in set (0.00 sec)
 

Фанат

oncle terrible
Команда форума
...и укажет на опечатку.
судя по сему, дело к тому и идёт =)

А на форуме дяди злые, злые.
Не хотят показать опечатку. В коде, которого они в глаза не видели =)
 

Allan Stark

Новичок
Есть еще один старый фокус с пробелами слева и справа от строки перед запросом. Ессно trim()
Результат тот же. Уже и не знаю где копать...

Ладно, ушел обедать.

-~{}~ 07.09.05 13:51:

Фанат
Злой ты...
 

Фанат

oncle terrible
Команда форума
"следи за моим движением..." ©
чудесно.
за исключением того, что ты должен был сделать это всё сам, до обращения на форум.
А раз ты не сделал, то не надо обижаться на то, что тебя пытаются научить это делать.

И за настройки ты зря обиделся. Единственная, которая может придти в голову - это регистер, будь она неладна, глобалс.
но здесь, как видим, она не при чём.

остаётся, (на первый, во всяком случае, взгляд) два варианта:
1. фатальная ужасная ошибка в софте (мускуль под виндоус).
2. наличие в коде банальной опечатки или неточности.

Я, как человек скромный, всегда думаю про вторую.
И ты знаешь, это сильно облегчает жизнь.
Веь когда думаешь на другого дядю, то расслабляешься и перестаёшь искать свою ошибку.
Если же быть уверенным, что виноват не вредный сот, а ты сам, то опечатка в конце концов находится.

-~{}~ 07.09.05 13:53:

Есть еще один старый фокус с пробелами слева и справа от строки перед запросом. Ессно trim()
нету.
этот фокус виден невооружённым глазом при выполнении запроса в консоли.
будешь спорить?
неправда.
если я говорю то, что тебе не нравится - это совсем не значит, что я злой.

я просто пытаюсь донести до тебя свет истины.
поскольку ты сопротивляешься - тебе кажется ,что я говорю гадости.
 

sal

Новичок
C:\Documents and Settings\SPhebylsky>mysql -u root -p
Enter password: ***************
Тут под "root"
$dblink = mysql_pconnect("localhost", "php", "php") or die("Could not connect, ERROR: " . mysql_error());
тут под "php"

Имхо не совсем чистый эксперементы получается. Что выдает если в консоли под "php" зайти?
 

Allan Stark

Новичок
sal
Вот и та самая распространенная ошибка а-ля человеческий фактор...

mysql> show grants for php;
+-------------------------------------------------------------------------------
---------------------+
| Grants for php@%
|
+-------------------------------------------------------------------------------
---------------------+
| GRANT USAGE ON *.* TO 'php'@'%' IDENTIFIED BY PASSWORD '*8F5FF90079BC601F8EA7C
148475658E65A0C029D' |
| GRANT INSERT, UPDATE, DELETE ON `dbusers`.* TO 'php'@'%'
|
+-------------------------------------------------------------------------------
---------------------+
2 rows in set (0.00 sec)

Решаем:
mysql> grant select on dbusers.* to php identified by 'php';
Query OK, 0 rows affected (0.00 sec)

Сценарий заработал.

Всем СПАСИБО !

2Фанат
Говоришь, синтаксис в консоли... ;-)

И напоследок насчет платформы, на которой это все сооружается - это все к заказчику, да к его админу... От меня НЕ зависит, увы...
 
Сверху