开发者社区> 问答> 正文

如何正确设置PDO连接

我不时看到有关连接数据库的问题。 大多数答案不是我做的方式,否则我可能只是无法正确获得答案。无论如何; 我从未考虑过,因为我的工作方式对我有效。

但是这里有个疯狂的想法;也许我做错了所有,如果是这样的话;我真的很想知道如何使用PHP和PDO正确连接到MySQL数据库并使其易于访问。

这是我的做法:

首先,这是我的文件结构(向下精简):

public_html/

  • index.php

  • initialize/
    -- load.initialize.php
    -- configure.php
    -- sessions.php
    index.php 在最顶部,我有require('initialize/load.initialize.php');。

load.initialize.php

site configurations

require('configure.php');

connect to database

require('root/somewhere/connect.php');  //  this file is placed outside of public_html for better security.

include classes

foreach (glob('assets/classes/*.class.php') as $class_filename){
    include($class_filename);
}

include functions

foreach (glob('assets/functions/*.func.php') as $func_filename){
    include($func_filename);
}

handle sessions

require('sessions.php');

我知道有一种更好或更正确的方法来包含类,但是不记得它是什么了。还没来得及研究它,但是我认为这是与之有关的autoload。像那样的东西

configure.php 在这里,我基本上只是重写一些php.ini -properties并对该站点进行其他一些全局配置

connect.php 我已经将连接放到一个类上,以便其他类可以扩展此类...

class connect_pdo { protected $dbh;

public function __construct()
{
    try {
        $db_host = '  ';  //  hostname
        $db_name = '  ';  //  databasename
        $db_user = '  ';  //  username
        $user_pw = '  ';  //  password

        $con = new PDO('mysql:host='.$db_host.'; dbname='.$db_name, $db_user, $user_pw);  
        $con->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
        $con->exec("SET CHARACTER SET utf8");  //  return all sql requests as UTF-8  
    }
    catch (PDOException $err) {  
        echo "harmless error message if the connection fails";
        $err->getMessage() . "<br/>";
        file_put_contents('PDOErrors.txt',$err, FILE_APPEND);  // write some details to an error-log outside public_html  
        die();  //  terminate connection
    }
}

public function dbh()
{
    return $this->dbh;
}

}

put database handler into a var for easier access

$con = new connect_pdo();
$con = $con->dbh();

// 我确实在这里相信,自从我最近开始学习OOP并使用PDO代替mysql以来,还有很大的改进空间。 因此,我只是遵循了一些初学者教程,并尝试了不同的方法...

sessions.php 除了处理常规会话外,我还将一些类初始化为如下所示的会话:

if (!isset($_SESSION['sqlQuery'])){ session_start(); $_SESSION['sqlQuery'] = new sqlQuery(); } 这样,该课程可在各处使用。这可能不是一个好习惯(?)... 总之,这就是我可以从任何地方做的事情:

echo $_SESSION['sqlQuery']->getAreaName('county',9); // outputs: Aust-Agder (the county name with that id in the database) 在my sqlQuery- class(即extendsmy connect_pdo- class)内部,有一个名为的公共函数getAreaName来处理对数据库的请求。 我觉得很整洁。

就像魅力一样工作, 所以基本上这就是我的做法。 此外,每当我需要从不在类内的数据库中获取某些内容时,我都会做类似的事情:

$id = 123;

$sql = 'SELECT whatever FROM MyTable WHERE id = :id'; $qry = $con->prepare($sql); $qry -> bindParam(':id', $id, PDO::PARAM_INT); $qry -> execute(); $get = $qry->fetch(PDO::FETCH_ASSOC); 由于我将连接放入connect_pdo.php中的变量中,因此我只用引用它就可以了。有用。我得到了预期的结果...

但是不管怎样;如果你们能告诉我我是否要离开这里,我将不胜感激。我应该做的是,我应该或应该改变以改进的领域等。

我渴望学习...

展开
收起
保持可爱mmm 2020-05-08 11:08:06 530 0
1 条回答
写回答
取消 提交回答
  • 目标 正如我所看到的,在这种情况下,您的目标是双重的:

    为每个数据库创建并维护一个/可重复使用的连接 确保已正确建立连接 解 我建议同时使用匿名函数和工厂模式来处理PDO连接。它的用法如下所示:

    $provider = function() { $instance = new PDO('mysql:......;charset=utf8', 'username', 'password'); $instance->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $instance->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); return $instance; };

    $factory = new StructureFactory( $provider ); 然后在其他文件中或在同一文件中的较低文件中:

    $something = $factory->create('Something'); $foobar = $factory->create('Foobar'); 工厂本身应如下所示:

    class StructureFactory { protected $provider = null; protected $connection = null;

    public function __construct( callable $provider )
    {
        $this->provider = $provider;
    }
    
    public function create( $name)
    {
        if ( $this->connection === null )
        {
            $this->connection = call_user_func( $this->provider );
        }
        return new $name( $this->connection );
    }
    

    } 这种方式将使您拥有集中式的结构,从而确保仅在需要时才创建连接。这也将使单元测试和维护过程变得更加容易。

    在这种情况下,提供程序将在引导阶段找到。这种方法还将提供一个清晰的位置,用于定义配置,以用于连接到数据库。

    请记住,这是一个极其简化的示例。您还可以从观看以下两个视频中受益:

    全球州和单身人士 不要找东西! 另外,我强烈建议您阅读有关PDO使用的适当教程(在线上有不良教程的日志)。来源:stack overflow

    2020-05-08 11:08:20
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载