Сокращение, если заявления для MySQL Query - PullRequest
0 голосов
/ 06 февраля 2012

Я знаю, что есть дубликаты этого вопроса, и ответ был на рефакторинг кода.

Однако я не уверен, с чего начать с этой конкретной функции.

ЯЯ практиковал свои навыки работы с OOP API в PHP5 и решил написать свой собственный маленький 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 ]

2 голосов
/ 06 февраля 2012

Если вы решите прекратить использование 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 Расширение класса :

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

Исключения:

  • обеспечить обратную трассировку (для легкой отладки)
  • может быть перехвачено по типу (и, следовательно, вы можете обрабатывать их в подходящем месте или позволить распространяться в основное приложение)
  • может содержать дополнительную информацию для лучшей отладки
2 голосов
/ 06 февраля 2012

Поскольку у вас нет проблем с 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 );
    }
}
...