定义一个常数函数调用

问题描述:

我的代码是这样的:定义一个常数函数调用

<?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

简单的答案是:“你不能这样做” 。整点常数是它的常数其值从未改变。如果它指向一个函数调用,该函数可以返回任何值 - 并且它不再是常量。

一个窍门,你可以做的就是定义函数调用本身是常量的值 - 然后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

常量应该是正是顾名思义 - 不变。你不能重新声明一个常量,并且任何具有变量值的变量都应该存储在 - 你猜对了 - 一个变量

但是,你可以做这样的事情:

<?php 

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

    // ... 

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

?> 

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()); 

您可以使用像斯特凡建议,并添加一个DEBUG常数,你可以在产品和开发环境之间切换:

define('DEBUG', 1); 

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

if (DEBUG){ 
    echo mysql_error(); 
} 

die();