我可以包含一个pdo连接

时间:2013-08-21 13:30:21

标签: php pdo

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

3 个答案:

答案 0 :(得分:1)

Dunno是Jeffery Ways,但如果他真的要为每个查询打开一个新连接,他显然没有任何线索。

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

所以 - 是的,你做得对。

还要注意这件事

try {
    ...
} catch(PDOException $e) {
    echo 'ERROR: ' . $e->getMessage();
}
杰弗瑞教你的话再次出错了。切勿使用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必须包含类似这样的内容

$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对象时,您必须了解variable scope.

进一步阅读:https://stackoverflow.com/tags/pdo/info

答案 1 :(得分: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,我不应该没有测试过这段代码,但理论上应该没问题,因为这是我如何进行数据库处理< / p>

编辑: 你的常识提出了一个关于echo 'ERROR: ' . $e->getMessage();是一个坏主意的好点,这是你不应该盲目复制和粘贴代码的一个主要例子

答案 2 :(得分: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();
}

?>

FROM:

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

然后只包括db.php。我将我的连接命名为$ PDO,似乎更隐含,特别是在你正在构建一个准备好的语句时。