使用include / require连接数据库

时间:2017-02-20 10:25:49

标签: php mysql mysqli

我有以下代码

//dsn.php

//Object Oriented way
$servername = "localhost";
$username = "root";
$password = "password";
$dbname = "database";

//check connection
$conn = new mysqli($servername, $username, $password, $dbname);

if($conn->connect_error) {
    die("could not connect:".$conn->connect_error);
}
//index.php

include 'dsn.php';

function a() {
    $sql = "sql command";
    $result = $conn->query($sql);
    //working

    $conn->close();
}

function b() {
    $sql = "sql command";
    $result = $conn->query($sql);
    //not working

    $conn->close();
}

这将显示警告并注明:

  

警告:mysqli :: query():无法获取mysqli
  注意:尝试获取非对象的属性
  警告:mysqli :: close():无法获取mysqli

然而这个有效:

include 'dsn.php';

function a() {
    $sql = "sql command";
    $result = $conn->query($sql);
    //working

    $conn->close();
}

function b() {
    include $dsn.php
    $sql = "sql command";
    $result = $conn->query($sql);
    //working

    $conn->close();
}

如何仅为DSN使用一个包含文件并在其他功能上重复使用?

修改 抱歉,我忘记提及

function a($conn) {}
function b($conn) {}

我传递了变量$ conn,但它仍然显示我上面提到的警告和通知

1 个答案:

答案 0 :(得分:1)

当您包含文件时,您可以想象在后台只是将该代码复制粘贴到当前文档中。

您的代码有2个问题......

  1. $conn变量不在函数scopea内的b中。
  2. 即使它在范围内且可访问,您也会在每次查询后关闭连接。更好的方法是打开连接,运行所有查询并在不再需要时关闭连接。
  3. 你提供的第二段代码是有效的,因为它在$conn内部创建了一个新变量b(),但这并不理想,因为它会在每次执行该函数时创建一个新的数据库连接

    这样的事情可能适合您的需求:

    include 'dsn.php';
    
    function a($conn) {
        $sql = "sql command";
        $result = $conn->query($sql);
        return $result;
    }
    
    function b($conn) {
        $sql = "sql command";
        $result = $conn->query($sql);
        return $result;
    }
    
    $aResult = a($conn);
    $bResult = b($conn);
    
    $conn->close();
    

    请注意,我们仅包含' dsn.php'一次,然后将现有连接传递给需要它的函数。