繁体   English   中英

定义一个常量函数调用

[英]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());
  }

?>

在尝试捕获的sql操作之后必须调用mysql_error()。 您不能使用预先声明的常量或变量来捕获此错误。 您要么直接调用它,要么调用另一个调用它的函数,如下所示:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM