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 работает не по документации. Подробности внутри.
Покинул форум
Сообщений всего: 20
Дата рег-ции: Авг. 2011
Помог: 0 раз(а)
Приветствую.
Вопрос у меня довольно странный... потому придется сначала небольшое вступление написать.
Пару лет назад была необходимость написать базу данных, программировать тогда я не умел. Совсем. Опыт был "в школе на дельфях"... так что уровень сами понимаете. PHP не знал... в общем писал как получится. Потому всё работает, но уже давно "не понятно как". Намедни умер сервер, и при его восстановлении у меня теперь новая версия PHP, перенес я старую базу, и вдруг вылез первый косяк - пользователи не могли пройти авторизацию. Дебагинг показал где проблема. Мой код, который работал раньше, выглядит вот так:
Т.е. у меня был пропущен второй обязательный параметр функции mysql_result (индекс строки) - глянув на документацию я крайне удивился, как оно вообще работало ... но факт есть факт - работало! И сейчас на локальной машине - работает...
А вот и сам вопрос: Что можно сделать, что бы заставить эту функцию работать как раньше - с нарушением документации?
Понимаю, что это плохо, что за это надо бить по рукам и т.д. Но база написана криво, править её - бред. Там нужно просто писать по-новой. И сейчас не известно где еще какие косяки могут повылазить... исправлять по всему коду вызов mysql_result - конечно можно, но нет гарантии, что это единственная функция, где я так накосячил... В общем - есть ли у вас, господа, идеи, в чем причина работоспособности подобной опечатки?
Всегда, когда я вызывал mysql_result - была одна строка в результате mysql. Я так подозреваю, что где-то в PHP.ini стоял какой-то параметр, из-за которого всё работало. Есть ли варианты куда копать?
Toxa
Отправлено: 28 Декабря, 2012 - 08:27:25
Посетитель
Покинул форум
Сообщений всего: 352
Дата рег-ции: Окт. 2008
Помог: 8 раз(а)
[+]
А я объясню. Тут передается 2 обязательных параметра, поэтому все работает
Другой разговор, что вторым параметром должно быть целое число, ну так в php срабатывает приведение типов если я правильно понял. То есть строка "pass" преобразуется в число 0, другими словами везде вторым аргументом передается ноль, поэтому и работает.
Покинул форум
Сообщений всего: 20
Дата рег-ции: Авг. 2011
Помог: 0 раз(а)
Я тоже подозреваю, что поле интерпретировалось как индекс... но почему оно перестало работать на новом серваке?.. вопрос-то собственно в этом. Хотелось бы "вернуть как было", что б свой срок просто база доработала с той отлаженной логикой, которая была и проверена временем. А то если полезут новые косяки... я рехнусь их разгребать.
Zuldek
Отправлено: 28 Декабря, 2012 - 08:53:44
Постоянный участник
Покинул форум
Сообщений всего: 2122
Дата рег-ции: Июнь 2010
Помог: 50 раз(а)
Toxa пишет:
То есть строка "pass" преобразуется в число 0,
upd. прошу прощение, - утро
Конечно, "pass" будет приведено к 0, ведь начинается не с числового символа.
Покинул форум
Сообщений всего: 20
Дата рег-ции: Авг. 2011
Помог: 0 раз(а)
Ребят, это обсуждение не совсем того, о чем я спрашивал.
Вопрос - как заставить PHP воспринимать такой код как раньше?
Zuldek
Отправлено: 28 Декабря, 2012 - 09:23:00
Постоянный участник
Покинул форум
Сообщений всего: 2122
Дата рег-ции: Июнь 2010
Помог: 50 раз(а)
Как это не о том. Передайте
mysql_result($tempQRY, 0)
и посмотрите что получится
master_alf
Отправлено: 28 Декабря, 2012 - 09:36:43
Новичок
Покинул форум
Сообщений всего: 20
Дата рег-ции: Авг. 2011
Помог: 0 раз(а)
Дык я уже пофиксил, сейчас этот кусок работает. Но хотелось бы, что б работал старый вариант, т.к. неизвестно сколько еще подобных глупостей я допустил... и, если с логина всё начинается, и там баг видно сразу, то некоторые могут проявляться в таких... хитрых случаях, что будет кучка гемора в работе с базой, и с поимкой этих багов...
Zuldek
Отправлено: 28 Декабря, 2012 - 09:40:11
Постоянный участник
Покинул форум
Сообщений всего: 2122
Дата рег-ции: Июнь 2010
Помог: 50 раз(а)
mysql_result($tempQRY, "pass")
точно так?
Может быть не строкой передается, а например, переменную, думая что это строка "pass"?
mysql_result($tempQRY, $pass)
master_alf
Отправлено: 28 Декабря, 2012 - 09:55:33
Новичок
Покинул форум
Сообщений всего: 20
Дата рег-ции: Авг. 2011
Помог: 0 раз(а)
Код я скопировал из рабочего файла - это именно строковый параметр. Не переменная, не константа и т.д. Просто строка.
Zuldek
Отправлено: 28 Декабря, 2012 - 10:04:51
Постоянный участник
Покинул форум
Сообщений всего: 2122
Дата рег-ции: Июнь 2010
Помог: 50 раз(а)
мне не известны параметры настроек интерпритатора, которые бы повлияли на приведение типов.
Следовательно всегда передавайте 0 и будет возвращаться первая строка результата.
Возможно вам выдавался какой-то warning на боевом сервере, когда вы не передавали числовой параметр в функцию, что нарушало выполнение дальнейшего сценария потому что вы не ожидали вывода.
Если это так, отключите вывод ошибок. Но вообще, - приводить код в порядок по той причине что лень и долго и по этой причине говнокодить - подход не правильный.
Покинул форум
Сообщений всего: 20
Дата рег-ции: Авг. 2011
Помог: 0 раз(а)
Про параметры - понятно, возможно, тогда, различие в самих версиях PHP... Значит придется ждать появления возможных багов да фиксить...
Код же приводить в порядок не просто лень, а не целесообразно. Гораздо быстрее переписать с нуля, чем разгребать эти завалы. Опыта не было вообще, ни в ООП, ни в MVC, который не соблюдал, ни в других полезных штуках, которые делают код правильным.
Но есть другие задачи, которые нельзя отложить на исправление программы которая работает, но "внутри всё не красиво". Потому временно приходится искать костыли. Я не любитель говнокода, то были "ошибки молодости". Просто переписать нет времени.
sKaa
Отправлено: 28 Декабря, 2012 - 10:32:50
Частый посетитель
Покинул форум
Сообщений всего: 979
Дата рег-ции: Окт. 2011 Откуда: Россия г. Нижний Новгород
С версии PHP 5.3.0 эта функция считается УСТАРЕВШЕЙ. Крайне не рекомендуется полагаться на эту возможность.
Так, что всё зависит ещё от того, насколько новая у вас версия php на данный момент. Может вас ещё и ошибками DEPRECATED засыпать начнет.. Их придется тоже "прятать" )))
Zuldek
Отправлено: 28 Декабря, 2012 - 10:34:07
Постоянный участник
Покинул форум
Сообщений всего: 2122
Дата рег-ции: Июнь 2010
Помог: 50 раз(а)
Временные затраты на выпиливание костыля и выявление причины по которой не работает древняя функция может быть больше времени нужного для замены всего одной функции во всем скрипте, какой бы большой он не был, учитывая что можно использовать замену по формуле и среда разработки, либо Gedit сделает все за вас, но решать вам.
sKaa
Отправлено: 28 Декабря, 2012 - 10:41:34
Частый посетитель
Покинул форум
Сообщений всего: 979
Дата рег-ции: Окт. 2011 Откуда: Россия г. Нижний Новгород
Помог: 25 раз(а)
[+]
Zuldek, погодите ещё, вот выпилят полностью mysql_, форумы засыпаны будут подобными вопросами.
Zuldek
Отправлено: 28 Декабря, 2012 - 10:43:42
Постоянный участник
Покинул форум
Сообщений всего: 2122
Дата рег-ции: Июнь 2010
Помог: 50 раз(а)
sKaa пишет:
Zuldek, погодите ещё, вот выпилят полностью mysql_, форумы засыпаны будут подобными вопросами.
Её не выпилят ещё лет 5 как минимум. Заявят, что устаревшая, но поддержка все равно останется, даже если будет кидать варнинги, все равно все будут использовать.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.