0

我正在处理一个项目,我收到 $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');
}

配置.php:

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

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

3 回答 3

1

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

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

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

阅读更多关于PHP 中的变量作用域

于 2012-07-18T18:43:04.543 回答
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();
  }
}

编辑

是的,全局变量并不是一个好主意——它们阻碍了代码重用并“污染”了命名空间,你永远不知道哪些变量存在哪些不存在,并且冒着更改在其他地方使用的变量的风险。

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

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' 并为其余参数使用空密码)。

于 2012-07-18T18:39:51.063 回答
0

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

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

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

注意:从技术上讲,您的整个 DB 交互应移至一个类以提高可移植性。

上传.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();
...

配置.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);
}
?> 
于 2012-07-18T19:25:54.763 回答