【问题标题】:How to keep connection between SQL Server and PHP? [duplicate]如何保持 SQL Server 和 PHP 之间的连接? [复制]
【发布时间】:2020-12-11 14:35:07
【问题描述】:

我有 2 个文件 login.phpemployee.php

当我登录网站时,我会创建一个到我的数据库的连接。如何保持这种连接,以便我可以在employee.php 文件中调用一些查询语句?

这是login.php

<?php
if (isset($_POST["login"])) {
    $server_name = "my-server.database.windows.net";
    $user_name = $_POST['user_email'];
    $password =  $_POST['user_password'];
    $connection = array("Database"=>"BankingDB", "UID"=>$user_name, "PWD"=>$password);

    $conn = sqlsrv_connect($server_name, $connection);

    if ($conn) {
        session_start();
        $_SESSION['user_name'] = $user_name;
        $_SESSION['password'] = $password;
        setcookie("type", $user_name, time() + 3600);
        header("location:index.php?page=employee");
    }
    else {
        echo "<div class='alert alert-danger'>Wrong Email Address or Password!</div>";
        die(print_r(sqlsrv_errors(), true));
    }
}
?>

这是employee.php

<?php
session_start();
$server_name = "my-server.database.windows.net";
$connection = array("Database"=>"BankingDB", "UID"=>$_SESSION['user_name'], "PWD"=>$_SESSION['password']);
$conn = sqlsrv_connect($server_name, $connection);

if ($conn) {
    echo "Connection established: " . $server_name;
}
else {
    echo "Connection could not be established";
    die(print_r(sqlsrv_errors(), true));
}
$id = $_GET['employee_id'];
$sql = "SELECT EmployeeName, EmployeeCode FROM Employee WHERE EmployeeCode = $id;";
    $query = sqlsrv_query($conn, $sql);
    $row = sqlsrv_fetch_array($query);
?>

我可以用$_SESSION 变量保存user_namepassword。我也有许多文件也使用此连接。

我确实尝试将$conn 存储在$_SESSION 中,但它不起作用。

<?php
    // login.php
    $conn = sqlsrv_connect($server_name, $connection);
    $_SESSION['connection'] = $conn;
?>

我怎样才能保持这种连接,这样我就不必每次需要查询时都重新连接到数据库?

【问题讨论】:

  • 自从我使用 PHP 以来已经 long 时间(可能是十年),但是,我记得“规范”是将连接详细信息存储在单独的文件中和include 在需要它的页面中。您真的不应该在每个页面中重新声明连接详细信息;如果这些连接细节发生变化,那将是一场噩梦。
  • 您可以使用类中的公共静态属性来存储您的连接。所以你也许可以从每个文件中访问它。
  • 警告:您对SQL Injections 持开放态度,应该使用参数化的prepared statements,而不是手动构建查询。它们由PDO 提供。永远不要相信任何形式的输入!即使您的查询仅由受信任的用户执行,you are still in risk of corrupting your dataEscaping is not enough!
  • 你不能那样做。您必须在每个请求上打开一个新连接。

标签: php sql-server


【解决方案1】:

在你的配置文件中你可以定义一些常量

<?php
define('DBHOST', 'your-dbhost');
define('DBNAME', 'your-dbname');
define('DBUSER', 'your-dbuser');
define('DBPASS', 'your-dbpass');
?>

如果您喜欢使用 PDO... 创建一个使用单例模式创建连接并将其存储在变量中的 DB 类。

<?php

class DB extends PDO {
    /**
     * Singleton instance of this class.
     * @var PDO
     */
    private static $instance;

    /**
     * @return PDO
     */
    public static function getInstance(): PDO {
        if (self::$instance !== null) {
            return self::$instance;
        }

        $dsn = 'mysql:host='.DBHOST.';dbname='.DBNAME.';charset=utf8';

        $opt = [
            self::ATTR_ERRMODE => self::ERRMODE_EXCEPTION,
            self::ATTR_DEFAULT_FETCH_MODE => self::FETCH_ASSOC,
            self::ATTR_EMULATE_PREPARES => false,
        ];

        self::$instance = new self($dsn, DBUSER, DBPASS, $opt);

        return self::$instance;
    }
}
?>

现在您可以在每个文件中使用您的连接

<?php
$db = DB::getInstance();

$db->select(...);

?>

【讨论】:

  • 谢谢,我会用我的代码试试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-10
  • 1970-01-01
  • 2017-11-09
  • 2014-04-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多