Что лучший способ состоит в том, чтобы получить доступ к базе данных от PHP? [закрытый]

Один из вариантов - написать C / C ++-оболочку, которая выполняет скрипт python на регулярной основе. Ваш конечный пользователь будет запускать исполняемый файл C / C ++, который будет работать в фоновом режиме и периодически выполнять скрипт python. Это может быть не лучшее решение и может не работать, если вы не знаете C / C ++ или хотите сохранить этот 100% -ный питон. Но это похоже на самый удобный подход, поскольку люди привыкли щелкать по исполняемым файлам. Все это предполагает, что python установлен на компьютере вашего конечного пользователя.

Другой вариант - использовать cron job / Task Scheduler, но поместить его в установщик в качестве сценария, чтобы ваш конечный пользователь не должен был сделайте это.

8
задан Anant Singh---Alive to Die 5 June 2015 в 17:56
поделиться

13 ответов

Я выбрал бы уровень абстракции базы данных MDB2 из ГРУШИ - это предоставляет хороший, абстрактный метод для контакта с базой данных. Я рекомендую это, так как это позволяет Вам писать портативный код, который может быть портирован к другому серверу базы данных без многих требуемых изменений (для основного сценария, просто изменение вызова подключения, вероятно, будет достаточно). Это - слияние старого DB, и уровни абстракции Метабазы (DB все еще поддерживается для bugfixes, но был заменен MDB2).

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

Это будет работать с: mysql / mysqli, pgsql (PostgreSQL), oci8 (Oracle), sqllite, msql, mssql (Microsoft SQL Server), sybase, informix, fbsql, ibase, odbc.

Взгляните на документацию MDB2, чтобы видеть, как она работает.

5
ответ дан 5 December 2019 в 08:55
поделиться

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

Мне нравится сохранять это простым с PDO, параметрическим SQL и классами, которые абстрагируют возвращенный набор данных (::getActiveUsers(), ::getUserPersonalData() и т.д.).

0
ответ дан 5 December 2019 в 08:55
поделиться

Я делаю двухуровневый подход handcoded:

первый уровень является простым набором функций:

  • do_query (sql): возвращает (открытый) объект результата.
  • get_record (sql): возвращает первую запись, запрос закрывается.
  • get_datum (sql): возвращает первое поле первой записи (закрытый запрос)

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

0
ответ дан 5 December 2019 в 08:55
поделиться

Используйте структуру MVC и уровень абстракции базы данных. Таким образом, можно перейти к одному месту для завершенной переделки внутренностей класса доступа к данным при сохранении открытого интерфейса постоянным.

Необработанный SQL всюду по коду будет почти на невозможном для масштабирования.

0
ответ дан 5 December 2019 в 08:55
поделиться

Можно также хотеть рассмотреть использование CodeIgniter, миленькой платформы MVC для PHP. Это имеет и реализацию ActiveRecord и разумный набор Объектов базы данных (включая связанные переменные). Я нахожу его классы DB намного более хорошими, чем API MySQL PHP по умолчанию и немного более простыми, чем PDOs (конечно, легче установить).

1
ответ дан 5 December 2019 в 08:55
поделиться

Для выполнения команды я использовал бы функции для обычно выполняемых команд SQL. Эти функции могут затем использоваться для создания чего-то более конкретным как get_users ()

a) Сделайте функцию для каждого из запросов, которые Вы могли бы хотеть сделать, такой как

db_select($opts)

где $opts является массивом хеша с ключами:

['table_name', 'selection', 'condition', 'group_by', 'order_by', 'limit']

b) Если бы Вы использовали SQL в большой степени, то я мог бы испытать желание сделать разработчика команды SQL, который берет массив хеша и возвращает команду. Что-то как:

db_builder(array('select'=>array('customers','from'=>'bar','where'=>'foo=10')))

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

0
ответ дан 5 December 2019 в 08:55
поделиться

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

Мне нравится использовать Объектный реляционный картопостроитель (ORM), как продвиньте: http://propel.phpdb.org/trac/

Это отображает Ваши объекты прямо на схему базы данных - никакой требуемый SQL. Отображение происходит в XML-файле, Запросы происходят через объекты Критериев. Возможно перепроектировать классы PHP от базы данных или генерировать базу данных из схемы xml.

Для получения дополнительной информации о ORM в целом, см. http://en.wikipedia.org/wiki/Object-relational_mapping

0
ответ дан 5 December 2019 в 08:55
поделиться

"Это зависит"

Для моих собственных проектов я склонен использовать какую-то платформу, которая включает уровень абстракции. Для меньших проектов, которые не подходят для framewok, я просто исправил SQL в сценарии (потому что это является маленьким). В прошлый раз, когда я сделал большое приложение без платформы, я использовал PDO, поскольку это - легкая подготовленная поддержка оператора и т.д. Это - довольно легко изучаемый уровень абстракции. Я, вероятно, использовал бы его снова, если бы я принял решение не использовать платформу по некоторым причинам.

1
ответ дан 5 December 2019 в 08:55
поделиться

Кроме этого я также читал о LINQ в.NET, но не видел, что это реализовало в PHP.

Что-то как Linq еще не может быть реализовано в PHP, потому что язык испытывает недостаток в необходимых конструкциях. Своего рода "фальшивка linq" была создана, но это просто использует строки и не является "реальным" linq. И даже если это было, это - эффективно просто equivilent Linq к объектам и нет ничего там как Linq к SQL.

1
ответ дан 5 December 2019 в 08:55
поделиться

Это определенно будет зависеть от того, как большой из веб-приложения Вы пишете. Я добавлю свои ползунки для Доктрины (при соответствующем использовании). Если это - далеко маленький quick-n-dirty проект, Вам могло бы, вероятно, просто сойти с рук использование PDO.

2
ответ дан 5 December 2019 в 08:55
поделиться

Что другие шаблоны там?

ActiveRecord - Вы видите пример этого в CakePHP.

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

Если Вы создаете большое приложение с большим количеством таблиц, и отношения, с помощью чего-то как функциональность ActiveRecord CakePHP, вероятно, будут более быстрыми и легче.

Я еще не использовал уровень абстракции ГРУШИ, но это также выглядит хорошим. Пехлеви также имеет библиотеку Database в платформе Зенда.

2
ответ дан 5 December 2019 в 08:55
поделиться

То, что Вы ищете, является Объектной Реляционной моделью (ORM). Существует пара различных там:

Если бы ORM слишком много для Вашего проекта, то Вы просто отступили бы к универсальному интерфейсу БД как PDO, и сборка подготовила операторы вручную.

6
ответ дан 5 December 2019 в 08:55
поделиться

Если Вы хотите объектно-ориентированный подход, вот то, чем мой подход недавно был.

Я разделяю вещи в два класса,

Во-первых, класс DatabaseTable - берет имя таблицы, строка, которая является что ключ таблицы. Во-вторых, я создаю класс DatabaseObject, который представляет строку в DatabaseTable. DatabaseObject имеет две стандартных программы setFromRow и getAsRow. SetFromRow установит объект от ассоциативного массива седла => пары значения, и добираться, поскольку строка по существу сериализирует объект как седло => пары значения.

DatabaseTable использует setFromRow для производства DatabaseObjects, когда избранный метод называют на таблице. С другой стороны, когда этому говорят обновить или вставить данные в его таблицу, DatabsaeTable сериализирует DatabaseObject с помощью getAsRow.

Обычно то, что происходит, каждый наследовался DatabaseObject для их собственного конкретного объекта, определяет setFromRow и getAsRow, и DatabaseTable говорят название DatabaseObject для инстанцирования.

Таким образом, то, что Вы заканчиваете тем, что писали, кодируйте мудрый, является чем-то вроде этого

$dbTable = new DatabaseTable('tableName', 'uniqueid', 'InstanceType')
// dbTable manufactures an InstanceType for our use based on the select below
$dbRow = $dbTable->selectUsingId(15); 
print_r($dbRow);  // Dumps the InstanceTypeObject

Это разделяет представление данных (DatabaseObject) в моем приложении от управления таблицами базы данных (DatabaseTable). Таким образом, мой DatabaseObject может быть, в терминологии C++, простых данных.

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

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

1
ответ дан 5 December 2019 в 08:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: