减少MySQL查询的语句

时间:2012-02-06 12:51:40

标签: php oop api class-design

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

但是我不知道从哪个特定功能开始。

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

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

但这段代码对我来说似乎很混乱,并且想知道是否有人可以提供如何优化,减少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" );
    }
}

谢谢,

亚历

2 个答案:

答案 0 :(得分:2)

由于die在函数中间没有问题,你可以通过简单地否定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 );
    }
}

答案 1 :(得分:2)

如果您决定在功能中停止使用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);
    }
    ...
  }

我个人会去寻求例外...但我想有些人不同意我的意见,我想阅读他们的论点。

编辑例外情况。我们将扩展php Extension class

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>";
}

例外:

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