PDO连接和准备好的语句

时间:2015-09-05 18:46:43

标签: php mysql database pdo

问题:

我已经阅读了很多关于PDO的文章和两本书,但我似乎没有找到我的问题的答案。问题是是否有一种方法可以将数据库连接作为require_once()包含在PDO中,并且仍然可以使用没有try / catch块的预处理语句?

我目前有一个名为settings.php的文件,其中包含以下代码。

代码(settings.php):

.cpp

我将此文件放在文档根目录之外,并将其与require_once()一起包含在实际的数据库连接文件中。

代码(db.php):

<?php
  // Declaration of database connection information
  $settings = [
    'host'     => '127.0.0.1',
    'name'     => 'c9',
    'port'     => '3306',
    'charset'  => 'utf8',
    'username' => 'admin',
    'password' => 'root'
  ];
?>

问题:

由于我有文件<?php // Includes database connection information require_once('../settings.php'); // Connects to a MySQL database try { $dbh = new PDO( sprintf( 'mysql:host=%s;dbname=%s;port=%s;charset=%s', $settings['host'], $settings['name'], $settings['port'], $settings['charset'] ), $settings['username'], $settings['password'] ); // Prevents PDO to use emulated prepares and activates error // mode PDO::ERRMODE_EXCEPTION $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } // Catches errors raised by PDO catch (PDOException $e) { // Prints out errors to text file file_put_contents('errors.txt', $e->getMessage(), FILE_APPEND); // Shows generic error message to user header('Location: 404.php'); exit; } ?> ,是否可以将其包含在准备语句的其他文件中?虽然连接在一个中,但预备语句也可以在try / catch块中吗?感谢有关如何将SELECT / INSERT / UPDATE / DELETE包含在上述代码中的任何注释。

2 个答案:

答案 0 :(得分:2)

您的问题似乎很不清楚,包含高度无关的部分。比如,预准备语句和try-catch块之间没有联系,两者都与include无关。并且没有关于在代码中包含SELECT / INSERT / UPDATE / DELETE查询的特定指南 - 您只需在任何地方运行它们。

我只能做一些笔记,希望能清除你的一些困惑。

首先,阅读my article on PDO。它仍然不完整,但它可以帮助你解决问题。

现在回答你的问题。

  

是否有办法将数据库连接作为require_once()包含在PDO中,并且仍然可以在没有try / catch块的情况下使用预处理语句?

是。 在大多数情况下,根本不需要try catch块。但是,每次真正需要它时,都可以使用try catch块而没有问题。

  

是否可以将其包含在准备好的语句的其他文件中?

是。这就是运营商的目的。

  

尽管连接在一个?

,预备语句也可以在try / catch块中

是。您可以根据需要在代码中包含尽可能多的此类块。但是,在大多数情况下,根本不需要它们。

  

如何将SELECT / INSERT / UPDATE / DELETE包含在上述代码中。

在那里包含这些查询毫无意义。只需在包含db.php的行之后写下它们

答案 1 :(得分:2)

你那里有很多不必要的代码。

1)try / catch是多余的,因为默认情况下PHP会将您的错误记录到错误日志中。此外,任何有用的东西都来自execute()电话。

2)是的,你当然可以在任何你想要的地方包含你的数据库凭据,但请记住,require_once()是昂贵的,所以要计算。您可以考虑在所有其他页面上包含整个代码块,而不是仅包含凭据,然后重写其他代码。

3)上述代码中的select语句示例如下:

$stmt = $dbh->prepare("SELECT * FROM `table` WHERE `id` = :id");
$stmt->execute(array(":id"=>$id));
$results = $stmt->fetch(PDO::FETCH_ASSOC);