За последние 24 часа нас посетили 30539 программистов и 1802 робота. Сейчас ищут 833 программиста ...

Аналог mysql_result в MySQLi

Тема в разделе "PHP для новичков", создана пользователем jonathan-grinn, 24 июл 2016.

Метки:
  1. jonathan-grinn

    jonathan-grinn Новичок

    С нами с:
    6 фев 2016
    Сообщения:
    71
    Симпатии:
    0
    Подскажите, как можно в mysqli вывести результат (для которого раньше использовалось mysql_result).
    То есть, задав параметры имени столбца и номера строки, я смог бы отобразить результат ячейки.
     
  2. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.599
    Симпатии:
    1.764
  3. jonathan-grinn

    jonathan-grinn Новичок

    С нами с:
    6 фев 2016
    Сообщения:
    71
    Симпатии:
    0
    Можете, пожалуйста, привести пример, потому что я сколько ни пытался понять что написано на php.net и повторить это, не смог. Мне просто нужно зациклить вывод ячеек одного столбца. Со старым mysql_result это было просто, а теперь я вообще ничего не понимаю:(
     
  4. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    @jonathan-grinn показывай как пробовал с mysqli делать
     
  5. jonathan-grinn

    jonathan-grinn Новичок

    С нами с:
    6 фев 2016
    Сообщения:
    71
    Симпатии:
    0
    Всё, что я делал - от балды, дабы понять как это работает. Он выводит столбцы циклом, а не строчки (и да, я знаю, что это логично)
    PHP:
    1. $rez = $mysqli->query("SELECT * FROM prose WHERE public = 1 ORDER BY id DESC");
    2. while ($j<10) {
    3. $rez->field_seek($j);
    4. $finfo = $rez->fetch_field();
    5. echo $finfo->name;
    6. $j++;
    7. }
    --- Добавлено ---
    Я не понимаю, как сделать цикл для строк таблицы
     
  6. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.599
    Симпатии:
    1.764
    field_seek - поэтому и столбцы, всё логично
    Вообще, обычно цикл выглядит
    PHP:
    1. while ($row = $rez->fetch_assoc())
    Но если нужно перейти к какой-то строке, то data_seek(), а не field_seek()
     
    jonathan-grinn нравится это.
  7. jonathan-grinn

    jonathan-grinn Новичок

    С нами с:
    6 фев 2016
    Сообщения:
    71
    Симпатии:
    0
    А я не могу теперь обращаться к столбцу по имени?
     
  8. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.599
    Симпатии:
    1.764
    1. Ну я с mysql никогда не работал напрямую, так как 4 года назад она уже устаревшей считалась, поэтому я делаю fetch_assoc(), и потом работаю с массивом
    2. Не знаю, может и можно. Хотя я бы всё выгрузил в массив и делал с ним уже что угодно
     
    jonathan-grinn нравится это.
  9. jonathan-grinn

    jonathan-grinn Новичок

    С нами с:
    6 фев 2016
    Сообщения:
    71
    Симпатии:
    0
    Спасибо!
    p.s. вторую проблему я уже решил
     
  10. Alex654

    Alex654 Новичок

    С нами с:
    8 сен 2018
    Сообщения:
    18
    Симпатии:
    1
    Я и сейчас пользуюсь mysql (а не mysqli). Не понимаю, какие с ней объективные проблемы, и чем она хуже.
     
  11. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    @Alex654 ты наверное спал последние 10 лет если такие вопросы задаёшь. :)
    расширение mysql отсутствует в php7. либо строе расширение, либо новый блестщий php + современные фреймворки + лучшая скорость. выбор за тобой.
    --- Добавлено ---
    вообще пхп тянет за собой ворох всякого говна ради обратной совместимости, но в данном случае разработчики решили резать. несколько лет предупреждали о том что так будет и таки сделали.
     
  12. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @Alex654, представь себе, что mysql - это запорожец, а mysqli - это феррари. Сможешь сам теперь ответить на свой вопрос? Другое дело, что когда ты херачишь на феррари ты не видишь, что творится на обочине. Поэтому при изучении MySQL , я рекомендую использовать запорожец, что бы не было соблазна использовать гремучую смесь процедуры с ооп и не вырубаться в сам запрос.
     
  13. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.599
    Симпатии:
    1.764
    @Valick, учиться надо на php 7, а там нету запорожца, уже на металлолом сдали. У mysqli неспроста продублировали все методы процедурным интерфейсом...
     
  14. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @mkramer, глупые глупости, декларативный язык SQL учить надо вообще в отрыве от процедурных языков в том числе и PHP. У них абсолютно разная философия. Хотя поправлюсь, это лично моё мнение.
     
    Alex654 нравится это.
  15. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.599
    Симпатии:
    1.764
    @Valick, язык SQL выучить отдельно - не спорю, полезно. Но причём здесь устаревшее расширение php?
     
  16. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    Я же сказал, что бы не было соблазна надавить на гашетку и пропустить то, что на "обочине". Иначе изучение SQL происходит с огромными пробелами.
     
  17. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.599
    Симпатии:
    1.764
    @Valick, запрос есть запрос, через какое бы расширение ты его не пихал из PHP. Те, кто учатся, копируя столетние примеры на расширении mysql, тоже язык SQL нифига не знают. Если учить SQL как SQL, то надо пользоваться только каким-нибудь SQL-клиентом, типа консоли mysql или какого-нибудь HeidiSQL, и не отвлекаться на PHP.
     
  18. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    Да я не спорю, можно и через пыхапымайадмын, но так жеж совсем скучно :) Я не против, кто как хочет так и учит, я никого не заставляю прислушиваться к моим рекомендациям. И кстати я сто раз проходил через подобные разговоры 10 лет назад.
     
  19. Alex654

    Alex654 Новичок

    С нами с:
    8 сен 2018
    Сообщения:
    18
    Симпатии:
    1
    Мне кажется, такая аналогия неуместна. Приведите хоть один аспект, который важен в повседневной жизни (prepared statements и транзакции мне в повседневной жизни не нужны), который есть в mysqli и отсутствует в mysql.
    --- Добавлено ---
    Согласен, такие люди часто знают его очень поверхностно, только самые основы. Я так же начинал :)

    Другое дело, что когда человек знает MySQL действительно хорошо, ему точно нет особой разницы, каким клиентом делать запросы - mysql, mysqli, PDO или вовсе какой-нибудь джавовской библиотекой для работы с SQL базой. Ведь вся суть - в построении красивых и в то же время быстрых запросов, правильном проектировании таблиц и ключей, созданию нужных индексов, оптимальной работе с полученными данными уже на стороне PHP, чтобы ничего не тормозило. А чем получать эти данные - да какая вообще разница? Единственный аргумент в пользу mysqli - это транзакции, имхо. Ну и ещё для фанатов ООП - тот момент, что можно в ООП стиле код фигачить при работе с ней.
    --- Добавлено ---
    Ага. Который требует обязательного указания хендлера текущего соединения. Ещё и первым параметром. Застрелиться как удобно :)
    --- Добавлено ---
    Возможно, вы правы. Но я его никак не ощущаю, оно мне не мешает при разработке.
    --- Добавлено ---
    Я надеюсь, это была шутка. Никаких проблем со скоростью я не испытываю, что бы там ни писали всякие любители тестов, бенчмарков и циферок. Возможно, на гигантских фреймворках-монстрах типа Битрикс и аналогичных, разница и в самом деле есть - 3 секунды рендерить страницу или 1,5 сек. Но при нормальном проектировании, на нормальном железе - повторюсь, нет никаких проблем со скоростью. На любой версии PHP. Зачем мне этот 7.0, если на 5.3 и 5.4 всё работает прекрасно (и нет риска что-то внезапно сломать в существующем коде из-за несовместимости)? И mysql там поддерживается, к слову.

    P.S. Делал один немаленький сайт, там при даже не очень хорошей организации рендеринга ленты календаря (такое надо бы кэшировать в файл по-хорошему раз в сколько-то минут по крону) самая тяжёлая страница рендерилась 700-800 мс вместе со всеми коннектами к БД и выборкой данных. Запросы, к слову, тоже были не самые лёгкие из-за многочисленных джоинов, это было условие заказчика - хитрый код, выбирающий сначала данные, размещаемые на рекламных предоплаченных позициях. Те, кто пишет сайт, который не может срендериться максимум за полторы секунды - должны идти учиться кодить нормально. А не петь мантры про PHP 7.0, и как он меньше стал потреблять памяти и быстрее исполнять их говнокод.
     
  20. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.599
    Симпатии:
    1.764
    @Alex654, помимо скорости в PHP 7+ есть новые синтаксические конструкции. Да банальный пример, пишешь здесь код, где создаёшь массив, как нормальный человек, [], или пишешь такой себе красивый код:
    PHP:
    1. $page = $_GET["page"] ?? 1;
    чел запускает его на php 5.3, и он его посылает нафиг. И тут же возмущение: "нерабочий код посоветовали"...

    А что в этом такого страшного? В mysqli просто нету понятия "текущее соединение", есть просто соединение.
     
  21. Alex654

    Alex654 Новичок

    С нами с:
    8 сен 2018
    Сообщения:
    18
    Симпатии:
    1
    Если у нас "супер-хайлоад" сервис, где целый пул соединений с сервером БД - я двумя руками за такой подход. Это и правда правильно и круто. Но когда коннекшн всегда у нас один - это реально боль писать его каждый раз всюду.

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

    PHP:
    1. $page = isset($_GET['page']) && (int)$_GET['page'] >= 1 ? (int)$_GET['page'] : 1;
    Если слишком многословно - можно короче:

    PHP:
    1. if (!isset($_GET['page']) || (int)$_GET['page'] <= 0) $_GET['page'] = 1;
    И далее везде тупо обращаться через $_GET, но переменная уже проверена и скорректирована, если требовалось. Хотя и более громоздко по записи, конечно - квадратные скобки, кавычки писать каждый раз.

    По поводу массивов - так этот JS-синтаксис с квадратными скобками начиная с версии 5.4 работает)) Впрочем, не сильно запарнее использовать

    PHP:
    1. $a = array();
    Символов больше, но можно это на хоткей какой-нибудь в редакторе забиндить, если нужно часто (а не 1-2 раза за весь скрипт).

    P.S. Я понимаю, что в общем случае ?? сильно сокращает время записи, это подход, очень привычный разработчикам на JavaScript. Но штука в том, что такой код потом будет работать только на версии 7.0, и при запуске на каком-нибудь хостинге, который поддержки 7.0 не имеет (или где это просто не является дефолтом, таких сплошь и рядом) всё поломается, и заказчик будет в бешенстве. Хорошо когда проект свой, и имеешь полный контроль над тем, где он запущен, а если пишешь для других людей - я за максимальную совместимость с самыми разными версиями и окружениями :)
     
  22. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.599
    Симпатии:
    1.764
    А такие ещё есть?
     
  23. Alex654

    Alex654 Новичок

    С нами с:
    8 сен 2018
    Сообщения:
    18
    Симпатии:
    1
    Сейчас - не уверен. В середине-конце 2016-ого, когда я заканчивал последние серьёзные проекты, таких было полно. Процентов 40-50 навскидку :)

    И потом, есть вообще пограничные ситуации (на грани маразма, но всё-таки), когда версия 7.0 физически недоступна. Пример - машина со слабой аппаратной начинкой, стоящая в качестве домашнего сервера, на ней 2-3 сайта с очень низкой нагрузкой, не монетизируемые, за которые жалко платить хостерам, там же SHOUTcast и ещё несколько сервисов, включая файлопомойку.

    По-хорошему на такие машины ставят Linux, но у меня стоит XP со вторым сервис-паком. PHP версии 7 не доступна на ОС Windows старше Семёрки. Просто не компилировали под эту платформу, и самому скомпилировать не выйдет, так как в исходном коде используются вещи, не поддерживаемые тем компилятором, который под XP компилирует.

    Более того, замечено, что на ОЧЕНЬ слабом железе чем новее версия PHP, тем медленнее она работает (сравнивал в своё время 5.2, 5.3 и 5.4 на одном и том же хостинге путём переключения версии).

    Но если 5.2 по ряду причин держать всё же не стоит, то вот 5.3 - по сути единственный вменяемый вариант для таких вот случаев.

    P.S. После апгрейда той машины до 5.3 скорость работы простых тестовых скриптов всё же упала раза в полтора, что косвенно подтверждает наблюдения о том, что "богаче функционал -> медленнее скорость работы".
     
  24. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    у меня чуть больше 10 лет назад FreeNas стоял на PentiumIII, на котором хрюша даже не запустилась бы
     
  25. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Пацаны, в наше время шаред хостинг с php7 на год или даже vps стоит меньше чем час работы программиста. О чём тут говорить вообще?
    --- Добавлено ---
    Да, блин, я тоже иногда начинаю ностальгировать. Ставлю на телефон эмулятор MS DOS или Super Nintendo, умиляюсь, пла́чу...
    Но я не путаю работу и токой вот дрочь. Пятый пых умер, насрать и забыть!
     
    mkramer нравится это.