变量在函数中未定义

时间:2012-07-18 18:38:45

标签: php variables undefined

我正在开发一个项目,我收到$ host,$ dbname,$ user和$ pass的未定义错误。

但只有当这些错误位于dbConnect()函数内时才会发生错误。

这是代码(upload.php):

<?php
error_reporting(E_ALL);
require('config.php');

$filename = htmlentities($_FILES['file']['name']);
$tmpname = $_FILES['file']['tmp_name'];
$filesize = $_FILES['file']['size'];
$filetype = $_FILES['file']['type'];    

function dbConnect() {

    try {
        global $dbcon;
        $dbcon = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);
    }
    catch (PDOException $e) {
        echo $e->getMessage();
    }
}

if (dbConnect()) {
    print('worked');
}

的config.php:

<?php
global $host, $user, $pass, $dbname;

$host =  "localhost"; // MySQL Hostname
$user = "root"; // MySQL User
$pass = "mypass"; // MySQL Password
$dbname = "files";

3 个答案:

答案 0 :(得分:1)

您需要将变量作为参数传递给函数。函数外部声明的变量在该函数内不可用:

function dbConnect($user, $pass, $host, $dbname) {

    try {
        global $dbcon;
        $dbcon = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);
    }
# ...

详细了解Variable Scope in PHP

答案 1 :(得分:0)

您还需要在dbConnect中声明这些变量GLOBAL。

function dbConnect() {
  try {
        global $dbcon;
        global $host, $user, $pass, $dbname;
        $dbcon = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);
  }
  catch (PDOException $e) {
        echo $e->getMessage();
  }
}

修改

是的,全局变量不是一个好主意 - 它们阻碍了代码重用和“污染”命名空间,你从来不知道哪些变量存在,哪些变量不存在,并且有可能改变在其他地方使用的变量。 / p>

解决问题的更好方法是将所需信息作为“参数”传递。这同样适用于返回值,它可以是资源(如果一切顺利)或表示错误消息的字符串。

function dbConnect($host, $dbname, $user = 'nobody', $pass = '') {
  try {
        return new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);
  }
  catch (PDOException $e) {
        return $e->getMessage();
  }
}

你会调用这样一个函数来传递参数并检查它的输出,如果一切顺利的话,它应该是一个对象:

if (!is_object($conn = dbConnect($host, $dbname, $user, $pass) {
   die("There was an error: $conn");
}

参数的另一个优点是您可以拥有参数的默认值(例如,如果您编写了dbConnect($ host,$ dbname),该函数将“理解”并使用“nobody”和其余参数的空密码)。

答案 2 :(得分:0)

我建议您使用数组来存储连接字符串信息。

首先,在config.php页面中创建一个返回必要数据库连接字符串信息的函数。要使用,您只需在upload.php $dbconfig内声明一个变量,该变量存储loadDBConfig()文件中config.php函数返回的值。然后,您将通过声明dbConnect()变量并将值设置为$dbcon来执行dbConnect()功能。这会将函数的结果返回给变量,然后您可以检查所需的结果。

此解决方案消除了对全局变量的需求并改善了组织。

注意:从技术上讲,您的整个数据库交互应该移到类中以提高可移植性。

<强> upload.php的

...
function dbConnect() {
    $dbconfig = loadDBConfig();
    try {
        $dburl = "mysql:host=" . $dbconfig['host'] . ";dbname=" . $dbconfig['dbname'];
        return new PDO($dburl, $dbconfig['user'], $dbconfig['pass']); 
    } catch (PDOException $e) {
        echo $e->getMessage();
    }
 }  

$dbcon = dbConnect();
...

<强>的config.php

<?php 
function loadDBConfig(){
    $host =  "localhost"; // MySQL Hostname 
    $user = "root"; // MySQL User 
    $pass = "mypass"; // MySQL Password 
    $dbname = "files"; 

    return array('host' => $host, 'user' => $user,  'pass' => $pass, 'dbname' => $dbname);
}
?>