Переход с mysql на mysqli на PHP


Содержание

Переход с mysql на mysqli на PHP

Здесь могла бы быть ваша реклама

Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006
Откуда: Israel

Секрет
Теперь, когда вы уже наверняка второпях отправили свой запрос,
я расскажу вам простой секрет, который сэкономит вам уйму ожиданий,
даже если первый ответ по теме последуем сразу же.

Само собой я знаю что ответят мне тут же, и если я посмотрю
на сообщения на форуме, то пойму что в общем то я и не ошибаюсь.
Но еще я точно замечу, что очень мало тем, в которых всего два ответа :
вопрос автора и еще два сообщение вида Ответ + Спасибо

После этого приходится начинать уточнять этим неграмотным что мне надо.
Они что, сами читать не умеют? А уточнять приходится.
И иногда пока они переварят то что я им скажу проходит и не одна ночь..

Уверен что если бы я им сказал что у меня есть
фиолетовый квадрат, и нужно превратить его в синий треугольник
и я пытался взять кисточку, макнуть в банку и поводить ей по квадрату
но почему то кисточка не принимала цвет краски в банке,
то на мой вопрос — где взять правильные банки мне бы ответили гораздо быстрее
предложив её открыть, а не тратить еще стольник на жестянку.

Поэтому с тех пор я строю свои вопросы по проверенной давным давно схеме:
Что есть
Что нужно получить
Как я пытался
Почему или что у меня не получилось.

На последок как оно происходит на форумах

Новичок: Подскажите пожалуста самый крепкий сорт дерева! Весь инет перерыл, поиском пользовался!
Старожил: Объясни, зачем тебе понадобилось дерево? Сейчас оно в строительстве практически не используется.
Новичок: Я небоскрёб собираюсь строить. Хочу узнать, из какого дерева делать перекрытия между этажами!
Старожил: Какое дерево? Ты вообще соображаешь, что говоришь?
Новичок: Чем мне нравиться этот форум — из двух ответов ниодного конкретного. Одни вопросы неподелу!
Старожил: Не нравится — тебя здесь никто не держит. Но если ты не соображаешь, что из дерева небоскрёбы не строят, то лучше бы тебе сначала школу закончить.
Новичок: Не знаите — лучше молчите! У меня дедушка в деревянном доме живёт! У НЕГО НИЧЕГО НЕ ЛОМАЕТСЯ.
Но у него дом из сосны, а я понимаю, что для небоскрёба нужно дерево прочнее! Поэтому и спрашиваю. А от вас нормального ответа недождёшся.
Прохожий: Самое крепкое дерево — дуб. Вот тебе технология вымачивания дуба в солёной воде, она придаёт дубу особую прочность:
Новичок: Спасибо, братан! То что нужно.

Отредактировано модератором: Uchkuma, 26 Апреля, 2011 — 10:21:12

Переход на php7 и mysqli

Доброго времени суток!
У меня такой вопрос.
Хочу сайт WordPress перевести с php5.6 на php7, для этого на нем нужно все функции mysql заменить на mysqli.
Если кто этим занимался, подскажите как это можно сделать попроще? Искать и переписывать в ручную я думаю не вариант.

PickUp Post — Поднятие поста за деньги. Пусть платят, если хотят быть в топе!

Просто переключить на 7 версию и наслаждаться, в ручную ничего не надо делать. Покрайней мере если у вас не стоит каких нить уж очень древних плагинов.
Оно или заработает или нет, но конечно никогда не вредно сделать бекап, хотя не должно ничего сломатся даже если откатите.

Пробовал с бд не соединяется

Наверняка есть еще плагины, но вот просто первый попавшийся

Попробуйте там поискать если этот не то по запросу mysqli

Я просто у хостера в панели управления переключил на 7ю версию пыха. И ниодной проблемы не было.

Попробовал MySQLi database layer, тоже самое «Ошибка установки соединения с базой данных».
Скажите а это же только из за функции mysql может быть?

Не уверен конечно что поможет, но вот нашел такое(я не силен в этом):

пишем в wp-config.php строчку define(‘DB_TYPE’, ‘sqlite’);

Хотя возможно еще базу надо сконвертировать, но повторюсь я не разбираюсь в этом толком.

Тоже не хочет соединяться.
Ладно, попробую в поддержку хостинга написать, может подскажут чего.

Разобрался!
В бд был устаревший способ авторизации.
Создал новую, поставил галочку «мои скрипты не поддерживают OLD_PASSWORDS» и все заработало.

Добрый день! А можно поподробнее для чайников, о том как вы исправили устаревший способ авторизации. Через phpmyadmin? Вы создали копию своей базы данных и дальше как?

Я переключила сайт с php5.3 на php5.6 и у меня полезли ошибки, возросла нагрузка на сервер. Ошибки такие.

trip-together.ru [Sun Oct 15 22:45:39 2020] [error] [client 162.158.92.120] PHP Fatal error: Maximum execution time of 10 seconds exceeded in /wp-includes/post.php on line 5041, referer:

trip-together.ru [Sun Oct 15 22:46:21 2020] [error] [client 162.158.92.120] PHP Fatal error: Maximum execution time of 10 seconds exceeded in /wp-includes/cache.php on line 551, referer:

Я думаю, что дело не в том, что скрипту не хватает времени, там другие проблемы. Увеличение времени не вариант.

Там внизу страницы как раз сказано про проблемы связи с базой данных.

Здравствуйте!
Нет, не через phpmyadmin, а при создании новой БД поставить галочку «мои скрипты не поддерживают OLD_PASSWORDS» хостинг 1Gb.ru, на других хостингах возможно по другому, уточните у поддержки.

Просто переключить на 7 версию и наслаждаться, в ручную ничего не надо делать.

Подтверждаю. Кроме как переключить версию в панели управления хостингом, ничего делать не надо.
Из своего опыта могу сказать, что у меня возникли проблемы с шаблоном. В результате получил белый экран.

Подтверждаю. Кроме как переключить версию в панели управления хостингом, ничего делать не надо.
Из своего опыта могу сказать, что у меня возникли проблемы с шаблоном. В результате получил белый экран.

А если «переключили версию в панели управления хостингом» и нет соединения с БД? В принципе с чем я и столкнулся. Проблема была решена и все описано выше.

Я на php 7 не могла перейти, сайт сразу выдавал «Ошибка соединения с базой данных», поэтому пока переехала на php5.6. Нагрузка на сервер сразу подскочила в 2 раза и в логах посыпались ошибки. Поддержка хостинга мне ничем не помогла, типа констатировали факт что все функции mysql заменить на mysqli и все. Тогда я по совету Александра, создала новую базу данных, залила туда дамп старой базы, переключила сайт на новую базу и случилось чудо, я переключилась на php 7, сайт работает, нагрузка упала. Единственно, что огорчает, дак это ошибки в логах

trip-together.ru [Tue Oct 17 14:38:46 2020] [error] [client 162.158.89.237] PHP Fatal error: Maximum execution time of 10 seconds exceeded in /wp-includes/class-wp-post.php on line 241, referer:

