【问题标题】:Define a constant function call定义一个常量函数调用
【发布时间】:2012-03-29 12:20:57
【问题描述】:

我的代码是这样的:

<?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 中做同样的事情

【问题讨论】:

  • 只使用函数有什么问题?
  • @Juhana 我添加了我的解释..
  • function my_error() { return mysql_error() } - 上线时将mysql_error() 替换为字符串。没有理由尝试使函数“恒定”,无论这意味着什么。
  • 好的..也许这是唯一的方法
  • 为什么不把它变成一个全局变量呢?

标签: php constants


【解决方案1】:

简单的答案是“你不能那样做”。 constant 的全部意义在于它是constant,因为它的值永远不会改变。如果它引用一个函数调用,则该函数可以返回任何值 - 而且它不再是常量。

您可以做的一个技巧是将函数调用本身定义为常量的值 - 然后按需 eval 它,如下所示:

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

然而,这确实是一个相当糟糕的代码。这样做会好很多

die(mysql_error());

【讨论】:

  • 你可怕的,可怕的eval() 需要用return mysql_error(); 的值定义常量,否则它不会输出任何东西。但是到底为什么有人会这样做是我无法理解的。
  • 或者按照@DaveRandom 的建议将静态字符串添加到错误消息中。
  • mysql_error() 在生产环境中是否不安全?我不想显示 mysql 错误,这样攻击者就可以从中得到一些东西……这就是我使用常量字符串的目的。
  • @iKid 我所做的是这样的:有一个名为$__DEVMODE 的全局变量布尔值,这在开发中为真,在生产中为假。然后有这样一个函数:function mysql_safe_error ($link = NULL) { return ($GLOBALS['__DEVMODE']) ? mysql_error($link) : mysql_errno($link); }。那么你的代码就是if (!mysql_query($q)) { die(mysql_safe_error()); }
  • @DaveRandom 是的,同意,我的错误,我更新了。无论如何,这是一个相当糟糕的做法。
【解决方案2】:

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

但是,您可以这样做:

<?php

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

  // ... 

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

?>

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 2012-04-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-03
        • 1970-01-01
        • 2016-05-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多