2011-06-14 41 views
0

我绝不会要求任何人重写我的代码,而是找到我可以改进它的地方,或实施更好的做法。这是该功能的简要工作方式。PHP的PDO功能,寻求一些建议

函数$Class->getTaxClass()接受至少1个参数,它可以是单个ID,也可以是一个ID数组。它也可以不是接受它想摸像这样$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); 
    }     
} 

非常感谢!

回答

0

我的建议:

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

附:代码未经测试,可能仍会出现一些错误:)