PHP define()似乎无法与include()一起使用

14

我一直在尝试面向对象的PHP编程,目前有三个文件。我有一个class_lib.php文件,里面只有一个databaseServer类,还有一个index.php文件和一个definitions.php文件。我想把所有敏感的数据库信息放到definitions文件中。但是,当我这样做时,尝试连接到数据库时会出现错误:"Unkown server DB_HOST"。我的definitions文件内容如下:

<?php
define("DB_HOST","localhost");
define("DB_USER","root");
define("DB_PASS","password");
define("DB_NAME","database");
?>

然后我像这样在索引文件中使用它们:

include('definitions.php');
include('class_lib.php');

$testing = new databaseServer();

$testing->connect(DB_HOST,DB_USER,DB_PASS,DB_NAME);

我在databaseServer类中使用的函数是这样的:

    function connect($host,$user,$pw,$db) {
        $this->con = mysql_connect($host,$user,$pw);
        if (!$this->con) {
            die('Could not connect: ' . mysql_error());
            }
        $this->selectDb($db);
        }

    function selectDb($database) {
        $this->db = mysql_select_db($database,$this->con);
        if (!$this->db) {
            echo "Could not Select database: " . mysql_error();
            }
        }
任何想法为什么这样做不起作用?我还尝试将定义文件放入class_lib文件的include中,但仍然不起作用。

2
这应该可以正常工作,我从未见过它不能工作。你确定 include 文件的顺序是正确的吗?你能在 "definitions.php" 文件和索引文件中制作常量值的测试输出吗? - Pekka
@Kemo,使用大括号和include有什么问题吗? - Pekka
@Pekka 这是一种语言结构,而不是函数,因此最好不要使用大括号。 - Kemo
2
@Kemo 但是为什么呢?只要在一个项目中保持一致,我真的看不出使用带括号和不带括号之间有什么区别。有吗?毕竟,include 可以 有一个返回值。 - Pekka
@Kemo 你的意思是不要将require/include作为函数使用吗?我不确定。 @Pekka 当我尝试测试输出时,我意识到我的错误 - 我打错了文件名。不是在includes中,而是文件名本身。现在我感觉像个白痴,哈哈。 - Saladin Akara
显示剩余3条评论
7个回答

4

这应该可以很好地工作,我从未见过它不能正常工作。

  • 确保包含文件的顺序正确(定义需要先加载)

  • 在“definitions.php”文件和索引文件中制作常量值的测试输出

  • 确保您正在调用正确的文件


1
我之所以到这里,是因为我尝试了 define( "PUBLIC", __DIR__ )。当我将 PUBLIC 更改为 PUBLIC_PATH 时,它就奏效了,我注意到 public 是一个保留字 - Enrique René
检查了所有的东西,但没有成功。 - o elhajoui

2
请检查您的服务器是否支持short_open_tag,这个值应该被注释掉。我只需要将其设置为on,它就可以正常工作了。

这完全是我遇到的原因。虽然上面的示例中没有,但如果您的文件以 <? 开头而不是 <?php,在更现代的语言版本中它将不会被解析为 PHP。我在服务器操作系统更新后遇到了这个问题。 - Gordon Williams

1

工作中

<?php
define('KLINGON_SEPARATOR', '');
?>

不工作

<?php
define('KLINGON_SEPARATOR', '');

愚蠢的... IDEA 说“冗余闭合标签”


1

call it config.php

if(!$link)
{

die('Failed to connect to server: ' . mysql_error());

}

$db = mysql_select_db(DB_DATABASE);
if(!$db)
{

die("Unable to select database");

}

?>

then include("config.php"); on your pages


0

您只需要将目标文件中的define函数提取出来并转移到源文件(在您的情况下为“translation.php”),就可以开始工作了!

这样,接收字符串参数时不会发生定义函数的错误,并且您将包含已实现的常量。

我曾经遇到过这个问题,发现只有这一个解决方案。


3
把定义放在一个单独的文件中,其实是有一个非常重要的目的。 - user149341

0
今天我遇到了类似的问题,看起来可能是文件末尾有一个无效的字符代码。我在PHP define is not registering constants中找到了这个问题。他的解决方案(删除额外的空格)对我也起作用了。

-2

关键在于使用constant()函数从定义的常量中提取值:

echo constant("DB_USERNAME");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接