Функция PHP PDO, ищет некоторые предложения - PullRequest
0 голосов
/ 14 июня 2011

Я ни в коем случае не прошу никого переписывать мой код, а скорее найду места, где я могу его улучшить или внедрить лучшие практики.Вот как кратко работает функция.

Функция $Class->getTaxClass() принимает минимум 1 аргумент, который может быть либо одним идентификатором, либо массивом идентификаторов.Кроме того, он может принимать значения для определенных строк, которые он хочет захватить, например, $Class->getTaxClass($array, 'name','tid')

Так что я просто ищу способы улучшить структуру кода / лучшие практики / логику функции, котораяследует:

public function getTaxClass()
{
  $arg = func_get_args();
  $or = 'pa.pid = ?';
  if(is_array($arg[0]))
  {
    $i = 1; 
    while($i < count($arg[0]))
    {
      $or .= " OR pa.pid = ?";
      $i ++;      
    }
  }
  if(count($arg) == 1)
  {
    $pid = $arg[0];
    $row = "a.*";
  }
  else if(count($arg > 1))
  {
    $pid = array_shift($arg); 
    $prepared_args = array();
    foreach($arg as $a) {
      $prepared_args[] = "a." . $a;
    }
  $row = implode(',', $prepared_args);
  }

  $stmt = _DB::init()->prepare("SELECT $row
                                FROM tax_class a
                                INNER JOIN products_to_tax_class pa 
                                ON a.tid = pa.tid
                                WHERE ($or)"
                              );     
  if(is_array($arg[0]))
  {
    if($stmt->execute($arg[0])) 
      return $stmt->fetch(PDO::FETCH_ASSOC);
  }
  else
  {
    if($stmt->execute(array($pid))) 
      return $stmt->fetch(PDO::FETCH_ASSOC);
  }                 
}

Очень ценится!

1 Ответ

0 голосов
/ 14 июня 2011

Мое предложение:

public function getTaxClass() {
    $args = func_get_args();

    // columns to select:
    $cols = array();
    for ($i=1; $i<=count($args); $i++) {
        $cols[] = "a.{$args[$i]}";
    }
    $cols = count($cols) ? join(',', $cols) : 'a.*';

    // IDs to filter and their placeholders:
    $ids = (array) $args[0];
    $phs = join(',', array_fill(0, count($ids), '?'));

    $stmt = _DB::init()->prepare(
        "SELECT {$cols}
        FROM tax_class a
            INNER JOIN products_to_tax_class pa 
            ON a.tid = pa.tid
        WHERE pa.pid IN ({$phs})"
    );

    if ($stmt->execute($ids)) {
        return $stmt->fetch(PDO::FETCH_ASSOC);
    }
}

PS-код не проверен, некоторые ошибки все еще могут возникать:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...