Этот ip по черным базам спамщик 162.158.89.237. Со старой версией php таких ошибок я не видела.

Суть в том, что я свою базу создала 4 года назад вместе с сайтом и никогда ничего с ней не делала, возможно там тоже закралось какое-то устаревшее соединение не заметное не вооруженным взглядом. Я никогда не изучала вопрос версий SQL, наверное они так же существуют, как и версии php. На моем хостинге никаких галочек ставить было не надо. Русские форумы рулят, форум вордпресса совсем мне не помог. Спасибо Александру.

Подключение к базе данных в PHP через mysql, pdo и mysqli

Прежде чем подключиться к MySQL серверу необходимо определиться с PHP расширением, которое будет использоваться для работы с базой данных. Под расширением понимается драйвер — посредник между сервером базы и программистом. Он содержит набор функций или объектов, которые упрощают работу программиста. На данный момент выделяют 3 основных расширения.

Все 3 расширения являются стандартным набором для любой хорошей хостинг-площадки. Однако, по умолчанию некоторые могут быть отключены в настройках PHP модулей. Информацию о включенных модулях возвращает функция «phpinfo» с параметром «8».

Доступность модуля можно определить с помощью простой конструкции в коде.

Подключение к MySQL через одноименное расширение

Расширение MySQL появилось первым и долгое время не имело конкурентов. Сейчас считается устаревшим и в серьезных проектах не используется. На это есть ряд причин, основными из которых являются плохая оптимизация и безопасность, отсутствие многопоточности. Несмотря на это, оно ещё долго будет поддерживаться большинством хостингов.

Начиная с PHP версии 5.5 многие функции расширения стали устаревшими, а в PHP 7 и вовсе не поддерживаются.

Рассмотрим пример подключения к базе данных с комментариями.

В качестве запросов используется стандартный SQL. Рассмотрим простые примеры выборки и добавления записей.

В примере производим простую выборку записей из таблицы «books». Результат представлен в качестве ассоциативного массива, поэтому его содержимое можно получить в обычном цикле. Если запрос не возвращает набор данных, то в качестве результата возвращается «false» или «true».

Отличие MySQLi от MySQL

MySQLi пришло на смену MySQL. Буква «i» обозначает улучшенный (Improved). Имеет частичную совместимость со старой версией. Поддерживается всеми версиями PHP. Имеет чуть большую скорость работы и лучшую безопасность. Установлено на 99% хостинговых площадках.

Одной из важных особенностей является наличие объектно-ориентированного интерфейса. Если раньше работы с базой данных осуществлялись при помощи интерфейса функций, то теперь можно использовать оба подхода. Рассмотрим пример подключения к базе данных через MySQLi средствами «ООП».

Так осуществляется простая выборка названий книг из поля «BName» таблицы «books». Вставка и обновление существующих записей так же не отличается сложностью.

В конце запроса осуществляем проверку, удалось ли обновить запись.

Подключение к базе через PDO

PDO — расширение для PHP, которое расшифровывается как PHP Data Objects. Его особенностью является повышенная безопасность и универсальный интерфейс работы с различными базами данных. Другими словами, если с помощью MySQLi можно создавать запросы только для MySQL сервера, то PDO позволяет работать с различными серверами используя один и тот же синтаксис запросов. Это удобно если разработчик заранее не знает под управлением какого сервера будет работать конечный продукт.

У PDO есть свой механизм соединения с базой данных — «DSN» (Data Source Name). Кроме адреса сервера, логина и пароля, он должен принять тип базы данных. Посмотрим пример подключения.

Точно так же осуществляются и другие действия с записями и таблицами. Только меняем SQL запрос и вызываем выполнение методом «exec».

Метод «exec» в отличии от «query» не может получать данные из базы данных. Он возвращает количество записей, которые были затронуты в результате работы SQL запроса.

Как изменить mysql на mysqli?

Основываясь на этом коде ниже, я использую для регулярного mysql, как я могу преобразовать его в mysqli?

Это так же просто, как изменение ** mysql _query ($ sql) ; to mysqli _query ($ sql) ; ? **

Первое, что нужно сделать, вероятно, mysql_* бы в замене каждого mysql_* функции mysql_* его эквивалентом mysqli_* , по крайней мере, если вы захотите использовать процедурный API, что было бы проще, учитывая, что у вас уже есть код, основанный на MySQL API, который является процедурным.

Чтобы помочь в этом, краткое описание функции расширения MySQLi, безусловно, будет полезным.

  • mysql_connect будет заменен на mysqli_connect
  • mysql_error будет заменен mysqli_error и / или mysqli_connect_error , в зависимости от контекста
  • mysql_query будет заменен на mysqli_query
  • и так далее

