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

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

1. master_alf - 28 Декабря, 2012 - 08:20:56 - перейти к сообщению
Приветствую.
Вопрос у меня довольно странный... потому придется сначала небольшое вступление написать.

Пару лет назад была необходимость написать базу данных, программировать тогда я не умел. Совсем. Опыт был "в школе на дельфях"... так что уровень сами понимаете. 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 стоял какой-то параметр, из-за которого всё работало. Есть ли варианты куда копать?
2. Toxa - 28 Декабря, 2012 - 08:27:25 - перейти к сообщению
А я объясню. Тут передается 2 обязательных параметра, поэтому все работает

Другой разговор, что вторым параметром должно быть целое число, ну так в php срабатывает приведение типов если я правильно понял. То есть строка "pass" преобразуется в число 0, другими словами везде вторым аргументом передается ноль, поэтому и работает.
3. master_alf - 28 Декабря, 2012 - 08:45:06 - перейти к сообщению
Я тоже подозреваю, что поле интерпретировалось как индекс... но почему оно перестало работать на новом серваке?.. вопрос-то собственно в этом. Хотелось бы "вернуть как было", что б свой срок просто база доработала с той отлаженной логикой, которая была и проверена временем. А то если полезут новые косяки... я рехнусь их разгребать.
4. Zuldek - 28 Декабря, 2012 - 08:53:44 - перейти к сообщению
Toxa пишет:
То есть строка "pass" преобразуется в число 0,

upd. прошу прощение, - утро Недовольство, огорчение
Конечно, "pass" будет приведено к 0, ведь начинается не с числового символа.
5. master_alf - 28 Декабря, 2012 - 09:20:55 - перейти к сообщению
Ребят, это обсуждение не совсем того, о чем я спрашивал.
Вопрос - как заставить PHP воспринимать такой код как раньше?
6. Zuldek - 28 Декабря, 2012 - 09:23:00 - перейти к сообщению
Как это не о том. Передайте
mysql_result($tempQRY, 0)
и посмотрите что получится
7. master_alf - 28 Декабря, 2012 - 09:36:43 - перейти к сообщению
Дык я уже пофиксил, сейчас этот кусок работает. Но хотелось бы, что б работал старый вариант, т.к. неизвестно сколько еще подобных глупостей я допустил... и, если с логина всё начинается, и там баг видно сразу, то некоторые могут проявляться в таких... хитрых случаях, что будет кучка гемора в работе с базой, и с поимкой этих багов...
8. Zuldek - 28 Декабря, 2012 - 09:40:11 - перейти к сообщению
mysql_result($tempQRY, "pass")
точно так?
Может быть не строкой передается, а например, переменную, думая что это строка "pass"?
mysql_result($tempQRY, $pass)
9. master_alf - 28 Декабря, 2012 - 09:55:33 - перейти к сообщению
Код я скопировал из рабочего файла - это именно строковый параметр. Не переменная, не константа и т.д. Просто строка.
10. Zuldek - 28 Декабря, 2012 - 10:04:51 - перейти к сообщению
мне не известны параметры настроек интерпритатора, которые бы повлияли на приведение типов.
Следовательно всегда передавайте 0 и будет возвращаться первая строка результата.
Возможно вам выдавался какой-то warning на боевом сервере, когда вы не передавали числовой параметр в функцию, что нарушало выполнение дальнейшего сценария потому что вы не ожидали вывода.
Если это так, отключите вывод ошибок. Но вообще, - приводить код в порядок по той причине что лень и долго и по этой причине говнокодить - подход не правильный.
11. master_alf - 28 Декабря, 2012 - 10:25:36 - перейти к сообщению
Про параметры - понятно, возможно, тогда, различие в самих версиях PHP... Значит придется ждать появления возможных багов да фиксить...

Код же приводить в порядок не просто лень, а не целесообразно. Гораздо быстрее переписать с нуля, чем разгребать эти завалы. Опыта не было вообще, ни в ООП, ни в MVC, который не соблюдал, ни в других полезных штуках, которые делают код правильным.
Но есть другие задачи, которые нельзя отложить на исправление программы которая работает, но "внутри всё не красиво". Потому временно приходится искать костыли. Я не любитель говнокода, то были "ошибки молодости". Просто переписать нет времени.
12. sKaa - 28 Декабря, 2012 - 10:32:50 - перейти к сообщению
Цитирую из мануала :
CODE (htmlphp):
скопировать код в буфер обмена
  1. С версии PHP 5.3.0 эта функция считается УСТАРЕВШЕЙ. Крайне не рекомендуется полагаться на эту возможность.


Так, что всё зависит ещё от того, насколько новая у вас версия php на данный момент. Может вас ещё и ошибками DEPRECATED засыпать начнет.. Их придется тоже "прятать" )))
13. Zuldek - 28 Декабря, 2012 - 10:34:07 - перейти к сообщению
Временные затраты на выпиливание костыля и выявление причины по которой не работает древняя функция может быть больше времени нужного для замены всего одной функции во всем скрипте, какой бы большой он не был, учитывая что можно использовать замену по формуле и среда разработки, либо Gedit сделает все за вас, но решать вам.
14. sKaa - 28 Декабря, 2012 - 10:41:34 - перейти к сообщению
Zuldek, погодите ещё, вот выпилят полностью mysql_, форумы засыпаны будут подобными вопросами.
15. Zuldek - 28 Декабря, 2012 - 10:43:42 - перейти к сообщению
sKaa пишет:
Zuldek, погодите ещё, вот выпилят полностью mysql_, форумы засыпаны будут подобными вопросами.


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

 

Powered by ExBB FM 1.0 RC1