За последние 24 часа нас посетили 17895 программистов и 1595 роботов. Сейчас ищут 960 программистов ...

Процедурный или объектно-ориентированный стиль в mysqli?

Тема в разделе "PHP для новичков", создана пользователем HolodZhe, 22 апр 2017.

  1. HolodZhe

    HolodZhe Новичок

    С нами с:
    23 авг 2016
    Сообщения:
    57
    Симпатии:
    1
    Здравствуйте. В PHP как я понял есть 2 стиля написания кода для MySQL, это процедурный и объектно-ориентированный. В чем между ними разница и что лучше?

    PHP:
    1. #Процедурный стиль
    2. $mysqli_query ...
    3.  
    4. #Объектно-ориентированный
    5. $mysqli->query ...
     
  2. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Разницы в плане работы и возможностей никакой нет.
    Есть разница в синтаксисе. Ни один из вариантов не лучше другого. Используй тот, который лучше вписывается в твой код и который тебе ближе. В любой момент можно переписать с одного стиля на другой без проблем и последствий.
    --- Добавлено ---
    В плане реализации могу сказать, что объектный стиль - это обертка над процедурным. Использование процедурного требует хранение в некоем глобальном хранилище линк на соединение, чтобы всегда его передавать в функцию. Объектный стиль позволяет хранить линк в объекте. Но теперь нам надо хранить где-то глобально сам объект :)
     
    HolodZhe нравится это.
  3. HolodZhe

    HolodZhe Новичок

    С нами с:
    23 авг 2016
    Сообщения:
    57
    Симпатии:
    1
    Спасибо, вот сейчас полазил и нашел PDO, что скажете на счет него? Стоит переходить с mysqli на PDO?
     
  4. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Я с телефона, по этому тут развернутый ответ туго писать будет. Зайди в поиск по форуму. Вбей PDO и укажи мой ник в поле автора сообщений. Я не так давно очень развернуто отвечал по такой же теме.
     
  5. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Скорее наоборот. И доках первый параметр в процедурном варианте указан, как экземпляр mysqli, а не как resource
     
  6. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    можно, можно и не переходить.
     
  7. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Однако, ты прав. Что еще раз доказывает, что разницы, окромя синтаксиса, вообще нет.

    И да, я добрался до компа. Вот тебе ответ на вопрос по выбору между PDO и Mysqli.
     
  8. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    в PDO нет эскейпинга.Это муть какая-то.
     
  9. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Есть. Заодно берет строку в кавычки. Типа, ты всё равно экранируешь чтобы в запрос пихать, к чему набирать кавычки.
     
  10. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ммм. да. берёт строку в кавычки. А мне не надо кавычки. Я хочу например название таблицы пихать из переменной. Как мне быть?
     
  11. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Есть подозрение, что символы, требующие экранирования, не могут быть частью имени таблицы. То есть не может быть так, что таблица существует, но чтобы к ней обратиться, надо эскейпнуть строку.
    Если речь идет о защите от инъекции, то трудно представить ситуацию, когда разрешено задавать извне любое имя таблицы, но страшно за инъекцию. Скорее всего, это бы работало как-то так:
    Код (PHP):
    1. if (false === in_array($name, $allowedTables))
    2.     return "Wrong table name!";
     
  12. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Я эти отмазки тоже читал. =) По факту это предложение захардкодить массив с названиями таблиц и полей в коде приложения. Это... Ну... Подмена понятий.
     
  13. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Можно не харткодить, а получить из show tables;
     
  14. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    мм. ок. это канает. всего один запрос накладных расходов. терпимо. жить можно. ладно. уговорил.

    а сколько накладных расходов делает пдо для prepared statements?
     
  15. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    В режиме эмуляции он не делает запросы в базу для этого. В режиме нормальных подготовленных запросов - ну получается тоже на один запрос больше. Но я не агитирую за PDO, просто пишу, что есть. Я сам, если пишу без фреймворка или на фреймворке без слоя БД, использую mysqli обычно
    --- Добавлено ---
    P.S. ещё не разу не приходилось подставлять имя таблицы из переменной, в которой данные, пришедшие от пользователя. Опишите хоть ситуацию, в которой это может понадобится. Свой PMA или adminer я писать не собираюсь :)
     
    acho нравится это.
  16. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    я не хочу думать о том, откуда в переменную данные приползли. От пользователя или из бд даже - всё возможно опошлить. :D
    Так что в случае mysqli я просто эсейплю всё подряд. А в случае PDO эта задача решается сложнее. Но это прямо скажем задача редкая, да. Просто столкнулся с ней на днях. Забей.