2012-03-29 90 views
0

我的代碼是這樣的:定義一個常數函數調用

<?php 
define("ERROR", "SOMETHING WRONG WITH MY DATABASE"); 
... 
if (!mysql_query($q)){ 
    die(ERROR); 
} 
?> 

現在我要替換「一些與我的數據庫錯」的情況下,與mysql_error()我要調試。最簡單的方法是什麼?

這似乎不是工作的工作:define("ERROR", mysql_error());

----編輯---

我不想使用生產環境下mysql_error(),它可以幫助攻擊者弄不清與我的數據庫有關的東西?這是我使用一個常量字符串

ç的點,你可以做 #define x yourfunction() 我不知道我是否可以做同樣的PHP

+0

剛使用函數時出了什麼問題? – JJJ 2012-03-29 12:22:58

+0

@Juhana我加了我的解釋.. – w00d 2012-03-29 12:29:04

+0

'function my_error(){return mysql_error()}' - 當你活着用一個字符串替換mysql_error()'。無論如何,沒有理由嘗試使函數「不變」。 – JJJ 2012-03-29 12:30:21

回答

3

簡單的答案是:「你不能這樣做」 。整點常數是它的常數其值從未改變。如果它指向一個函數調用,該函數可以返回任何值 - 並且它不再是常量。

一個竅門,你可以做的就是定義函數調用本身是常量的值 - 然後eval它的需求,這樣的事情:

define("ERROR", "return mysql_error()"); 
... 
die(eval(ERROR)); 

然而,這的確是一個相當糟糕的代碼。你會好得多做

die(mysql_error()); 
+1

你可怕的,可怕的'eval()'將要求常量被定義爲'return mysql_error();'或者它不會輸出任何東西。但爲什麼人們會這樣做超出了我的想象。 – DaveRandom 2012-03-29 12:25:29

+0

或者按照@DaveRandom的建議,將靜態字符串添加到錯誤消息中。 – 2012-03-29 12:25:33

+0

是mysql_error()在生產環境中不安全?我不想顯示mysql錯誤,所以攻擊者可以從中得到一些東西......這是我使用常量字符串的要點。 – w00d 2012-03-29 12:25:35

1

常量應該是正是顧名思義 - 不變。你不能重新聲明一個常量,並且任何具有變量值的變量都應該存儲在 - 你猜對了 - 一個變量

但是,你可以做這樣的事情:

<?php 

    define("ERROR", "SOMETHING WRONG WITH MY DATABASE: "); 

    // ... 

    if (!mysql_query($q)){ 
    die(ERROR . mysql_error()); 
    } 

?> 
1

mysql_error()必須被調用,您正試圖趕上SQL操作之後。你不能用預先定義的常量或變量來捕捉這個錯誤。你要麼必須直接調用它,或撥打它調用它的另一個功能,像這樣:

die(mysql_error()); 

或:

define("ERROR", "Database Problem "); 

function Err() { 
    $sql_err = ERROR . mysql_error(); 
    return $sql_err; 
} 
// sql operation here, then test for error 
die(Err()); 
0

您可以使用像斯特凡建議,並添加一個DEBUG常數,你可以在產品和開發環境之間切換:

define('DEBUG', 1); 

// In the function: 
// ... 
echo ERROR; 

if (DEBUG){ 
    echo mysql_error(); 
} 

die(); 
相關問題