我的代码如下:
<?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();