我正在开发一个项目,我收到$ 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";
答案 0 :(得分:1)
您需要将变量作为参数传递给函数。函数外部声明的变量在该函数内不可用:
function dbConnect($user, $pass, $host, $dbname) {
try {
global $dbcon;
$dbcon = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);
}
# ...
答案 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);
}
?>