分离与数据库和查询的连接

时间:2019-01-04 15:59:13

标签: php

用try / catch或if / else块“封装” sql查询脚本和连接脚本的正确方法是什么?我想要一个config.php文件,其中将包含连接部分:

<?php
$servername = "localhost";
$username = "username";
$password = "password";

try {
    $conn = new PDO("mysql:host=$servername;dbname=myDB", $username, $password);
    // set the PDO error mode to exception
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo "Connected successfully"; 
    }
catch(PDOException $e)
    {
    echo "Connection failed: " . $e->getMessage();
    }
?>

现在摘自w3schools,当他们向数据库中插入值时,他们只需再次重新编写整个连接部分即可:

<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDBPDO";

try {
    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
    // set the PDO error mode to exception
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $sql = "INSERT INTO MyGuests (firstname, lastname, email)
    VALUES ('John', 'Doe', 'john@example.com')";
    // use exec() because no results are returned
    $conn->exec($sql);
    echo "New record created successfully";
    }
catch(PDOException $e)
    {
    echo $sql . "<br>" . $e->getMessage();
    }

$conn = null;
?>

但是我想适当地将两者分开。另外,如果我使用准备好的语句,是否需要检查每个部分的if?即preparebindParamexecute?或一次try / catch或if / else就足够了:

// Prepare an insert statement
$sql = "INSERT INTO table(value) VALUES (:value)";
$stmt = $conn->prepare($sql);
// Bind variables to the prepared statement as parameters
$stmt->bindParam(':value', $value, PDO::PARAM_STR);
$stmt->execute(); //does each part here need an if/else?

1 个答案:

答案 0 :(得分:0)

您只能建立一次连接。无需关闭并重新打开查询之间的连接。我认为w3schools上的示例以这种方式编写的原因是,它可以按自定义方式独立运行,而无需依赖另一个示例中建立的连接。

如果像上面显示的第一个示例那样,您具有在一个文件中定义连接的代码,则可以将include放在其他需要连接以执行查询的文件中,而$conn将在那里可用。对于一个简单的项目,这就是您真正需要的。

就if / else或try / catch而言,由于您已将连接上的PDO::ATTR_ERRMODE属性设置为PDO::ERRMODE_EXCEPTION,然后将一些代码包装在如果if / else可能导致查询失败的地方不会那么有用,因为如果查询失败,将引发异常,因此在catch块中处理该异常会更好。您可以检查异常,以确切地找出问题所在,记录该错误,并在适用的情况下向用户显示适当的错误消息。如第二个示例所示,将每个异常消息转储到屏幕上通常不是一种向用户显示适当错误消息的好方法。

您应该在try块中包括prepare,bind和execute。 execute()不是唯一会引起异常的东西。如果您不使用模拟的预备语句(取决于prepare()的设置),PDO::ATTR_EMULATE_PREPARES可能会引发异常,并且绑定也可能导致异常,例如,如果您弄乱了一个命名的占位符。

if/else对于检查成功执行的查询的结果(例如,此select语句是否返回任何记录)更有用。您需要的错误处理的详细程度决定了您需要多少个if / else,try / catch块。