定义一个常量函数调用


Define a constant function call

我的代码如下:

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

现在我想用mysql_error()替换"我的数据库有问题",以防我想调试它。最简单的方法是什么?

这似乎不起作用:define("ERROR", mysql_error());

----编辑---

我不想在生产环境下使用mysql_error(),它可能会帮助攻击者找出与我的数据库有关的东西?这就是我使用常量字符串的要点

就像在C中一样#define x yourfunction()我不确定我是否可以在php 中做同样的事情

简单的答案是"你不能那样做"。常数的全部意义在于它是常量,因为在中,它的值从未改变。如果它引用了一个函数调用,该函数可以返回任何值,而且它不再是常量。

你可以做的一个技巧是将函数调用本身定义为常量的值,然后根据需要eval它,类似于这样:

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

然而,这确实是一个相当糟糕的代码。你最好做

die(mysql_error());

常量应该与名称所暗示的完全一样-常量。你不能重新声明一个常量,任何有变量值的东西都应该存储在的变量中。

然而,你可以这样做:

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

您可以使用Stefan建议的方法,并添加一个DEBUG常量,您可以在prod和dev环境之间切换:

define('DEBUG', 1);
// In the function:
// ...
echo ERROR;
if (DEBUG){
  echo mysql_error();   
}
die();