使PDO连接变量可在整个站点访问

Col*_*byd 3 php mysql sql oop

我开始将所有旧的mysql_函数转换为PDO,并且在掌握这个概念时遇到一些麻烦.我希望能够在我的函数页面中访问我的PDO连接变量,以便可以根据需要调用它,而无需在每个函数的开头创建连接脚本.我会尝试尽可能地解释我的设置.

这是我的init.php页面,它加载了所有必需的php页面.此页面包含在我的每个页面的顶部,但不包含在功能页面中.

的init.php

<?php
session_start();

error_reporting(E_All);

require 'database/connect.php';
require 'functions/users.php';
require 'functions/general.php';
require 'functions/trainer.php';
?>
Run Code Online (Sandbox Code Playgroud)

这是我的连接文件,它打开我的数据库连接.是的我也是mysql_connect开放的,因为在将所有其他功能转换为PDO时,我无法禁用所有其他功能.

connect.php

<?php 

$connect_error = 'Sorry there is a problem with the database connection.';
mysql_connect('Localhost', 'customn7', 'I<3deadlifts!') or die($connect_error);
mysql_select_db('customn7_cm') or die($connect_error) or die($connect_error);
?>

<?php   

//PDO database connect
$config['db'] = array(
    'host'      => 'Localhost',
    'username'  => 'customn7',
    'password'  => '********',
    'dbname'    => 'customn7_cm'
);

try {
$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);
$db->exec("SET CHARACTER SET utf8");
} 

catch(PDOException $e) {
echo 'ERROR: ' . $e->getMessage();
}

?>
Run Code Online (Sandbox Code Playgroud)

这是我functions/trainer.php编写函数的地方:

trainer.php

function exist_client_to_class($cd){
list($user_id, $class_id, $first_name, $last_name, $nickname) = explode('|', $cd);

try{

$stmt = $db->prepare('INSERT INTO clients 
(`user_id`, class_id, first_name, last_name, nickname, date)
VALUES (:user_id, :class_id, :first_name, :last_name, :nickname, CURDATE())
');

$stmt->execute(array(
        ':user_id' => $user_id, 
        ':class_id' => $class_id, 
        ':first_name' => $first_name,
        ':last_name' => $last_name,
        ':nickname' => $nickname)
        );
}

catch(PDOException $e) {
    echo 'Error: ' . $e->getMessage();
}

}
Run Code Online (Sandbox Code Playgroud)

截至目前,我无法$db从我的trainers.php页面访问我的变量.有人可以帮我弄这个吗?

UPDATE

以下是调用函数的代码:

// Post Selected name to current class.
if (isset($_POST['exist_to_class'])){
if (empty($_POST['client_data']) === true){
    $errors [] = 'You much select a client to be added to the class.';
} else {
    if (isset($_POST['client_data']) && !empty($_POST['client_data']));
    foreach ($_POST['client_data'] as $cd){
     exist_client_to_class($db, $cd);
     header('Location: view_class.php?class_id='.$class_id.' ');
    } // foreach $cd
} // else

} //isset
Run Code Online (Sandbox Code Playgroud)

Mad*_*iha 6

首先,我强烈建议您不要听任何人告诉您将其设置为全局.


使用参数将连接对象传递给函数:

exist_client_to_class(PDO $pdo, $cd) { //...
Run Code Online (Sandbox Code Playgroud)

这是所谓的依赖注入的简化版本.

更强大的版本包括将函数包装到类中(并从这些类中实例化对象),并将PDO对象(或某种Factory对象)传递给该对象的构造函数.然后,它将在该对象的整个方法(函数)中"全局"可用.


Law*_*one 6

如果你能提供帮助,请不要使用全球.

随着你的init.php文件的引导,你可以依赖注入连接.

改变了connect.php

<?php 
//PDO database connect
$config['db'] = array(
'host'      => 'Localhost',
'username'  => 'customn7',
'password'  => '********',
'dbname'    => 'customn7_cm'
);

try {
    $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);
    $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    $db->exec("SET CHARACTER SET utf8");
} catch(PDOException $e) {
    echo 'Sorry there is a problem with the database connection :' . $e->getMessage();
}
Run Code Online (Sandbox Code Playgroud)

trainer.php

class trainer_model{
    function __construct(PDO $db){
        $this->db = $db;
    }

    function exist_client_to_class($cd){
        list($user_id, $class_id, $first_name, $last_name, $nickname) = explode('|', $cd);

        try{
            $stmt = $db->prepare('INSERT INTO clients
        (`user_id`, class_id, first_name, last_name, nickname, date)
        VALUES (:user_id, :class_id, :first_name, :last_name, :nickname, CURDATE())');

            $stmt->execute(array(
            ':user_id' => $user_id,
            ':class_id' => $class_id,
            ':first_name' => $first_name,
            ':last_name' => $last_name,
            ':nickname' => $nickname)
            );
        }
        catch(PDOException $e) {
            echo 'Error: ' . $e->getMessage();
        }
    }
}


$trainer = new trainer_model($db);
//Then use as an object method
$trainer->exist_client_to_class($cd);
Run Code Online (Sandbox Code Playgroud)