常量已定义PHP

时间:2015-06-11 15:26:05

标签: php mysql sql

我有一个名为User.class.php的类文件,在这个类中我有这段代码:

<?php
    define('__ROOT__', dirname(dirname(__FILE__))); 
    require_once(__ROOT__.'/mysite/generic.php');
?>

我有另一个名为signup.php的文件,我需要使用三个类,所以我的代码看起来像这样:

<?php
    define('__ROOT__', dirname(dirname(__FILE__))); 
    require_once(__ROOT__.'/mysite/classes/dbhandler.class.php');
    require_once(__ROOT__.'/mysite/classes/User.class.php');
    require_once(__ROOT__.'/mysite/includes/password_hash.php');
?>

每次运行signup.php时都会收到此错误:

Constant __ROOT__ already defined in signup.php

我尝试过类似的东西,但这也会产生同样的错误:

<?php
    if(!defined('__ROOT__')) {
        define('__ROOT__', dirname(dirname(__FILE__)));
    }
?>

signup.php会产生错误,但会执行SQL插入查询。我有另一个名为sign_2.php的文件,它必须执行SQL UPDATE查询,当我执行它时也会产生相同的错误,但它不会执行UPDATE查询。它运行代码(不抛出PDOException),但查询不会影响单行(并且查询在PhpMyAdmin SQL控制台中可以正常工作)。

我不明白问题出在哪里。由于常量错误,signup_2.php中的UPDATE查询是否不起作用,还是其他?执行signup.php时也会出现相同的错误,并且该代码确实完美地执行了INSERT查询。

这是signup_2.php中的UPDATE查询:

$username = $_POST['username'];
$user_ip = $user->get_ip();
$activation_token = $_GET['token'];
// Date time to be used instead of SQL's NOW() function for security purposes
$datetime = date("Y-m-d H:i:s");

try {
    $sql = "UPDATE user 
            SET username=:username, 
                activation_token=:activation_token, 
                activation_date_time=:activation_date_time, 
                activation_status=:activation_status  
            WHERE activation_token=:current_activation_token";
    $stmt = $dbh->get_instance()->prepare($sql); 

    $stmt->bindParam(':username', $username, PDO::PARAM_STR);       
    $stmt->bindParam(':activation_token', $empty_activation_token, PDO::PARAM_STR);    
    $stmt->bindParam(':activation_date_time', $datetime, PDO::PARAM_STR);
    $stmt->bindParam(':activation_status', $active_status, PDO::PARAM_STR); 
    $stmt->bindParam(':current_activation_token', $activation_token, PDO::PARAM_STR);
    $stmt->execute();

    echo 'Username: ' . $username . '<br />';
    echo 'Activation token: ' . $empty_activation_token . '<br />';
    echo 'Activation date time: ' . $datetime . '<br />';
    echo 'Activation status: ' . $active_status . '<br />';
    echo 'Current activation token: ' . $activation_token . '<br />';
} 
catch(PDOException $e) {
    echo $e;
} 

try块中的所有echo都被执行,并且没有抛出异常,但查询似乎没有做任何事情。我已经仔细检查了所有的值,并且在PhpMyAdmin中执行时它可以正常工作。

那么这里发生了什么?我无法找到执行简单UPDATE查询的问题。

在signup.php和signup_2.php中删除常量会产生以下错误:

Use of undefined constant __ROOT__ - assumed '__ROOT__' in signup.php...

我已经尝试了所有我知道的事情。

2 个答案:

答案 0 :(得分:4)

您的User.class.php类已经有

define('__ROOT__', dirname(dirname(__FILE__))); 

从signup.php中删除它,因为您正在导入User.class.php并且define是一种常量值,一旦设置就无法更改。

其他修复 创建新文件调用Constants.php

define('__ROOT__', dirname(dirname(__FILE__)));

现在是每个文件的顶部

include_once 'Constants.php'; 

答案 1 :(得分:1)

从User.class.php中删除define('__ROOT__'),在您需要User类之前执行此操作,并且该类再次定义它以便您已经定义了错误