我可以包含一个 pdo 连接吗

问题描述 投票:0回答:4

我刚刚开始使用 PDO 进行开发,我在大多数教程中看到,每个数据库查询都打开连接,如下面的 Jeffery Ways 示例所示

$id = 5;
try {
    $conn = new PDO('mysql:host=localhost;dbname=myDatabase', $username, $password);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);   

    $stmt = $conn->prepare('SELECT * FROM myTable WHERE id = :id');
    $stmt->execute(array('id' => $id));

    while($row = $stmt->fetch()) {
        print_r($row);
    }
} catch(PDOException $e) {
    echo 'ERROR: ' . $e->getMessage();
}

我仍然可以在外部文件中进行连接并将其包含在页面顶部,就像以前的程序编码一样,然后在页面下面进行查询吗?

<?php include 'includes/db.php';?>
php pdo
4个回答
1
投票

你可能误解了他的话。打开一个连接并在整个应用程序中使用它并不是您“可以”做的事情,但实际上您应该

所以 - 是的,你做对了。

还要注意这个东西与

try {
    ...
} catch(PDOException $e) {
    echo 'ERROR: ' . $e->getMessage();
}

杰弗里教你的是错误的。切勿使用

try catch
来回显错误消息。 PHP 会处理得更好

所以,你的代码应该是这样的

include 'includes/db.php';

$stmt = $pdo->prepare('SELECT * FROM myTable WHERE id = :id');
$stmt->execute(array('id' => $id));

while($row = $stmt->fetch()) {
    print_r($row);
}

而 db.php 必须包含这样的内容

<?php
$dsn = "mysql:host=localhost;dbname=test;charset=utf8mb4";
$opt = array(
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
);
$pdo = new PDO($dsn, $username, $password, $opt);

另请注意,使用此 PDO 对象时,必须注意 变量范围。

进一步阅读:https://phpdelusions.net/pdo


0
投票

简短的回答是肯定的,

如果您更熟悉 OOPHP,可能值得创建一个包装类来帮助运行查询,但只需在文件中创建连接并包含它即可完成工作

在上面的例子中你可以输入

try {
    $conn = new PDO('mysql:host=localhost;dbname=myDatabase', $username, $password);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);   

    }
} catch(PDOException $e) {
    echo 'ERROR: ' . $e->getMessage();
}

进入您的 db.php 并运行查询

 $stmt = $conn->prepare('SELECT * FROM myTable WHERE id = :id');
 $stmt->execute(array('id' => $id));

无论您需要什么地方。

还值得一提的是,您不必将准备好的语句与 PDO 一起使用,这可以加快编码速度,但是如果您希望这样做,我强烈推荐数据库包装类

未准备好的声明

<?php
try {
    $conn = new PDO('mysql:host=localhost;dbname=myDatabase', $username, $password);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);   

    }
} catch(PDOException $e) {
    echo 'ERROR: ' . $e->getMessage();
}

$query = "
SELECT 
  col_1, 
  col_2
FROM
  table_1
WHERE
  col_3 = " . $conn->quote($_POST['input']); //the quotr is important, it escapes dangerous characters to prevent SQL injection


//this will run the query for an insert this is all thats needed
$statement = $conn->query($query);

//fetch single col
$col = $statement->fetch(PDO::FETCH_ASSOC);

//fetch all collums
$cols = $statement->fetchAll(PDO::FETCH_ASSOC);

这种方式的优点是你可以以更简单易懂的方式构建查询SQL,我不应该说我没有测试过这段代码,但理论上它应该没问题,因为这就是我处理数据库的方式

编辑: 您的常识提出了一个好观点,即

echo 'ERROR: ' . $e->getMessage();
是一个坏主意,这是为什么您永远不应该盲目复制和粘贴代码的一个很好的例子


0
投票

是的,例如:

db.php

<?php
$dsn = 'mysql:dbname=testdb;host=127.0.0.1';
$user = 'dbuser';
$password = 'dbpass';

try {
    $dbh = new PDO($dsn, $user, $password);
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage();
}

?>

来自:

http://www.php.net/manual/en/pdo.error-handling.php

然后只需包含 db.php。 我将我的连接命名为 $PDO,似乎更隐含,特别是当您为此构建准备好的语句时。


0
投票

我的解决方案:

class PDinstance
{
    private static $connection = null;
    private static function connect()
    {
        self::$connection = new PDO('mysql:host=localhost;dbname=myDatabase', $username, $password);
        return self::$connection;
    }
    public static function getconnection()
    {
        return is_null(self::$connection) ? self::connect() : self::$connection ;
    }
}

在整个脚本中将其称为:

$db = PDinstance::getconnection();

$db1 = PDinstance::getconnection();

或者任何你想给它们起的名字。它们都引用相同的数据库连接。

© www.soinside.com 2019 - 2024. All rights reserved.