减少MySQL查询的If语句


Reduce If Statements For MySQL Query

我知道这个问题有重复的地方,答案是重构代码。

然而,我不确定从哪里开始这个特殊的功能。

我正在PHP5中练习我的OOP API技能,并决定编写我自己的小数据库API。

我有一个函数有4个嵌套的if语句,我甚至不确定4个嵌套if是否很多。

但这段代码对我来说似乎很混乱,我想知道是否有人能提供任何关于如何优化、减少if等的提示。

在现实世界中,如何编写这种函数?

我的代码如下:

public function custom_query( $sql_query_string, $single_column = false){
    $link = $this->_Link_ID;
    // IF LINK IS VALID RESOURCE
    if ( is_resource( $link ) ) {
        $query_resource = mysql_query( $sql_query_string, $link );
        // IF QUERY WAS VALID
        if ( is_resource( $query_resource ) ) {
            $this->_Query_ID = $query_resource;
            $row_count = mysql_num_rows( $query_resource );
            // IF $ROW_COUNT IS A NUMBER, VALID ROWS WERE FOUND
            if ( is_numeric( $row_count ) ) {
                if ( $single_column ){
                    $result_set = mysql_fetch_assoc( $query_resource );
                    return $result_set;
                }
                else {
                    $result_set = array();
                    for ( $row = 0; $row < $row_count; $row++ ) {
                        $result_set[$row] = mysql_fetch_assoc( $query_resource );
                    }
                    return ( object ) array ( 'row_count' => $row_count, 'result_set' => $result_set );
                }
            }
            else {
                die( "Failed To Retrieve Row Count Query: $sql_query_string MySQL Error: " . mysql_error( $link ) );
            }
        }
        else {
            die( "Invalid Query : $query_string. MySql : " . mysql_error( $link ) );
        }
    }
    else {
        die( "Query attempted without valid link resource.  Query : $query_string" );
    }
}

谢谢,

Alex

如果您决定在函数中停止使用die(),您可以将代码重写为:

class Yours {
  protected $errno = 0;
  protected $error = '';
  public function custom_query( $sql_query_string, $single_column = false){
    $link = $this->_Link_ID;
    // IF LINK IS VALID RESOURCE
    if ( !is_resource( $link ) ){
       $this->error = "Query attempted without valid link resource.  Query : $query_string";
       $this->errno = -1;
       return null;
    }
    ...
  }
}

或者您可以使用异常;

  public function custom_query( $sql_query_string, $single_column = false){
    $link = $this->_Link_ID;
    // IF LINK IS VALID RESOURCE
    if ( !is_resource( $link ) ){
       throw new Exception( "Query attempted without valid link resource.  Query : $query_string", -1);
    }
    ...
  }

我个人会选择例外。。。但我想有些人不同意我的观点,我想读一下他们的论点

EDIT异常示例。我们将扩展php扩展类:

class DbException {
  protected $sql;
  public __construct( $message = "", $code = 0, $sql = '', $previous = NULL){
    parent::__construct( $message, $code, $previous);
    $this->sql = $sql;
  }
  public function getSql(){
    return $this->sql;
  }
}
// In model:
throw new DbException( "Query attempted without valid link resource.", -1, $query);
// In main application:
try {
  ob_start();
  // run whole application
} catch( DbException &e){
  ob_clean(); // Suppress all output so far
  echo "<html><body><div class="error">" . htmlspecialchars( $e->getMessage()) . "</div>";
  if( NOT_IN_PRODUCTION){
    echo "<div class='sql'>" . htmlspecialchars( $e->getSql()) . "</div>";
  }
  echo "</body></html>";
}

例外情况:

  • 提供回溯(便于调试)
  • 可以被类型捕获(因此您可以在适当的位置处理它们,或者让它们传播到主应用程序)
  • 可以包含其他信息以进行更好的调试

由于函数中间的die-ing没有问题,因此可以通过简单地否定if s:来节省一些维护空间

public function custom_query( $sql_query_string, $single_column = false){
    $link = $this->_Link_ID;
    // IF LINK IS VALID RESOURCE
    if ( !is_resource( $link ) ) die( "Query attempted without valid link resource.  Query : $query_string" );
    $query_resource = mysql_query( $sql_query_string, $link );
    // IF QUERY WAS VALID
    if ( !is_resource( $query_resource ) ) die( "Invalid Query : $query_string. MySql : " . mysql_error( $link ) );
    $this->_Query_ID = $query_resource;
    $row_count = mysql_num_rows( $query_resource );
    // IF $ROW_COUNT IS A NUMBER, VALID ROWS WERE FOUND
    if ( !is_numeric( $row_count ) ) die( "Failed To Retrieve Row Count Query: $sql_query_string MySQL Error: " . mysql_error( $link ) );
    if ( $single_column ) {
        $result_set = mysql_fetch_assoc( $query_resource );
        return $result_set;
    }
    else {
        $result_set = array();
        for ( $row = 0; $row < $row_count; $row++ ) {
            $result_set[$row] = mysql_fetch_assoc( $query_resource );
        }
        return ( object ) array ( 'row_count' => $row_count, 'result_set' => $result_set );
    }
}