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 :: mysql_result работает не по документации. Подробности внутри.

 PHP.SU

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


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

> Без описания
master_alf
Отправлено: 28 Декабря, 2012 - 08:20:56
Post Id


Новичок


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


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




Приветствую.
Вопрос у меня довольно странный... потому придется сначала небольшое вступление написать.

Пару лет назад была необходимость написать базу данных, программировать тогда я не умел. Совсем. Опыт был "в школе на дельфях"... так что уровень сами понимаете. PHP не знал... в общем писал как получится. Потому всё работает, но уже давно "не понятно как". Намедни умер сервер, и при его восстановлении у меня теперь новая версия PHP, перенес я старую базу, и вдруг вылез первый косяк - пользователи не могли пройти авторизацию. Дебагинг показал где проблема. Мой код, который работал раньше, выглядит вот так:

PHP:
скопировать код в буфер обмена
  1. $tempQRY = mysql_query("SELECT pass FROM users WHERE login = '".$login."'")     or die(mysql_error());
  2. return(mysql_result($tempQRY, "pass"));

Т.е. у меня был пропущен второй обязательный параметр функции mysql_result (индекс строки) - глянув на документацию я крайне удивился, как оно вообще работало ... но факт есть факт - работало! И сейчас на локальной машине - работает...

А вот и сам вопрос: Что можно сделать, что бы заставить эту функцию работать как раньше - с нарушением документации?
Понимаю, что это плохо, что за это надо бить по рукам и т.д. Но база написана криво, править её - бред. Там нужно просто писать по-новой. И сейчас не известно где еще какие косяки могут повылазить... исправлять по всему коду вызов mysql_result - конечно можно, но нет гарантии, что это единственная функция, где я так накосячил... В общем - есть ли у вас, господа, идеи, в чем причина работоспособности подобной опечатки?
Всегда, когда я вызывал mysql_result - была одна строка в результате mysql. Я так подозреваю, что где-то в PHP.ini стоял какой-то параметр, из-за которого всё работало. Есть ли варианты куда копать?
 
 Top
Toxa
Отправлено: 28 Декабря, 2012 - 08:27:25
Post Id



Посетитель


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


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

[+]


А я объясню. Тут передается 2 обязательных параметра, поэтому все работает

Другой разговор, что вторым параметром должно быть целое число, ну так в php срабатывает приведение типов если я правильно понял. То есть строка "pass" преобразуется в число 0, другими словами везде вторым аргументом передается ноль, поэтому и работает.


-----
Удобный сервис для хранения файлов
 
 Top
master_alf
Отправлено: 28 Декабря, 2012 - 08:45:06
Post Id


Новичок


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


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




Я тоже подозреваю, что поле интерпретировалось как индекс... но почему оно перестало работать на новом серваке?.. вопрос-то собственно в этом. Хотелось бы "вернуть как было", что б свой срок просто база доработала с той отлаженной логикой, которая была и проверена временем. А то если полезут новые косяки... я рехнусь их разгребать.
 
 Top
Zuldek
Отправлено: 28 Декабря, 2012 - 08:53:44
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2122
Дата рег-ции: Июнь 2010  


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




Toxa пишет:
То есть строка "pass" преобразуется в число 0,

upd. прошу прощение, - утро Недовольство, огорчение
Конечно, "pass" будет приведено к 0, ведь начинается не с числового символа.

(Отредактировано автором: 28 Декабря, 2012 - 09:34:23)

 
 Top
master_alf
Отправлено: 28 Декабря, 2012 - 09:20:55
Post Id


Новичок


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


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




Ребят, это обсуждение не совсем того, о чем я спрашивал.
Вопрос - как заставить PHP воспринимать такой код как раньше?
 
 Top
Zuldek
Отправлено: 28 Декабря, 2012 - 09:23:00
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2122
Дата рег-ции: Июнь 2010  


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




Как это не о том. Передайте
mysql_result($tempQRY, 0)
и посмотрите что получится
 
 Top
master_alf
Отправлено: 28 Декабря, 2012 - 09:36:43
Post Id


Новичок


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


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




