2017-02-21 8 views
1

Работа на веб-сайте PHP, и я столкнулся с проблемой эффективности, которую я не могу решить самостоятельно.Правильный способ иметь несколько функций php для запроса одной (mysql) базы данных

У меня есть несколько отдельных файлов PHP:

  • connection.php - подключается к базе данных.
  • sqlFunctions.php - пара функций, которые выполняют разные запросы sql (mysqli), обрабатывают данные и возвращают их.
  • index.php - файл, который выполняет некоторые функции из sqlFunctions.php и использует возвращаемые значения для отображения чего-либо на странице.

connection.php:

$servername = "DATA"; //Replaced to "DATA" for posting on stackoverflow 
$username = "DATA"; 
$password = "DATA"; 
$dbname = "DATA"; 

$con = new mysqli($servername, $username, $password, $dbname); 

if ($con->connect_error) { 
    die("Connection failed: " . $con->connect_error); 
} 

sqlFunctions.php:

<?php 
    function query1(){ 
     require('connection.php'); 
     //PDO Query to DB, fetch, store, modify data etc. 
     mysqli_close($con); 
     //Return modified data 
    } 
    function query2(){ 
     require('connection.php'); 
     //PDO Query to DB, fetch, store, modify some other data etc. 
     mysqli_close($con); 
     //Return modified data 
    } 
?> 

index.php:

//Simplified version 
require('sqlFunctions.php'); 
<?php echo query1();?> 

Итак, я думал - инициирование нового соединения с db при каждом вызове функции - не очень хорошая идея. И если бы я инициировал соединение с db в функции в sqlFunctions.php - мне нужно было бы передать другую переменную/ссылку/указатель (вы знаете, что я имею в виду) для каждой отдельной функции в этом файле, и это то, что Я не хочу этого делать.

Итак, каков наилучший подход к достижению того, что мне нужно?

TL; DR ;:

  • Основной файл вызывает функцию в отдельном файле
  • Эта функция выполняет запрос и возвращает данных SQL
  • Возвращается данные отображаются
  • Без открытия/закрытие соединения db при каждом вызове функции.
+0

Пища для размышления: https://www.youtube.com/watch?v=3_alwb6Twiw – mickmackusa

ответ

-1

Имеется несколько вариантов.

Вариант 1. Объявите глобальное подключение к базе данных внутри каждой функции.

sqlFunctions.php:

<?php 

    require('connection.php'); 

    function query1(){ 
     global $con; 
    // mysqli code with $con 
    } 
    function query2(){ 
     global $con; 
     // mysqli code with $con 
    } 
?> 

Вариант 2. Использование GLOBALS.

connection.php:

... 

$GLOBALS['con'] = new mysqli($servername, $username, $password, $dbname); 

... 

sqlFunctions.php:

<?php 

    require('connection.php'); 

    function query1(){ 
    // mysqli code with $GLOBALS['con'] 
    } 
    function query2(){ 
     // mysqli code with $GLOBALS['con'] 
    } 
?> 

Вариант 3. Оберните все функции в класс (отметьте капитал S).

SqlFunctions.php:

class SqlFunctions { 
    protected $con; 

    public function __construct() { 
     global $con; 
     // can also pass $con as parameter or init db here 
     $this->con = $con; 
    } 

    public function query1(){ 
     // mysqli code with $this->con 
    } 

    public function query2(){ 
     // mysqli code with $this->con 
    } 
} 

index.php:

require('SqlFunctions.php'); 
$sqlFunctions = new SqlFunctions(); 

<?php echo $sqlFunctions->query1();?> 

В этом случае вы также можете инициализировать соединение прямо внутри класса или передать его в качестве параметра __construct().

+0

Спасибо! Варианты 1 и 2 - это то, что я искал! Кроме того, как мне пойти на закрытие соединения? Я настаиваю, что это сработает, если я напишу еще одну функцию, чтобы закрыть соединение, поскольку у меня будет соединение как глобальная переменная? – KlaudijusM

+0

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

+0

Это своеобразный ответ, когда вам удалось дать 3 решения, предлагающих только один –