Обратите внимание, что для некоторых функций вам может потребоваться тщательно проверить параметры: может быть, есть некоторые различия здесь и там – но не так много, я бы сказал: mysql и mysqli основаны на одной и той же библиотеке (libmysql; at наименее для PHP mysql_select_db , чтобы указать, в какой базе данных вы хотите выполнять свои запросы

  • mysqli, с другой стороны, позволяет указать это имя базы данных в качестве четвертого параметра для mysqli_connect .
  • Тем не менее, есть также функция mysqli_select_db которую вы можете использовать, если хотите.
  • Как только вы закончите с этим, попробуйте выполнить новую версию своего скрипта … И проверьте, все ли работает; если нет … Время для поиска ошибок ��

    (Я понимаю, что это старо, но оно все еще появляется …)

    Если вы замените mysql_* на mysqli_* то имейте в виду, что для всей загрузки функций mysqli_* необходимо mysqli_* ссылку базы данных.

    Т.е. требуется большая проверка.

    Самый простой способ я всегда справляюсь с этим

    Где $ con = mysqli_connect ($ serverName, $ dbusername, $ dbpassword);

    Замена 3-х шагов в следующем порядке

    1. Все » mysql_select_db ( » с » mysqli_select_db ($ con, «
    2. Все » mysql_query ( » с » mysqli_query ($ con, » и
    3. Все « mysql_ » с « mysqli_ ».

    Это работает для меня каждый раз

    Я бы предпочел использовать PDO для вашего доступа SQL.

    Тогда это всего лишь случай изменения драйвера и обеспечения работы SQL на новом бэкэнд. В теории. Перенос данных – это другая проблема.

    Абсолютный доступ к базе данных велик.

    Если у вас есть много файлов для изменения в ваших проектах, вы можете создавать функции с теми же именами, что и функции mysql, а в функциях сделать преобразование, как этот код:

    Краткая версия преобразования mysql в mysqli

    Бортовой журнал

    Полет нормальный. Без происшествий.

    Переход на PHP7: работа над ошибками

    Итак, у вас есть старенький, но уж очень милый сердцу сайт, который вы решаетесь из жалости (или, возможно, перечитав Хабра) перевести на PHP7. С волнением ожидая резкого роста производительности, вы смахиваете пыль с бедного сайта и решительно переключаете в панели управления хостингом версию PHP.

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

    Но предположим, что ваша сильная сторона — настойчивость, к тому же вы располагаете некоторым количеством времени для экспериментов. Давайте попробуем все починить.

    Резервные копии

    Делаем резервные копии сайта (а заодно и баз данных). Ведь кто не делает резервные копи — сам себе враг, верно? Для разного рода экспериментов имеет смысл добавить еще один сайт на хостинге и скопировать в него файлы, которые мы сейчас будем править.

    Журналы ошибок

    Настроим ведение журнала ошибок PHP в файл .htaccess (если он не был настроен ранее):

    php_value display_errors 0
    php_value log_errors 1
    php_value error_log /home/vasya/domains/mysite.ru/logs/error.log

    Работа с MySQL

    Допустим, сайт использует базы данных, и вы видите ошибки вроде такой:

    Fatal error: Uncaught Error: Call to undefined function mysql_connect()

    Это оттого, что в современных версиях PHP (начиная с PHP 5.5.0) оригинальное расширение MySQL не поддерживается. Разработчики рекомендуют использовать MySQLi или PDO. Попробуем перейти на MySQLi, это просто:

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

    $link = mysql_connect(‘localhost’, $user, $password)
    mysql_select_db($dbname, $link)
    mysql_query(‘set names cp1251’)

    можно заменить на:

    $link = mysqli_connect(‘localhost’, $user, $password, $dbname)
    mysqli_query($link, ‘set names cp1251’)

    Другие популярные функции легко меняются на их аналоги с буквой ‘i’:

    mysqli_fetch_array()
    mysqli_fetch_row()
    mysqli_fetch_assoc()
    mysqli_fetch_array()
    mysqli_num_rows()
    mysqli_insert_id()
    mysqli_close()

    В результате этих несложных действий данные из БД должны успешно собираться и отправляться.

    Кодировка

    Настоящий олдскул — это сайт в CP1251 (как минимум). Всё превратилось в ромбики или прочие козяблики?

    Скорее всего, достаточно будет указать кодировку в .htaccess таким образом:

    php_value default_charset «cp1251»

    Регулярные выражения

    Также вы можете наблюдать ошибки следующего рода:

    Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead

    Это означает, что модификатор /e, который позволял передать произвольной функции результат регулярного выражения, теперь не поддерживается. В таких случаях рекомендуется использовать функцию preg_replace_callback

    Допустим, у нас есть такое регулярное выражение:

    с заменой на preg_replace_callback оно должно выглядеть вот так:

    $string=preg_replace_callback(«/:([a-z]<1,10>):/», create_function(‘$matches’, ‘return print_smile($matches[1])’), $string)

    здесь все просто, регулярное выражение теперь указывается в качестве первого аргумента (без модификатора /e, разумеется), а в качестве второго аргумента указывается анонимная функция (которая будет выполнена после применения регулярного выражения) с двумя аргументами: массив $matches, где будут сохранены данные, совпадающие с регулярным выражением и вызов внешней функции с аргументами. В данном примере внешняя функция называется print_smile и ей передается аргументом первое найденное вхождение. То, что в preg_replace было \\1 (первое найденное вхождение) станет $matches[1] (если аргументов было больше, то будет $matches[2], $matches[3] и так далее).

    Вот еще один пример, посложнее:

    $out=preg_replace_callback(‘/ (.*?) /s’, create_function(‘$matches’, ‘return feed_out_sub_rm($matches[2], «‘.$base_prefix.’», «‘.$nick.’», «‘.$id_entry.’») ‘), $out)

    здесь легко запутаться в кавычках, будьте внимательны.

    Копаясь в регулярных выражениях, можно вспомнить еще про две функции, которые с версии PHP 5.3.0 считаются устаревшими (и не поддерживаются). Симптомы следующие:

    Fatal error: Uncaught Error: Call to undefined function ereg_replace()

    Если регулярное выражение в ereg_replace простое, то можно обойтись просто установкой граничных символов, как здесь:

    Fatal error: Uncaught Error: Call to undefined function split()

    Если регулярное выражение посложнее, то пробуем преобразовать к preg_split.

    На этом пока все. Удачной отладки.
    Много полезных материалов по теме можно найти на сайте разработчиков.

    Если что-то не получается, или ваш случай совсем не похож на наши примеры — пишите комментарии, попробуем разобраться вместе.

    Для того, чтобы оставлять комментарии к посту, авторизуйтесь, используя свой аккаунт в социальных сетях ВКонтакте/FaceBook, или аккаунт в Google/Яндекс.

    PHP: критика перехода с оригинального API MySQL на mysqli и PDO

    Оригинальный API MySQL (функции mysql_*() — например, mysql_query() и пр.) с версии PHP 5.5.0 объявлен устаревшим. Вместо него разработчики PHP рекомендуют использовать модуль mysqli или объекты данных PHP (PDO). Эти средства обладают расширенным по сравнению с традиционным API функционалом, но действительно ли они удобнее в повседневной практике?

    mysqli

    mysqli — «MySQL improved extension» («улучшенный модуль MySQL») — прямой наследник оригинального API MySQL, обладающий более широкими возможностями. Чтобы почувствовать разницу, достаточно посмотреть на список его методов и сравнить с таковым оригинального модуля. Однако нужно отметить, что отличие в реальных возможностях на самом деле только одно: mysqli имеет возможность отправки множественных запросов 1 . Хотя иметь такую возможность и удобно, на практике её наличие ощутимой роли не играет 2 .

    Другими словами, разницы в реальных возможностях обычного и улучшенного модулей практически нет. Зато есть разница в интерфейсе. Рассмотрим, как в простейшем случае выглядит самая обычная операция — установление соединения с сервером MySQL и выполнение запроса:

    // оригинальный модуль
    mysql_connect ( ‘host’ , ‘user’ , ‘password’ ) ;
    mysql_query ( «SELECT 1» ) ;

    // улучшенный модуль, процедурный интерфейс
    $mysqli = mysqli_connect ( ‘host’ , ‘user’ , ‘password’ ) ;
    mysqli_query ( $mysqli , «SELECT 1» ) ;

    // улучшенный модуль, объектный интерфейс
    $mysqli = new mysqli ( $host , $user , $password ) ;
    $mysqli -> query ( «SELECT 1» ) ;

    Здесь важно заметить, что функция mysql_query() не требует передавать в явном виде указатель на соединение (хотя и позволяет это делать). В подавляющем большинстве случаев для работы требуется только одно соединение с MySQL, и, однажды установив его, вполне удобно и естественно просто вызывать mysql-функции, не ссылаясь на соединение в явном виде каждый раз.

    Функция же mysqli_query(), напротив, требует передавать объект, указывающий на соединение. Этот объект потребуется во всех местах, где нужно будет делать запрос. Это означает, что в коде с локальной областью видимости — функциях и классах — придется либо заводить глобальную переменную, либо передавать этот объект явно.

    Это, казалось бы, небольшое отличие на практике не только приводит к необходимости писать более длинный код, но и осложняет миграцию с оригинального модуля на улучшенный из-за необходимости вносить в код изменения.

    Резюмируя сказанное, приходится констатировать, что на практике модуль mysqli не обладает какой-то дополнительной полезностью по сравнению с оригинальным. Пользоваться же им менее удобно.

    PHP Data Object (Объекты данных PHP) — расширение языка, определяющее абстрактный интерфейс доступа к базам данных (это означает, что одни и те же методы PDO могут использоваться для разных СУБД).

    На практике реально ощутимым отличием PDO от других интерфейсов к MySQL является возможность легко делать следующие две операции:

    • вставку в запрос параметров с экранированием
    • получение результата запроса в виде ассоциативного массива

    Работа с MySQL, в основном, и заключается именно в этих двух вещах, поэтому многие разработчики останавливают свой выбор на PDO.

    Однако есть один нюанс. Рассмотрим, как в самом простом случае средствами PDO выполняется запрос:

    Важно отметить, что для отправки запроса требуется вызывать не один метод, а два — prepare(), а затем execute(). На уровне механизма СУБД в данном случае задействуются т.н. prepared statements — специальный инструмент СУБД, позволяющий ускорить последовательное выполнение повторяющихся запросов, построенных по одному и тому же шаблону.

    Вместе с тем, на практике идущие подряд однотипные запросы встречаются довольно редко. Напротив, обычно запросы разные, и это полностью нивелирует положительный эффект от предварительного разбора. Более того, в конечном итоге вместо одного запроса к MySQL делается два, в результате чего схема с prepare() и execute() оказывается даже медленнее обычного одиночного запроса.

    PDO позволяет выполнить запрос и напрямую — для этого предназначен метод query(). Однако при использовании этого метода вставку в запрос параметров и их экранирование приходится проводить вручную, поэтому query() не пользуется популярностью и разработчики предпочитают связку из prepare() и execute() в любом случае, потому что это удобнее.

    Следует также подчеркнуть, что при использовании PDO (как и в случае с mysqli) есть необходимость заводить объект, который в областях видимости функций и классов недоступен.

    Резюмируя сказанное, нужно отметить, что по сравнению с другими модулями PDO предоставляет несколько более удобный функционал, однако реализация его выполнена неоптимально. Кроме того, высокий уровень абстракции интерфейса плохо сказывается на осведомлённости разработчиков о происходящем на стороне MySQL-сервера.

    Что делать?

    Одним из решений всех вышеперечисленных проблем является библиотека удобных функций MySQL, при разработке которой основной целью было сделать программирование самых распространенных операций при работе с MySQL (таких как сохранение результата запроса в виде ассоциативного массива, обработка ошибок, подстановка массива в запрос) максимально удобным. Вот несколько примеров:

    // если в глобальной области видимости есть переменная $mysqli,
    // библиотека будет пользоваться инструментами mysqli,
    // в противном случае — оригинального модуля MySQL

    // включаем mysqli
    $mysqli = mysqli_connect ( . ) ;

    // простая отправка запроса
    mysql_q ( «TRUNCATE sometable» ) ;

    // получение результата скалярного (один столбец, одна строка) запроса
    $now = mysql_getcell ( «SELECT NOW()» ) ;

    // получение строки таблицы:
    $row = mysql_getrow ( »
    SELECT *
    FROM watches
    WHERE > » ) ;

    // получение столбца в виде одномерного массива:
    $ids = mysql_getcolumn ( »
    SELECT id
    FROM watches
    WHERE mark = ‘Edox’ AND price > 5000
    » ) ;

    // получение записей таблицы с подстановкой в запрос параметров:
    $sql = »
    SELECT *
    FROM watches
    WHERE mark = :mark AND price > :price
    » ;
    $params = array ( ‘mark’ => ‘Edox’ , ‘price’ => 5000 ) ;
    $data = mysql_gettable ( $sql , FALSE , $params ) ;


    // подстановку можно делать во всех вышеперечисленных функциях

    Подробнее о библиотеке можно прочитать в соответствующей статье.

    1. ▲ Работу с транзакциями, хранимыми процедурами и прочим, заявленным в документации как отличия между модулями, на самом деле можно реализовывать с помощью собственно SQL-запросов: например, вместо $mysqli -> commit ( ) писать mysql_query ( «COMMIT» ) , и т.п.

    2. ▲ Разница в производительности множественного запроса и соответствующего количества одиночных сводится к затратам на отправку запроса из PHP, которые по сравнению с затратами на собственно их выполнение механизмом СУБД как правило ничтожно малы. Кроме того, ситуация, когда запросы следуют подряд без необходимости промежуточной обработки результатов, является довольно редкой.

    marapper

    Вы пишите это, на минуточку, в 2103 году. Ведь все «претензии» к «новому» интерфейсу общения с БД, выглядят далеким приветом из далеких 90-ых.

    Одно соединение на БД требуется не в подавляющем числе случаев, а в случаях, когда вы работаете с малым количеством данных, — это может быть бложек, сайтик-визитка или что-то подобное. В полноценном проекте рано или поздно приходит понимание, что данные необходимо размещать в нескольких БД с разными правами — хотя бы ради скеюрности, я уж не говорю о мастабируемости.

    Если уж приходится заводить новую переменную в глобальной области видимости, прости, у меня для вас известие — с вашим кодом что-то не так, и ему в любом случае требуется аудит безопасности.

    И самое главное, в mysqli — конечно, безопасность, о которой так пренебрежительно замечается в абзаце об оверхеде prepare. Который, кстати, позволяет не только выполнять запросы несколько раз повторно, но и позволяет самой СУБД кешировать стейтмент для того, чтобы в конкуретном потоке пхп выполнить запрос быстрее.

    Ну и, конечно, в скрипте для парсинга данных нам достаточно и mysqli, но в любом проекте, который чуть больше, масштабируемость играет куда большую роль, поэтому не обойтись без ActiveRecord или ORM.

    А ведь пхп растет именно в сторону энтерпрайза, чтобы его перестали считать языком быдлокодеров и школьников. Чему, к сожалению, не способствуют подобные статьи. 29.03.2013, 20:16
    Ответить

    rgbeast

    На мой взгляд, критика, данная в статье, вполне уместна. Использование одного или нескольких подключений — выбор пользователя, не связанный с безопасностью. Напротив, в высоконагруженных проектах, лучше не использовать несколько поключений, чтобы усложнять архитектуру, которую в этом случае будет труднее масштабировать.

    mysqli вообще ничем не отличается от mysql, поэтому не видно логики, которая стоит за тем, чтобы сделать интерфейс устаревшим и заставлять всех переписывать скрипты, надежно работавшие годами.

    PDO неправильно реализует требования безопасности. Вместо того, чтобы самому предоставить возможность безопасной абстракции запросов к базе, он опирается на встроенный в базу данных механизм PREPARE. Это гораздо более серьезный удар по производительности, чем может показаться на первый взгляд. Масштабировать базу данных достаточно сложно — такие решения, как MySQL Cluster, Galera Cluster или репликация требуют существенного перерасхода машинных ресурсов и значительного администрирования. Масштабирование front-машин (с php), напротив, достаточно рутинная операция. Поэтому представляется логичным работу по добавлению параметров в запрос выполнять на клиенте, причем это можно было бы делать в один этап (как предложил автор статьи).

    Итого: отказываемся от привычного всем работающего интерфейса, не предлагая ничего, что было бы существенно лучше старого.

    29.03.2013, 22:08
    Ответить

    1234ru

    По приблизительным оценкам, для сайтов, у которых меньше полумиллиона посетителей в день, хорошо работает одно соединение (проверено на практике). По количеству сайтов это уже подавляющее большинство.
    Уверен, что для многих сайтов выше этого порога одно соединение тоже подойдет.
    В тех редких случаях, когда нужно больше одного соединения, можно сохранить указатели на соединения в переменные, но для этого не нужно ни mysqli, ни PDO. Оригинальный модуль MySQL тоже это позволяет.

    Что-то не так с разработчиками PHP, которые в оригинальном модуле MySQL позволяли обращаться к соединению без явного указания, а в его следующей версии — mysqli — эту возможность убрали.

    В общем случае такой необходимости нет. Без конкретных примеров ваше утверждение беспочвенно.

    Масштабирование баз данных заключается в использовании нескольких идентичных серверов, права доступа к которым одинаковые. Непонятно, как вы связываете масштабирование с разделением прав.

    Абзац об оверхеде prepare вообще никак не связан с mysqli. Вы, вероятно, имели в виду PDO.
    Экранирование строк доступно в оригинальном API MySQL. Оно аналогично используемому при подстановке параметров в PDO, так что никакой дополнительной безопасности PDO не дает.

    Выполнять однотипные запросы повторно обычно не нужно. В тех случаях, когда нужно, медленной операцией обычно будет не повторный разбор SQL (от которого позволяет избавиться prepare) а собственно работа с данными (например, вставка их в таблицу и перестройка индекса, и т.п.).

    rgbeast

    Не согласен относительно PREPARE: его использование безопаснее, чем mysql_real_escape_string. В случае PREPARE, исполнение другого запроса исключено по построению, а для mysql_real_escape_string можно, в принципе, представить, что что-то отработает некорректно (из-за кодировки, баги php и.т.д.) и произойдет sql-инъекция.

    01.04.2013, 19:57
    Ответить

    1234ru

    rgbeast

    Упомянутые функции скорее всего делают одно и то же. Речь о том, что подход с PREPARE принципиально безопаснее подхода без PREPARE. При использовании PREPARE невозможно выполнение не такого запроса, как задан, независимо от того, что передано в качестве аргументов для execute()

    02.04.2013, 19:19
    Ответить

    1234ru

    Все равно не понимаю.
    Схема с prepare-execute на стороне MySQL состоит из трех запросов. К примеру:

    PDO::execute(), очевидно, выполняет второй и третий. Т.е. где-то должен произойти аналог SET @a = 1.
    По-моему, это и есть место для инъекции. Оно никуда не делось и не может деться — возможность инъекции будет существовать до тех пор, пока существует необходимость отправлять на сторону СУБД произвольные данные.

    rgbeast

    Да, пожалуй. Никогда не думал про инъекции в запрос SET, но они вполне возможны — в случае уязвимости можно вставить любой подзапрос.

    10.04.2013, 21:18
    Ответить

    vasya

    Сервер при создании подготовленного выражения проводит его синтаксический разбор и кэширует частичный план выполнения. Поэтому не получится обмануть, подсунув в качестве параметра хитрый подзапрос.
    В твоем примере при выполнении
    EXECUTE test USING @a;
    сервер уже знает, что нужно просто отдать содержимое @a

    03.02.2014, 18:03
    Ответить

    1234ru

    vasya

    Моя мысль в том, что ещё на этапе подготовки
    PREPARE test FROM ‘SELECT ?’;
    сервер поймет, что запрос представляет из себя простой select, никаких таблиц не затрагивает и нужно лишь отдать параметр подготовленного выражения. Поэтому на втором этапе, когда ты будешь определять переменную инъекции не произойдет.

    MariaDB [ test ] > select >from test limit 1 ;
    + —-+
    | id |
    + —-+
    | 1 |
    + —-+
    1 row in set ( 0.06 sec )

    MariaDB [ test ] > prepare zxc from ‘select ?’ ;
    Query OK, 0 rows affected ( 0.01 sec )
    Statement prepared

    MariaDB [ test ] > set @a= ‘id from test limit 1’ ;
    Query OK, 0 rows affected ( 0.00 sec )

    rgbeast

    vasya

    1234ru

    vasya

    Да, действительно.

    05.02.2014, 22:27
    Ответить

    programolamer

    1) mysqli быстрее mysql
    2) множественные запросы сокращают пхп код, поэтому полезность их очевидна
    3) масштабирование бд бывает разным

    17.11.2014, 01:23
    Ответить

    1234ru

    Откуда такая информация?

    К тому же, обычно тело SQL-запроса гораздо длиннее, чем сам вызов PHP-функции.

    полудух

    по поводу передачи в функцию, лично я пользуюсь ссылкой.
    у меня один главный массив со всеми переменными:
    $s <'ini'>= array(0,1,0,0,1);
    $s <'page'>= $default_page;
    $s <'ajax'>= $ajax_what;
    $s <'mysqli'>= new mysqli(. ); // это в функции выполняется есессно подключение, потом ещё $mysqli->set_charset(«utf8»);

    а потом просто во все функции передаю этот $s первым параметром, а принимаю так:
    function func(&$s)
    <
    $s<'mysqli'>->query();
    >

    вроде норм, как думаете?
    через него также удобно из функции в функцию данные перекидывать

    16.07.2015, 16:40
    Ответить

    1234ru

    Вы сделали некий аналог глобальных переменных.

    Их недостатком является общее на всех пространство имен (в вашем случае — ключей массива; в одном месте можно забыть про другое и переписать элемент массива, не отдав себе в этом отчет).
    Если вам так удобно — то дело хозяйское.

    Переход на MySqli

    Лимур

    Новичок

    Переход на MySqli

    $dblocation=»localhost»;
    $dbuser=»halabala»;
    $dbpasswd=»hakabala»;
    $dbname=»hala»;
    $dbcn = @mysql_connect(«$dblocation»,»$dbuser»,»$dbpasswd»);

    В настоящий момент сервер недоступен!

    if (!@mysql_select_db($dbname,$dbcn)) <
    echo(«

    В настоящий момент подключение к базе недоступно!

    «);
    /exit();
    >;
    Вот такой файл раньше работал нормально но если заменить mysql_connect на mysqli_connect
    тоже ошибку не выдает. А вот если mysql_select_db на mysqli_select_db то незнает он такого(и выдает ошибку «В настоящий момент подключение к базе недоступно» ).
    Хотелось бы узнать может есть оналого такой команды.И вообще хотелось бы узнать о нюансах нового расширении(вчастности об изменение команд).
    Заранее спосибо за помощь.

    MySQLi раскладываем все по полочкам

    Для кого это статья? Первоочередной целью написания статьи было именно «разложить все по полочкам» для тех, кто уже работал с mysqli, но не вникал глубоко, а быстренько написал свои обертки и забыл про оригинальный синтаксис. Я постарался разъяснить нюансы, с которым столкнулся сам, при переносе данных из большой и очень старой БД, спроектированной человеком, не знающим про нормализации, в новую, с сильно изменившейся структурой.

    Можно ли читать эту статью людям, которые все еще используют старое расширение mysql и только думающие об перехода на PDO или MySqli? Думаю даже нужно.

    MySqli или PDO

    Последние годы я писал сайты исключительно на фреймворках, что избавляло меня от работы с БД напрямую. Некоторое время назад начал работу над сайтом на чистом php и задался вопросом, что использовать вместо устаревшего и нерекомендованного к использованию старого расширения PHP MySQL.

    Выбирать нужно было между MySqli и PDO. После не очень длительного изучения решил остановиться на MySqli, так как, как мне тогда казалось, он полностью идентичен PDO, за исключением того, что нет возможности отказаться от MySQL в пользу чего-то другого. Как я напишу ниже это не совсем так, минимум одно заметное отличие есть.

    MySqli рекомендован к использованию самими разработчиками PHP.[1]

    ООП и процедурный интерфейс

    MySqli позволяет писать код как в ООП стиле так и в процедурном. Мне ближе ООП как и большинству из хабр сообщества, поэтому в этом статье будет использован именно он.

    Три основные класса

    MySqli имеет 3 основные класса, которые будут подробно рассмотрены в этой статье

    1. mysqli — необходим для установки соединения с БД и будет полезен, если мы хотим выполнить запросы так, как мы это делали в старом расширении MySQL;
    2. mysqli_stmt — необходим для использования новой возможности MySqli: выполнять запросы по подготовленным выражениям;
    3. mysqli_result — объединяет функции для получения результатов запросов, сделанных с помощью mysqli или mysqli_stmt.

    Рассмотрим каждый из них подробнее ниже.

    Соединение с БД

    Есть два способа.

    Способ первый. Если вам нужно просто создать соединение.

    $mysqli = new mysqli ( ‘localhost’ , ‘my_user’ , ‘my_password’ , ‘my_db’ ) ;
    if ( $mysqli -> connect_error ) <
    die ( ‘Connect Error (‘ . $mysqli -> connect_errno . ‘) ‘ . $mysqli -> connect_error ) ;
    >

    Способ второй. Если вам нужно использовать опции соединения.

    $mysqli = mysqli_init ( ) ;
    if ( ! $mysqli ) <
    die ( ‘mysqli_init failed’ ) ;
    >

    if ( ! $mysqli -> options ( MYSQLI_INIT_COMMAND , ‘SET AUTOCOMMIT = 0’ ) ) <
    die ( ‘Setting MYSQLI_INIT_COMMAND failed’ ) ;
    >

    if ( ! $mysqli -> real_connect ( ‘localhost’ , ‘my_user’ , ‘my_password’ , ‘my_db’ ) ) <
    die ( ‘Connect Error (‘ . $mysqli -> connect_errno . ‘) ‘ . $mysqli -> connect_error ) ;
    >

    С помощью $mysqli->connect_errno и $mysqli->connect_error мы получаем описание и код ошибки, возникших при соединении. И new mysqli() и $mysqli->real_connect() при ошибках соединений вызывают ошибку PHP Warning. Поэтому вывод ошибок с помощью выше упомянутых функций имеет смысл, если у вас отключено отображение ошибок PHP, например, на рабочем сервере, либо если вам нужно как-то обработать эти данные. Я упомнил здесь об этом, потому что не все функции MySQLi вызывают PHP Warning в случае ошибки, и для того что бы узнать, что произошла ошибка необходимо обязательно обращаться к специальным функциям, об этом ниже.

    Полученный при соединении объект мы присвоили переменной $mysqli, для того чтобы использовать его в дальнейшем. Это очевидно для ООП стиля, но и для процедурного стиля этот объект также необходим, в этом отличие от устаревшего расширения MySQL, где ссылку на соединение необязательно было передавать при каждом использовании mysql функций.

    Буферизированные и не буферизированные результаты

    Прежде чем рассказывать дальше, хотелось бы объяснить разницу между этими двумя типами результатов.

    Рассмотрим небуферизированный результат. В этом случае вы можете начинать читать результаты, не дожидаясь пока mysql сервер получит результат полностью.

    Преимущества:

    • Результат можно начинать читать раньше, сокращается время ожидания;
    • Результат не занимает место в оперативной памяти.

    Недостатки:

    • Невозможно узнать, сколько строк получено;
    • Невозможно передвигаться к определенному результату, то есть можно читать данные только с начала и по порядку;
    • Нельзя выполнять других запросов, пока не закрыт этот результат.

    Буферизированный результат лишен этих недостатков и соответственно лишен перечисленных преимуществ.

    «Классические» запросы

    В MySqli оставили возможность «классических» запросов: когда пользователю предлагается самостоятельно заниматься безопасностью передаваемых запросов так, как это было в устаревшем расширении MySQL. Для этого предлагается использовать функцию $mysqli->real_escape_string(), с помощью которой необходимо обрабатывать все данные перед помещением их в запрос.

    Так же как и с соединением есть два способа сделать такой запрос короткий и длинный.

    $result = $mysqli -> query ( ‘текст запроса’ , MYSQLI_USE_RESULT ) ;

    Возможные константы:
    MYSQLI_STORE_RESULT – вернет буферизированный результат, значение по умолчанию
    MYSQLI_USE_RESULT – небуферизированный

    $mysqli -> real_query ( ‘текст запроса’ ) ;
    echo ( $mysqli -> field_count ) ; // вернет количество столбцов, в результате,
    // можно получить до начала получения результата, что дает дополнительную гибкость
    // по сравнению c коротким способом, разумеется, вызывать не обязательно
    $result = $mysqli -> use_result ( ) ; // вернет небуферизированный результат
    // или
    $result = $mysqli -> store_result ( ) ; // вернет буферизированный результат

    Функции $mysqli->use_result() или $mysqli->store_result() так же используются при мульти запросах (запросах состоящих из нескольких запросов). Мульти запросы в этой статье рассмотрены не будут.

    И тот и другой синтаксисы вернут результат в виде объекта mysqli_result, который представляет собой удобный интерфейс для работы с результатом, как с буферизированным так и не с небуферизированным.

    Как я писал выше, не все функции MySQLi выбрасывают ошибки PHP, описанные выше функции из их числа. В случае если запрос неверный и сервер вернул ошибку, PHP не даст об этом знать. Для проверки используйте функции:

    • $mysqli->error – описание ошибки
    • $mysqli->errno – код ошибки

    $city = $mysqli -> real_escape_string ( $city ) ;
    $mysqli -> query ( «SELECT * FROM `city` WHERE ` >$city ‘» ) ;
    if ( $mysqli -> errno ) <
    die ( ‘Select Error (‘ . $mysqli -> errno . ‘) ‘ . $mysqli -> error ) ;
    >

    Преимущества «классического» синтаксиса запросов:

    1. Он значительно более компактен, чем подготовленные выражения (класс mysqli_stmt);
    2. Он позволяет получить небуферизированный результат в виде mysqli_result. Подготовленные выражения позволяют получить только буферизированный результат mysqli_result, а с небуферизированным придется работать средствами mysqli_stmt, который значительно менее гибкий, чем mysqli_result.

    Практическое применение «классического» синтаксиса запросов я вижу:

    1. В не буферизированных запросах, если вам хочется использовать преимущества работы с mysqli_result;
    2. В запросах INSERT, UPDATE, REPLACE или DELETE, если для вас предпочтителен их более короткий синтаксис.

    Для таких запросов будут полезны свойства:

    • $mysqli->affected_rows – количество затронутых строк предыдущим запросом не на выборку
    • $mysqli->insert_id – автоматически сгенерированный ID для последнего запроса вставки.

    Подготовленные запросы

    Преимущества подготовленных запросов над «классическими»:

    • При серии запросов, в которых меняются лишь данные, запрос передается на сервер только один раз, в дальнейшем посылаются только изменяющиеся данные;
    • Защита от SQL-инъекций.

    За работу с подготовленными запросами в MySQLi отвечает класс mysqli_stmt.

    Два способа создания подготовленного запроса.

    // первый способ — используя объект mysqli
    $mysqli -> prepare ( «SELECT * FROM `sk2_articles` WHERE ` > ) ;
    if ( $mysqli -> errno ) <
    die ( ‘Select Error (‘ . $mysqli -> errno . ‘) ‘ . $mysqli -> error ) ;
    >

    // второй способ — используя объект mysqli_stmt
    $stmt = $mysqli -> stmt_init ( ) ;
    $stmt -> prepare ( «SELECT * FROM `sk2_articles` WHERE ` > ) ;
    if ( $stmt -> errno ) <
    die ( ‘Select Error (‘ . $stmt -> errno . ‘) ‘ . $stmt -> error ) ;
    >

    Различия в том, для какого объекта вызываются функции получения информации об ошибке. Мне второй способ кажется удобнее, потому что проверки на ошибки можно объединить в один блок if c другими функциями mysqli_stmt. Как это сделать будет видно в примерах ниже.

    $id_min = 81 ;
    $id_max = 88 ;
    $stmt = $mysqli -> stmt_init ( ) ;
    if (
    // подготовливаем запрос, там куда будут вствлятся данные отмечаем символом ? (плейсхолдоры)
    ( $stmt -> prepare ( «SELECT title FROM sk2_articles WHERE id > ? and id ) === FALSE )
    // привязываем переменные к плейсхолдорам
    or ( $stmt -> bind_param ( ‘ii’ , $id_min , $id_max ) === FALSE )
    // отрправляем даные, которые на данный момент находятся в привязанных переменных
    or ( $stmt -> execute ( ) === FALSE )
    // привязывем переменую для получения в нее результата
    or ( $stmt -> bind_result ( $title ) === FALSE )
    // делаем запрос буферизированным,
    // если бы этой строки не было, запрос был бы небуферезированым
    or ( $stmt -> store_result ( ) === FALSE )
    // получение результата в привязанную переменную
    or ( $stmt -> fetch ( ) === FALSE )
    // закрываем подготовленный запрос
    or ( $stmt -> close ( ) === FALSE )
    ) <
    die ( ‘Select Error (‘ . $stmt -> errno . ‘) ‘ . $stmt -> error ) ;
    >
    echo $title ;

    Несколько пояснений к выше написанному коду.

    1. В $stmt->bind_param() первым параметром указываем тип привязываемых данных (i – integer, d — double, s – строка). Вторым и последующим указываются переменные, которые будет привязаны к соответствующим плейсхолдорам, объявленным в $stmt->prepare() символами «?» в том порядке, в каком они указаны в $stmt->prepare(). Это заметное отличие от PDO, где плесхолдоры могут быть именованными, а значит не зависят от порядка объявления.
    2. $stmt->bind_result по-моему самое слабое место класса mysqli_stmt, так как оно обязывает знать, какие именно данные будут получены из запроса и каком порядке они объявлены в запросе. Для случая “SELECT * FROM …” он вряд ли применим. Гораздо более гибкий подход в работе с результатом предлагает класс mysqli_result. Чтобы быть окончательно объективным, стоит упомянуть, что можно воспользоваться функцией $stmt->result_metadata() получить mysqli_result содержащий только о метаданные без самих данных, и посмотреть что за столбцы получены, но этот подход мне кажется излишне сложным, и о нем я упомянул только, чтобы избежать обвинений в неточной информации.
    3. $stmt->store_result(), как я написал в комментарии к строке, необязательный и нужен для того, чтобы можно было использовать такие функции как:
      • $mysqli_stmt->num_rows – количество полученных строк к результате,
      • $stmt->data_seek – перемещение внутреннего указателя на заданную строку результата,
      • $stmt->free_result() – и не забудьте вызвать освобождение памяти если вы использовали $stmt->store_result().

    4. $stmt->fetch() возвращает TRUE/FALSE если данные были получены удачно/неудачно, и NULL если данных больше нет.
    5. Не все функции, объединенные в блок if, в случае ошибки помещают ее в $stmt->error, некоторые вызывают PHP Warning, но все из них в случае неудачи возвращают FALSE, поэтому мне кажется эта конструкция удачной. Если вам нужно выполнить несколько раз $stmt->execute() или $stmt->fetch(), то так сделать не получится.
    6. Не зависимо от того, был ли запрос буферизированный или нет, доступны следующие свойства:
      • $stmt->field_count — количество столбцов в результате,
      • $stmt->affected_rows – количество затронутых строк предыдущим запросом не на выборку,
      • $stmt->insert_id – автоматически сгенерированный id предыдущей вставки.

    Изменим код так, чтобы получить результат в виде экземпляра объекта mysqli_result.

    $id_min = 81 ;
    $id_max = 88 ;
    $stmt = $mysqli -> stmt_init ( ) ;
    if (
    ( $stmt -> prepare ( «SELECT title FROM sx2_links WHERE id > ? and id ) === FALSE )
    or ( $stmt -> bind_param ( ‘ii’ , $id_min , $id_max ) === FALSE )
    or ( $stmt -> execute ( ) === FALSE )
    // получение буферизированного результата в виде mysqli_result,
    // небуферизированный результат получить нельзя, о чем я писал в недостатках
    or ( ( $result = $stmt -> get_result ( ) ) === FALSE )
    or ( $stmt -> close ( ) === FALSE )
    ) <
    die ( ‘Select Error (‘ . $stmt -> errno . ‘) ‘ . $stmt -> error ) ;
    >
    $row = $result -> fetch_row ( ) ;
    echo $row [ 0 ] ;

    Класс mysqli_result и работа с результатом с помощью него

    Как было показано выше, объект mysqli_result вы могли получить как с помощью «классического» запроса с помощью класса mysqli, тогда он может быть как буферизированный так и небуферизированный, так и с помощью класса mysqli_stmt, тогда он буферизированный. От того какой результат вы получили, зависит работа функций этого класса, поэтому нужно хорошо понимать, что если ваш запрос небуферизированный вы не располагаете всем результатом и соответственно не можете знать сколько строк в результате, и читать его можно только по-порядку строка за строкой.

    Набор функций в этом классе покажется знакомым по-старому расширения:

    • $result->fetch_row() – получает текущий ряд результата в виде нумерованного массива,
    • $result->fetch_assoc() – в виде ассоциативного массива,
    • $result->fetch_array() – тип массива задается константой,
      1. MYSQLI_ASSOC – ассоциативный,
      2. MYSQLI_NUM – нумерованный,
      3. MYSQLI_BOTH – оба,

    • $result->fetch_object() – строка результата в виде объекта.

    Про $result->fetch_object() хотелось бы поговорить отдельно. У этой функции есть два параметра, оба необязательные:

    • class_name – имя класса, на основе которого будет создан объект,
    • params – массив параметров, которые будут переданы конструктору при создании объекта.

    Как видите, передать конструктору класса предположим ассоциативный массив одной строки результата с помощью этой функции не получится. Она сама за вас присвоит свойствам класса, совпадающие с названиями полей результаты. Если свойства класса не будет найдено, оно создается динамически, с областью видимости public.

    class Book
    <
    private $some1 ;
    public $some2 ;
    protected $id ;

    function __construct ( $param1 , $param2 ) <
    $this -> some1 = $param1 ;
    $this -> some2 = $param2 ;
    >
    >
    $book = $result -> fetch_object ( ‘Book’ , array ( 1 , 2 ) ) ;
    var_dump ( $book ) ;

    object ( Book ) [ 4 ]
    private ‘some1’ => int 1
    public ‘some2’ => int 2
    protected ‘id’ => int 382

    Переход с mysql на mysqli на PHP

    Здесь могла бы быть ваша реклама

    Покинул форум
    Сообщений всего: 4574
    Дата рег-ции: Июль 2006
    Откуда: Israel

    Секрет
    Теперь, когда вы уже наверняка второпях отправили свой запрос,
    я расскажу вам простой секрет, который сэкономит вам уйму ожиданий,
    даже если первый ответ по теме последуем сразу же.

    Само собой я знаю что ответят мне тут же, и если я посмотрю
    на сообщения на форуме, то пойму что в общем то я и не ошибаюсь.
    Но еще я точно замечу, что очень мало тем, в которых всего два ответа :
    вопрос автора и еще два сообщение вида Ответ + Спасибо

    После этого приходится начинать уточнять этим неграмотным что мне надо.
    Они что, сами читать не умеют? А уточнять приходится.
    И иногда пока они переварят то что я им скажу проходит и не одна ночь..

    Уверен что если бы я им сказал что у меня есть
    фиолетовый квадрат, и нужно превратить его в синий треугольник
    и я пытался взять кисточку, макнуть в банку и поводить ей по квадрату
    но почему то кисточка не принимала цвет краски в банке,
    то на мой вопрос — где взять правильные банки мне бы ответили гораздо быстрее
    предложив её открыть, а не тратить еще стольник на жестянку.

    Поэтому с тех пор я строю свои вопросы по проверенной давным давно схеме:
    Что есть
    Что нужно получить
    Как я пытался
    Почему или что у меня не получилось.

    На последок как оно происходит на форумах

    Новичок: Подскажите пожалуста самый крепкий сорт дерева! Весь инет перерыл, поиском пользовался!
    Старожил: Объясни, зачем тебе понадобилось дерево? Сейчас оно в строительстве практически не используется.
    Новичок: Я небоскрёб собираюсь строить. Хочу узнать, из какого дерева делать перекрытия между этажами!
    Старожил: Какое дерево? Ты вообще соображаешь, что говоришь?
    Новичок: Чем мне нравиться этот форум — из двух ответов ниодного конкретного. Одни вопросы неподелу!
    Старожил: Не нравится — тебя здесь никто не держит. Но если ты не соображаешь, что из дерева небоскрёбы не строят, то лучше бы тебе сначала школу закончить.
    Новичок: Не знаите — лучше молчите! У меня дедушка в деревянном доме живёт! У НЕГО НИЧЕГО НЕ ЛОМАЕТСЯ.
    Но у него дом из сосны, а я понимаю, что для небоскрёба нужно дерево прочнее! Поэтому и спрашиваю. А от вас нормального ответа недождёшся.
    Прохожий: Самое крепкое дерево — дуб. Вот тебе технология вымачивания дуба в солёной воде, она придаёт дубу особую прочность:
    Новичок: Спасибо, братан! То что нужно.

    Отредактировано модератором: Uchkuma, 26 Апреля, 2011 — 10:21:12

    SLUSAR.SU

    Логово Программиста

    Изучаем PHP 7. №31. Работа с MySQL. Подключение и выборка данных. MySQLi.

    Привет, ребята! Я тут с ужасом осознал, что с сентября не продолжал публиковать мини уроки. У всего есть причина, но продолжим наш курс.

    В прошлый раз мы создали мини базу данных пользователей. Если вы этого еще не сделали, то прошу посмотреть прошлый урок по ссылке: http://slusar.su/izuchaem-php-7-n30-rabota-s-mysql-i-phpmyadmin/

    Итак, нам нужна готовая база на запущенном OpenServer. Далее, создадим для нашего будущего мини сайтика и назовем ее dbcon.loc.

    В папке создаем всего два файла: index.php и func.php.

    Мы напишем с вами простенькое приложение, которое будет добавлять в базу данные и удалять из базы определенную запись.

    Итак сделаем каркас с формой добавления. Index.php на начальном этапе выглядит так:

    Мы подключили к нашей главной странице файл с функциями в самом верху. Теперь добавим подключение к базе в func.php

    Если на данном этапе не возникло ошибок, тогда идем дальше. Нам нужно создать переменную для глобальных сообщений. И функцию добавления пользователей. А также проверять POST, не пришли ли нам данные для добавления.

    Теперь наш func.php выглядит так

    Настал черед вывести все наши данные на экран, а также не забыть про кнопку удаления. Все это безобразие по сути завершит наш функционал. И теперь наш func.php выглядит так:

    И добавляем в наш index вывод материалов простой строчкой. А также второй закрываем все соединения с базой данных.

    Теперь код главной страницы выглядит так:

    Вот и все. У вас должно получится примерно следующее:

    Конечно все можно сделать проще и красивее. Но моя задача показать вам самое простое взаимодействие с базой, чтобы у вас сложилось представление, как это работает. Будут вопросы, задавайте их на форуме: http://forum.slusar.su/forum3-voprosy-po-php.html

    3 идей о “ Изучаем PHP 7. №31. Работа с MySQL. Подключение и выборка данных. MySQLi. ”

    Дэвид Скляр Изучаем PHP 7. Руководство по созданию интерактивных веб-сайтов #book@proglib

    А как сделать вывод к примеру конкретной записи. К примеру ввожу имя он мне выводит строки где совподает имя которое я ввел

    Добавить комментарий Отменить ответ

    Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.

    Илон Маск рекомендует:  Что такое код createdialogindirect
    Понравилась статья? Поделиться с друзьями:
    Кодинг, CSS и SQL