Дык я уже пофиксил, сейчас этот кусок работает. Но хотелось бы, что б работал старый вариант, т.к. неизвестно сколько еще подобных глупостей я допустил... и, если с логина всё начинается, и там баг видно сразу, то некоторые могут проявляться в таких... хитрых случаях, что будет кучка гемора в работе с базой, и с поимкой этих багов...
 
 Top
Zuldek
Отправлено: 28 Декабря, 2012 - 09:40:11
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2122
Дата рег-ции: Июнь 2010  


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




mysql_result($tempQRY, "pass")
точно так?
Может быть не строкой передается, а например, переменную, думая что это строка "pass"?
mysql_result($tempQRY, $pass)
 
 Top
master_alf
Отправлено: 28 Декабря, 2012 - 09:55:33
Post Id


Новичок


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


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




Код я скопировал из рабочего файла - это именно строковый параметр. Не переменная, не константа и т.д. Просто строка.
 
 Top
Zuldek
Отправлено: 28 Декабря, 2012 - 10:04:51
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2122
Дата рег-ции: Июнь 2010  


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




мне не известны параметры настроек интерпритатора, которые бы повлияли на приведение типов.
Следовательно всегда передавайте 0 и будет возвращаться первая строка результата.
Возможно вам выдавался какой-то warning на боевом сервере, когда вы не передавали числовой параметр в функцию, что нарушало выполнение дальнейшего сценария потому что вы не ожидали вывода.
Если это так, отключите вывод ошибок. Но вообще, - приводить код в порядок по той причине что лень и долго и по этой причине говнокодить - подход не правильный.

(Отредактировано автором: 28 Декабря, 2012 - 10:06:09)

 
 Top
master_alf
Отправлено: 28 Декабря, 2012 - 10:25:36
Post Id


Новичок


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


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




Про параметры - понятно, возможно, тогда, различие в самих версиях PHP... Значит придется ждать появления возможных багов да фиксить...

Код же приводить в порядок не просто лень, а не целесообразно. Гораздо быстрее переписать с нуля, чем разгребать эти завалы. Опыта не было вообще, ни в ООП, ни в MVC, который не соблюдал, ни в других полезных штуках, которые делают код правильным.
Но есть другие задачи, которые нельзя отложить на исправление программы которая работает, но "внутри всё не красиво". Потому временно приходится искать костыли. Я не любитель говнокода, то были "ошибки молодости". Просто переписать нет времени.
 
 Top
sKaa
Отправлено: 28 Декабря, 2012 - 10:32:50
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 979
Дата рег-ции: Окт. 2011  
Откуда: Россия г. Нижний Новгород


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

[+]


Цитирую из мануала :
CODE (htmlphp):
скопировать код в буфер обмена
  1. С версии PHP 5.3.0 эта функция считается УСТАРЕВШЕЙ. Крайне не рекомендуется полагаться на эту возможность.


Так, что всё зависит ещё от того, насколько новая у вас версия php на данный момент. Может вас ещё и ошибками DEPRECATED засыпать начнет.. Их придется тоже "прятать" )))
 
 Top
Zuldek
Отправлено: 28 Декабря, 2012 - 10:34:07
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2122
Дата рег-ции: Июнь 2010  


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




Временные затраты на выпиливание костыля и выявление причины по которой не работает древняя функция может быть больше времени нужного для замены всего одной функции во всем скрипте, какой бы большой он не был, учитывая что можно использовать замену по формуле и среда разработки, либо Gedit сделает все за вас, но решать вам.
 
 Top
sKaa
Отправлено: 28 Декабря, 2012 - 10:41:34
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 979
Дата рег-ции: Окт. 2011  
Откуда: Россия г. Нижний Новгород


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

[+]


Zuldek, погодите ещё, вот выпилят полностью mysql_, форумы засыпаны будут подобными вопросами.
 
 Top
Zuldek
Отправлено: 28 Декабря, 2012 - 10:43:42
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2122
Дата рег-ции: Июнь 2010  


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




sKaa пишет:
Zuldek, погодите ещё, вот выпилят полностью mysql_, форумы засыпаны будут подобными вопросами.


Её не выпилят ещё лет 5 как минимум. Заявят, что устаревшая, но поддержка все равно останется, даже если будет кидать варнинги, все равно все будут использовать.
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Работа с СУБД »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB