Как правильно связать php сайт с mysql?

Есть сайт, который работает без БД. Появилась необходимость выводить на его страницах информацию из таблицы mysql. Для этого я подключу с помощью include на всех его страницах в самом вверху файл с конфигом БД и с кодом подключения к ней, что-то типа:

$conn = mysqli_connect(DBHOST, DBUSER, DBPASS, DBNAME);
if (!$conn) {
  die("Connection failed: " . mysqli_connect_error());
}


Такие вопросы:

1. Нужно ли закрывать соединение mysql? Если да, то как это сделать? Включить вниз каждой страницы код mysqli_close($conn);?
2. Каждый раз когда новый пользователь будет открывать сайт или каждый раз, когда будет открываться новая страница с кодом mysqli_connect - будет создаваться новое подключение к mysql? Какая логика у этого процесса?
  • Вопрос задан
  • 645 просмотров
Решения вопроса 1
FanatPHP
@FanatPHP
Чебуратор тега РНР
На частные вопросы ответили в комментариях, поэтому ответим на вопрос из заголовка.

Чтобы соединить сайт с mysql, в РНР вообще-то есть два API - mysqli и PDO. Несколько лет назад с mysqli вообще невозможно было нормально работать, но на данный момент они выровнялись, хотя PDO все равно удобнее, по трем причинам
  1. Единый интерфейс при работе с различными СУБД (неактуально, если mysql для нас является синонимом слова база данных)
  2. Набор функций-хелперов для получения данных из БД в различных форматах (при желании легко воспроизводится вручную)
  3. Именованные плейсхолдеры (для некоторых это главная причина использовать PDO)

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

1. Создаём файл`config.sample.php` куда кладем все настройки приложения, в том числе базы данных
return [
	'db' => [
		'host' => '127.0.0.1',
		'username' => '',
		'password' => '',
		'dbname' => '',
		'port' => 3306,
		'charset' => 'utf8mb4',
	],
];

2. В файле, который включается во все скрипты сайта, добавляем код
if (!file_exists('config.php'))
{
	throw new \Exception('Create config.php based on config.sample.php');
}
$config = require 'config.php';

3. И дальше в этом же файле пишем собственно нормальный код подключения к БД
либо к mysqli
// включаем режим информирования об ошибках
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
// подключаемся к серверу
$dbc = $config['db'];
$db = new \mysqli($dbc['host'], $dbc['username'], $dbc['password'], $dbc['dbname'], $dbc['port']);
// не забываем установить кодировку, чтобы не было ошибок с кракозябрами
$db->set_charset($dbc['charset']);

либо к PDO
$options = [
    \PDO::ATTR_ERRMODE            => \PDO::ERRMODE_EXCEPTION,
    \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
    \PDO::ATTR_EMULATE_PREPARES   => false,
];
$dbc = $config['db'];
$dsn = "mysql:host=$dbc[host];dbname=$dbc[dbname];charset=$dbc[charset];port=$dbc[port]";
$pdo = new \PDO($dsn, $dbc['username'], $dbc['password'], $options);

После того как будет освоена работа с системой контроля версий (а по-хорошему это надо было сделать уже давно) добавляем config.php в файл .gitignore
Таким образом на каждом хосте, где исполняется этот код, будет собственный файл с настройками, создаваемый по образцу из config.sample.php

Да, и Очень Важное Дополнение:
почему нельзя сделать 1 соединение для сайта и не тратить каждый раз время на коннект к БД?

Никогда не следует переживать по поводу воображаемых проблем. Вот только когда создание коннекта каждый раз станет реальной проблемой, только тогда и начинать переживать по этому поводу и искать пути решения (спойлер: никогда).
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@code2003
Вы все написали верно.
Закрывать подключение не требуется.

Насчет качества тоже все допустимо. В вашем случае просто используется процедурный стиль подключения.
Можно использовать и объектно-ориентированный, как показал на примере пользователь FanatPHP
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы