Php PDO连接/准备并在自己的功能中执行最佳实践

Php PDO连接/准备并在自己的功能中执行最佳实践,php,Php,大家好,我一直在玩PDO的,我慢慢地转换一些旧代码到这个 有些事情让我有点纠结,努力寻找我需要的东西 我遇到的问题是: //Database Array $config['db'] = array( 'host' => 'localhost', 'username' => 'root', 'password' => 'root', 'dbname' => 'local'); //New PDO $db = new PDO('mysql:h

大家好,我一直在玩PDO的,我慢慢地转换一些旧代码到这个

有些事情让我有点纠结,努力寻找我需要的东西

我遇到的问题是:

//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";
}
  • 在函数或排序中有
    $db
    ,因此只有当我 调用它,我只想管理一个实例
  • 检查是否 执行成功,如果未返回值等
  • 此外,关于以下代码的任何建议都将是非常充分的,因为我是从网络上收集到的

    当前代码:

    //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);
    
    //数据库数组
    $config['db']=数组(
    '主机'=>'本地主机',
    '用户名'=>'根',
    '密码'=>'根',
    “dbname”=>“root”);
    //新PDO
    $db=new PDO('mysql:host='.$config['db']['host'].;dbname='.$config['db']['dbname'],$config['db']['username'],$config['db']['password']);
    //检查连接是否正常
    试一试{
    $db->exec(“设置字符集utf8”);
    }
    捕获(PDO异常$ex){
    打印“错误!:”$ex->getMessage()。“
    ”; 模具(); } //更新用户功能 功能更新($db、$fn、$ln、$email、$offers、$vlue、$response){ $stmt=$db->prepare(“插入kkt(fName_765,lName_765,email_765,signup_765,stamp_765)值(: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(); 打印$db->lastInsertId(); $stmt=null; } //测试属性 $fn=‘测试’; $ln=‘测试’; $email='1tesst@test,com'; $offers='1'; 更新($db、$fn、$ln、$email、$offers、$vlue、$response);
    提前感谢您的帮助/提示

    编辑的代码:

    //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";
    }
    
    //数据库数组
    $config['db']=数组(
    '主机'=>'本地主机',
    '用户名'=>'根',
    '密码'=>'根',
    “dbname”=>“local”);
    //新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_异常);
    //检查连接是否正常
    试一试{
    $db->exec(“设置字符集utf8”);
    }
    捕获(PDO异常$ex){
    打印“错误!:”$ex->getMessage()。“
    ”; 模具(); } //更新用户功能 功能更新($db、$fn、$ln、$email、$offers、$vlue、$response) { $stmt=$db->prepare(“插入到本地(fName_765,lName_765,email_765,signup_765)值(: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(); 打印$db->lastInsertId();//显示ID 返回true; } 捕获(PDO$e){ 打印“错误!”:“$e->getMessage()。”
    “;//显示错误 返回false; } } //测试属性 $fn=‘测试’; $ln=‘测试’; $email='1tesst@test,com'; $offers='1'; 如果(!更新($db、$fn、$ln、$email、$offers、$vlue、$response)){ echo“无更新,存在轻微问题”; }否则{ 回声“它似乎起了作用”; }
    似乎正在到达那里,上面的工作看起来怎么样

    在函数或排序中有$db,因此只有在调用 它,我只想管理一个实例

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

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

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

    $result = $stmt->execute();
    
    如果查看,返回类型如下所示:

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

    我个人认为:

    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();
    }
    
    检查执行是否成功,如果未返回值等

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

    可以通过执行以下操作来启用此功能:

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

    感谢您提供的信息,因此请将$db放在原处(很抱歉,可能没有阅读您的答案),其他的都很好,谢谢。
    
    <?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;
    }
    
    <?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 */
    }