1

我刚开始使用 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';?>
4

3 回答 3

1

不知道那个 Jeffery Ways 是谁,但如果他真的说要为每个查询打开一个新连接,他显然不知道。

打开一个唯一的连接并在整个应用程序中使用它并不是“你可以”,而是实际上唯一的方法

所以 - 是的,你做对了。

另请注意,这件事与

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

杰弗里教你的又是错误的。切勿使用 acatch来回显错误消息。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 必须包含这样的东西

$dsn = "mysql:host=localhost;dbname=test;charset=utf8";
$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 ://stackoverflow.com/tags/pdo/info

于 2013-08-21T13:40:55.990 回答
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();一个坏主意的好点,这是一个很好的例子,说明为什么你不应该盲目地复制和粘贴代码

于 2013-08-21T13:33:43.953 回答
0

是的,例如:

数据库.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,这似乎更加隐含,尤其是当您在此基础上构建准备好的语句时。

于 2013-08-21T13:35:03.353 回答