理解包括

时间:2015-11-06 12:03:32

标签: php

我刚刚开始编码php,我有一个关于包含文件的问题

我创建了3个文件

  

main.php

<?php
include "dbprovider.php";
$param = $_GET["q"];
if(!isset($param) || $param == ""){echo "Parameter null"; return;}

switch ($param) {
    case 'login':
        loginProc();
        break;
}

function loginProc()
{
    pdo_mysql_nonquery($somequery,$somearrayparameters);
}    
?>
  

dbprovider.php

<?php
include "config.php";
function pdo_mysql_nonquery($query,$params)
{
    $conn = new PDO("mysql:host={$host};dbname={$dbname};charset={$charset}",$dbusername,$dbpassword) or die("Couldn't connect to the database.");
    $query = $conn->prepare($query);
    return ($params == null ? $query->execute() : $query->execute($params));
}
?>
  

的config.php

<?php
$host = '127.0.0.1';
$dbusername = 'root';
$dbpassword = '';
$dbname = 'dbname';
$charset = 'utf-8';
?>

我的问题是,我必须做错事,因为当我在main.php中调用pdo_mysql_nonquery()时,我收到此错误

Notice: Undefined variable: host
Notice: Undefined variable: dbname
Notice: Undefined variable: charset
Notice: Undefined variable: dbusername
Notice: Undefined variable: dbpassword 

当我直接调用dbprovider.php并回显连接字符串时,它会打印出来。

我做错了什么?

2 个答案:

答案 0 :(得分:0)

您已包含该文件,但值未传递到您的函数。

<?php

    function pdo_mysql_nonquery($query,$params)
    {
        include "config.php";// move here
        $conn = new PDO("mysql:host={$host};dbname={$dbname};charset={$charset}",$dbusername,$dbpassword) or die("Couldn't connect to the database.");
        $query = $conn->prepare($query);
        return ($params == null ? $query->execute() : $query->execute($params));
    }

&GT;

或者将这些变量设为GLOBAL VARIABLES,以便可以在文件中的任何位置访问它们。

答案 1 :(得分:0)

您正在访问其范围之外的变量:

<?php
function pdo_mysql_nonquery($query,$params)
{
    include "config.php";
    $conn = new PDO("mysql:host={$host};dbname={$dbname};charset={$charset}",$dbusername,$dbpassword) or die("Couldn't connect to the database.");
    $query = $conn->prepare($query);
    return ($params == null ? $query->execute() : $query->execute($params));
}
?>

<?php
include "config.php";
function pdo_mysql_nonquery($query,$params)
{
    global $host;
    global $dbname;
    // and so on
    $conn = new PDO("mysql:host={$host};dbname={$dbname};charset={$charset}",$dbusername,$dbpassword) or die("Couldn't connect to the database.");
    $query = $conn->prepare($query);
    return ($params == null ? $query->execute() : $query->execute($params));
}
?>

但我建议不要使用全局变量。

作为解释,includerequire只需获取文件的内容并在当前范围内对其进行评估。

在您的特定情况下,db凭证变量是在函数上方创建的。因此无法在函数内部访问。