【问题标题】:Correct way of having multiple php functions to query a single (mysql) database使用多个 php 函数查询单个(mysql)数据库的正确方法
【发布时间】:2017-07-11 19:50:02
【问题描述】:

在一个 PHP 网站上工作,我遇到了一个我自己无法解决的效率问题。

我有几个单独的 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();?>

所以我在想 - 在每个函数调用上启动与数据库的新连接并不是一个好主意。如果我要在 sqlFunctions.php 中的函数中启动与数据库的连接 - 我需要将另一个变量/引用/指针(你知道我的意思)传递给该文件中的每个函数这是我不想做的事情。

那么完成我需要的最佳方法是什么?

TL;DR;:

  • 主文件调用单独文件中的函数
  • 该函数执行 sql 查询并返回数据
  • 显示返回的数据
  • 在每次函数调用时都不会重新打开/关闭数据库连接。

【问题讨论】:

标签: php mysql database function mysqli


【解决方案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()。

【讨论】:

  • 谢谢!选项 1 和 2 正是我想要的!另外,我将如何关闭连接?我认为如果我编写另一个函数来关闭连接会起作用,因为我会将连接作为全局变量?
  • 不客气!完成所有调用后,您可以关闭连接。否则,它将在脚本结束时自动关闭。除非您稍后在同一页面上打开多个其他连接(我对此表示怀疑),否则我会让服务器为您关闭它。
  • 这是一个奇特的答案,您设法提供了 3 个解决方案,实际上只提供了一个
  • @your-common-sense 你能解释一下你的意思吗?哪些选项无效,为什么?
  • globals 与 global 完全相同。而对象解决方案将再次给您同样的问题,但现在不是使用 db 对象,而是使用您自己的对象。
猜你喜欢
  • 2011-07-08
  • 2016-09-21
  • 1970-01-01
  • 2017-01-11
  • 1970-01-01
  • 2011-09-17
  • 2018-07-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多