首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用包含/要求连接数据库

问使用包含/要求连接数据库
EN

Stack Overflow用户
提问于 2017-02-20 10:25:48
回答 2查看 1.9K关注 0票数 0

我有下面的代码

代码语言:javascript
复制
//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);
}
代码语言:javascript
复制
//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

然而,这一条起作用了:

代码语言:javascript
复制
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中只使用一个包含文件,并在其他函数上重复使用?

编辑抱歉我忘了提

代码语言:javascript
复制
function a($conn) {}
function b($conn) {}

我传递变量$conn,但它仍然显示前面提到的警告和注意事项。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-02-20 10:32:40

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

你的代码有两个问题..。

  1. $conn变量不在函数a或b中的scope中。
  2. 即使它在作用域和可访问性中,在每次查询之后也会关闭连接。更好的方法是打开连接,运行所有查询,并在不再需要连接时关闭连接。

您给出的第二段代码之所以有效,是因为它在b()中创建了一个新变量b(),但这并不理想,因为每次执行该函数时,它都会创建一个新的数据库连接。

像这样的东西可能适合你的需要:

代码语言:javascript
复制
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”一次,然后将现有的连接传递到需要它的函数。

票数 1
EN

Stack Overflow用户

发布于 2017-02-20 10:33:30

这很简单。在页面加载时,包含连接文件,使$conn成为其余代码可用的连接对象。$conn由functiona()使用,然后在函数的末尾关闭。$conn->close();破坏数据库连接对象意味着,$conn不再是对象,因此不应将其视为对象。但是Function b()将其作为数据库连接对象处理,并导致错误。

但是,如果您再次包含连接文件,在函数b()中,则$conn作为本地对象可用于该函数。并发挥其应有的作用。

在处理DB之前,不要关闭任何函数上的$conn()。

代码语言:javascript
复制
function a() {
   incDbConnectionFile();
   $sql = "sql command";
   $result = $conn->query($sql);
   //working

   $conn->close();
}

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

   $conn->close();
}


function incDbConnectionFile() {
  include 'dsn.php';
}
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42342036

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档