2015-06-11 71 views
1

我有一個名爲User.class.php類文件和本類中我有這樣一段代碼:恆已經定義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 INSERT查詢。我有另一個名爲sign_2.php的文件,它必須執行SQL UPDATE查詢,當我執行它時也會產生相同的錯誤,但它不會執行UPDATE查詢。它運行代碼(不拋出PDOException),但查詢不會影響單個行(並且查詢在PhpMyAdmin SQL控制檯中工作)。

我不明白問題出在哪裏。 signup_2.php中的UPDATE查詢是否因爲常量錯誤而不起作用,還是其他的東西?執行signup.php時,同樣的錯誤也會出現,並且代碼完全執行INSERT查詢。

這是signup_2.php更新查詢:

$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塊執行,並不會引發任何異常,但查詢似乎並不做任何事情。我已經加倍檢查了所有的值,並在PhpMyAdmin中執行它的工作。

那麼這裏發生了什麼?我只是無法找到執行簡單的UPDATE查詢的問題。

卸下常數signup.php和signup_2.php產生以下錯誤:

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

我已經試過我知道的一切。

+0

你應該在另一個文件中定義你的常量並用'require_once()'調用這個文件。這樣你就可以在任何你想要的地方調用文件,但它們仍然只會被定義一次。 –

回答

4

你User.class.php類已經有

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

,因爲要導入User.class.php從signup.php刪除此並定義爲一種恆定值,不能更改設置一次。


其他修復 創建新的文件調用Constants.php

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

現在每個文件

include_once 'Constants.php'; 
+0

是的,但是當我這樣做時,正如我在我的問題中所述,我得到'使用未定義的常量__ROOT__ - 在signup.php中假定'__ROOT__'。 –

+0

是的,這是因爲您在導入文件之前使用的是常量。 –

+1

簡單的方法應該是創建另一個名爲constants.php的文件,並將其放在每個文件的頂部。 (第一行)包含一次聲明 –

1

的頂部取下User.class.php的define('__ROOT__'),你之前做你需要用戶類和類再次定義它,所以你已經定義錯誤