Mysql Connection Class - PullRequest
       20

Mysql Connection Class

2 голосов
/ 05 апреля 2009

Я пишу некоторый php-код и часто обращаюсь к своей базе данных MySQL для чтения и обновления полей.

Мой текущий код включает в себя класс dbconnnect, и я использую его следующим образом:

class edit_data extends dbconnect {
//<some php code>
parent::connect();
//<get info from database>
parent::disconnect();
//<evaluate data>

Мой вопрос - это самый эффективный способ подключения и отключения от базы данных MySQL? (Имейте в виду, я почти всегда подключаюсь к одной и той же базе данных, поэтому нет необходимости каждый раз переопределять параметры подключения).

Я собирался запустить соединение в конструкторе, поэтому я мог просто написать

$connector = new dbconnect();

но я понял, что на самом деле не так много экономлю, верно?

Спасибо.

Ответы [ 8 ]

1 голос
/ 06 апреля 2009

Используя

$connector = new dbconnect();

а не

parent::connect();

вы по существу отделяете свой класс edit_data с классом dbconnect. Что для вас значит:

  1. теперь ваш класс edit_data может иметь более одного соединения, используя несколько объектов dbconnect (пул соединений)
  2. ваш класс edit_data может (в будущем) использовать что-то отличное от dbconnect, и ему не придется изменять какой-либо другой код. С parent :: connect (), если вы когда-нибудь перейдете к расширению какого-либо другого класса, вам нужно убедиться, что новый класс будет поддерживать существующую семантику
1 голос
/ 05 апреля 2009

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

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

0 голосов
/ 06 апреля 2009
  • Подключение стоит дорого, поэтому не подключайтесь и не отключайтесь для каждого запроса.
  • Если возможно, используйте mysqli вместо mysql, обычно он быстрее
  • Если вы используете mysql, а не mysqli, используйте mysql_pconnect вместо mysql_connect
  • php закрывает все открытые соединения с БД, поэтому нет необходимости явно делать это
  • общий доступ к соединениям между запросами независимо от того, подключены ли вы в начале скрипта или по первому запросу до.
0 голосов
/ 06 апреля 2009

Я думаю, что вывод вашего класса "edit_data" из вашего класса "dbconnect" демонстрирует путаницу логики. Является ли ваш объект редактирования данных особым типом соединения с базой данных? Или, может быть, имеет смысл сказать, что объекту редактирования данных нужно использовать соединение с базой данных? (Это разница между IS A и HAS A.)

Хотя сейчас это, кажется, выходит из моды, вы можете использовать вызов фабрики-одиночки для получения обработчика базы данных. Тогда любая функция, которая нуждается в этом, может просто вызвать ее. Если вы сделаете обработчик самостоятельно инициализирующим в первый раз, когда он должен выполнить какую-либо работу, то ничто не должно даже волноваться об инициализации. (Чтобы сделать это, проверьте, является ли переменная экземпляра, содержащая дескриптор, дескриптором ресурса - если нет, вызовите инициализатор. Не забудьте решить, что делать, если соединение не удается.) Тогда вам просто нужно, чтобы обработчик нашел его конфигурацию , Я бы сделал так, чтобы это делал фабричный вызов, а не инициализатор.

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

0 голосов
/ 06 апреля 2009

Просто убедитесь, что вы повторно используете соединение:

Просмотр параметра new_link:

Если будет выполнен второй вызов mysql_connect () с теми же аргументами, новая ссылка не будет установлена, но вместо этого будет возвращен идентификатор ссылки уже открытой ссылки. Параметр new_link изменяет это поведение и делает mysql_connect () всегда открывающим новую ссылку, даже если mysql_connect () был вызван ранее с теми же параметрами. В безопасном режиме SQL этот параметр игнорируется.

http://php.net/function.mysql-connect

0 голосов
/ 06 апреля 2009

Наша кодовая база имеет много путей и широко использует кэширование.

Мы связываемся с базой данных только при выполнении первого запроса. (так на самом деле в методе -> query ()).

Мы разрешаем PHP отключаться после завершения скрипта и не вызываем явно -> disconnect

0 голосов
/ 06 апреля 2009

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

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

Наличие разъединителя в деструкторе - правильное место.

0 голосов
/ 05 апреля 2009

«Правильный» способ, вероятно, состоит в том, чтобы сделать это подобно расширениям MySQLi и PDO - открыть соединение в конструкторе и закрыть его в деструкторе. «Эффективный» способ - проверить соединение в вашем методе query () и (r) открыть его при необходимости.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...