【问题标题】:PDO connection and prepared statementsPDO 连接和准备好的语句
【发布时间】:2015-09-05 18:46:43
【问题描述】:

问题:

我已经阅读了很多关于 PDO 的文章和两本书,但我似乎没有找到我的问题的答案。问题是是否有办法将与 PDO 的数据库连接包含为 require_once() 并且仍然能够在没有 try/catch 块的情况下使用准备好的语句?

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

代码(settings.php):

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

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

代码(db.php):

<?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;
  }
?>

问题:

由于我有文件db.php,是否可以将其包含在其他文件中以用于准备好的语句?尽管连接是一体的,但准备好的语句也可以在 try/catch 块中吗?了解如何将 SELECT / INSERT / UPDATE / DELETE 包含到上述代码中。

【问题讨论】:

    标签: php mysql database pdo


    【解决方案1】:

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

    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);
    

    【讨论】:

    • 什么是不必要的代码?您能否详细说明consider including the whole block of code on all your other pages instead of just including the credentials 的含义?
    • @kexxcream - 默认情况下 PHP 会做一些不必要的重复操作,例如将错误放入文件并向用户显示错误。尝试/捕获的目的是优雅地处理这些错误,你所做的并不优雅。 - 我是说你可以将整个连接块粘贴到一个文件中,然后在需要数据库连接的任何地方包含该文件。然后,不必将那个大块复制到每一页中,您只需包含那一行。
    • 在您看来,优雅的错误处理应该是什么样的?
    • 这是一个全新的问题。
    【解决方案2】:

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

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

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

    现在回答您的问题。

    是否有办法将与 PDO 的数据库连接包含为 require_once() 并且仍然能够在没有 try/catch 块的情况下使用准备好的语句?

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

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

    是的。这就是包含运算符的用途。

    尽管连接是一体的,但准备好的语句也可以在 try/catch 块中吗?

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-28
      • 1970-01-01
      • 2010-11-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多