PDO连接/准备和执行自己的功能最佳实践


PDO connection / prep and execute in there own functions best practice

大家好,我一直在玩PDO,并且正在慢慢地将一些旧代码转换为PDO。

有点被一些事情卡住了,很难找到我需要的东西。

我陷入困境的是:

  1. 在函数或排序中具有$db,因此仅当i调用它,我只想管理这个的一个实例
  2. 检查是否execute成功,如果未成功,则返回值等

此外,任何关于以下代码的建议都将是非常完整的,因为我已经从网上收集了这些信息。

当前代码:

//Database Array
$config['db'] = array(
    'host' => 'localhost',
    'username' => 'root',
    'password' => 'root',
    'dbname' => 'root');
//New PDO
$db = new PDO('mysql:host=' . $config['db']['host'] . ';dbname=' . $config['db']['dbname'], $config['db']['username'], $config['db']['password']);
//Check connection is ok
try {
    $db->exec("SET CHARACTER SET utf8");
}
catch (PDOException $ex) {
    print "Error!: " . $ex->getMessage() . "<br/>";
    die();
}

//Update users function
function update($db, $fn, $ln, $email, $offers, $vlue, $responce) {
    $stmt = $db->prepare("insert into kkt (fName_765, lName_765, email_765, signup_765, stamp_765) values (:fname, :lname, :email, :signup,  NOW())");
    $stmt->bindParam(':fname', $fn, PDO::PARAM_STR);
    $stmt->bindParam(':lname', $ln, PDO::PARAM_STR);
    $stmt->bindParam(':email', $email, PDO::PARAM_STR);
    $stmt->bindParam(':signup', $offers, PDO::PARAM_STR);
    $stmt->execute();
    print $db->lastInsertId(); 
    $stmt = null;
}

//Test Attributes
$fn = 'test';
$ln = 'test';
$email = 'tesst@test,com';
$offers = '1';
update($db, $fn, $ln, $email, $offers, $vlue, $responce);

提前感谢的任何帮助/提示

编辑代码:

//Database Array
$config['db'] = array(
    'host' => 'localhost',
    'username' => 'root',
    'password' => 'root',
    'dbname' => 'local');
//New PDO
$db = new PDO('mysql:host=' . $config['db']['host'] . ';dbname=' . $config['db']['dbname'], $config['db']['username'], $config['db']['password']);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
//Check connection is ok
try {
    $db->exec("SET CHARACTER SET utf8");
}
catch (PDOException $ex) {
    print "Error!: " . $ex->getMessage() . "<br/>";
    die();
}

//Update users function
function update($db, $fn, $ln, $email, $offers, $vlue, $responce)
{
    $stmt = $db->prepare("insert into local (fName_765, lName_765, email_765, signup_765) values (:fname, :lname, :email, :signup, NOW())");
    $stmt->bindParam(':fname', $fn, PDO::PARAM_STR);
    $stmt->bindParam(':lname', $ln, PDO::PARAM_STR);
    $stmt->bindParam(':email', $email, PDO::PARAM_STR);
    $stmt->bindParam(':signup', $offers, PDO::PARAM_STR);
    try {
        $stmt->execute();
        print $db->lastInsertId(); //show ID
        return true;
    }
    catch (PDOException $e) {
        print "Error!: " . $e->getMessage() . "<br/>"; // show error
        return false;
    }
}

//Test Attributes
$fn = 'test';
$ln = 'test';
$email = 'tesst@test,com';
$offers = '1';

if (!update($db, $fn, $ln, $email, $offers, $vlue, $responce)) {
    echo "no update there is a slight problem";
} else {
    echo "it seemed to work";
}

看起来已经达到了目标,上面的工作原理显示它看起来像

检查执行是否成功,如果没有返回值等

就我个人而言,我更喜欢Exceptions,并且PDO可以配置为在出现错误时引发Exceptions。异常很好,因为失败语句之后的代码没有执行。如果您有一个父行,然后编写一些依赖于插入的父行的子行,这就很方便了。当无法创建父行时,您不希望写入子行。

可以通过以下操作打开:

<?php
$pdo = new PDO(/* DSN */);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ATTR_ERRMODE_EXCEPTION);

然后你会做:

<?php
try {
    $stmt->execute();
    return true;
} catch ('PDOException $e) {
    return false;
}

您可以在此处找到更多信息:http://www.php.net/manual/en/pdo.error-handling.php

在函数或排序中有$db,所以它只在我调用它时打开,我只想管理这个的一个实例

我通常使用服务容器来管理数据库连接。现有最简单的选项是Pimple。然后传递这个服务容器,服务容器只负责创建一个数据库连接。

<?php
$config = new 'Pimple;
$config['db.options'] = array(
    'host' => 'localhost',
    'username' => 'root',
    'password' => 'root',
    'dbname' => 'root');
# Calling the "share" method makes sure that the function is only called when
# 'db' is retrieved the first time.
$config['db'] = $config->share(function() use ($config) {
    return new PDO('mysql:host=' . $config['db.options']['host'] . ';dbname=' . $config['db.options'']['dbname'], $config['db.options'']['username'], $config['db.options'']['password']);
});
function update() {
     global $config;
     # Connection is only made the first time the 'db' key is accessed.
     $db = $config['db'];
     /* Do queries */
}

在函数或排序中具有$db,因此它只有在我调用时才打开它,我只想管理其中的一个实例。

在脚本开始时打开它,然后将其传递给需要它的函数。在函数内部打开新的数据库连接可能会导致后续问题。例如,如果在同一个脚本中多次使用您的函数,该怎么办?您并不希望每次调用相同的函数时都打开一个新的数据库连接。

检查执行是否成功,如果没有返回值等

至于检查PDOState::execute是否成功:

$result = $stmt->execute();

如果您查看手册,返回类型列为:

成功时返回TRUE,失败时返回FALSE。

$result = $stmt->execute();
return $result;

return $stmt->execute();

就我个人而言,我会选择:

function update($db, $fn, $ln, $email, $offers, $vlue, $responce) {
    $stmt = $db->prepare("insert into kkt (fName_765, lName_765, email_765, signup_765, stamp_765) values (:fname, :lname, :email, :signup,  NOW())");
    $stmt->bindParam(':fname', $fn, PDO::PARAM_STR);
    $stmt->bindParam(':lname', $ln, PDO::PARAM_STR);
    $stmt->bindParam(':email', $email, PDO::PARAM_STR);
    $stmt->bindParam(':signup', $offers, PDO::PARAM_STR);
    return $stmt->execute();
}

顺便说一句,当你把一个对象传递到一个函数中时,它会自动通过引用传递,这意味着你可以做一些类似的事情:

$result = update($db, $fn, $ln, $email, $offers, $vlue, $responce);
if($result){
    echo $db->lastInsertId();
}