у меня есть .php
файл называется db_conn.php
который устанавливает соединение с базой данных. Вот код файла.
<?php
$servername = "localhost";
$username = "root";
$password = "password";
$dbname = "db_name";
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
die("Connection failed: ");
}
else{
}
?>
Когда мне нужно сделать некоторые операции с базой данных из какого-то другого файла, например из login.php
файл, что я делаю, я использую include_once()
функция, обеспечивающая местоположение db_conn.php
в качестве параметра. Я делаю то же самое для другого файла PHP, который требует доступа к БД. У меня есть несколько сомнений относительно этой практики / метода.
1. Это нормально, так как я использую include_once()
функция и вызов сценария подключения БД более одного раза? Будут ли открываться новые соединения каждый раз? Если да, как это должно быть реализовано?
2. Если кто-то пытается включить файл из внешнего домена с помощью include_once("www.mywebsite.com/php/db_conn.php")
смогут ли они выполнять запросы БД на моей БД?
- Это нормально, так как я использую функцию include_once () и вызываю скрипт подключения к БД более одного раза? Будет ли это открыть новый
соединения каждый раз? Если да, как это должно быть реализовано?
Да, это нормально. Так как вы используете include_once
PHP автоматически распознает, что файл уже включен, пропустит второй вызов, и вы получите только одно соединение. Я бы порекомендовал изменить это на require_once
однако, так как вы хотите, чтобы скрипт немедленно завершился ошибкой, если включенный файл не найден.
- Если кто-то попытается включить файл из внешнего домена с помощью include_once («www.mywebsite.com/php/db_conn.php»), он будет
в состоянии выполнять запросы БД на моей БД?
Как правило, нет. Любой, кто запросит этот URL, просто получит пустую страницу. Однако рекомендуется размещать такие библиотечные файлы вне корневого каталога документов веб-сервера. Например:
/path/to/project
/public
index.php
/lib
db_conn.php
Здесь вы бы указали свой веб-сервер на /path/to/project/public
а затем в вашем index.php
, вы бы сделали что-то вроде:
require_once '../lib/db_conn.php';
Или, может быть:
ini_set('include_path', '/path/to/project/lib');
require_once 'db_conn.php';
Таким образом, ваш собственный код может ссылаться на файлы PHP в /lib
но они не могут быть запрошены напрямую через веб-сервер.
1. Это нормально, так как я использую функцию include_once () и вызываю скрипт подключения к БД более одного раза? Будет ли это открыть новый
соединения каждый раз? Если да, как это должно быть реализовано?
Вы должны использовать require_once("db_conn.php");
http://php.net/manual/en/function.require-once.php
Вот различия между include(), include_once(), require()
а также require_once()
Разница между require, include, require_once и include_once?
2. Если кто-то попытается включить файл из внешнего домена с помощью include_once («www.mywebsite.com/php/db_conn.php»), он будет
в состоянии выполнять запросы БД на моей БД?
Если этот параметр отключен / не разрешен по умолчанию на большинстве веб-серверов (php.ini), поэтому вы не можете использовать include
включить файлы с удаленных адресов для причины безопасности.
Если вы все еще хотите разрешить включение удаленных файлов, директива allow_url_include
должен быть установлен в On
в php.ini
Но опять же, это плохая практика с точки зрения безопасности; и, таким образом, он вообще отключен (на самом деле я никогда не видел его включенным)
Если вы хотите прочитать содержимое удаленного файла, хотя, Вы можете использовать file_get_contents
вместо этого НО это будет возвращено как чистый код HTML-разметки, не будет на стороне сервера код.