2012-05-17 19 views
0

我完全新的mysqli(從MySQL切換),所以讓事情變得簡單,安全,安全的,它將使意義,通過這一個尺寸適合所有功能運行絕對ALL mysqli的查詢?通過這種適合所有人的功能來運行所有Mysqli查詢(SELECT,UPDATE,DELETE等)是否可以?

爲什麼或者爲什麼不和這將是利弊無論採用哪種方式?

function mysqli_prepared_query($link,$sql,$typeDef = FALSE,$params = FALSE){ 
    if($stmt = mysqli_prepare($link,$sql)){ 
    if(count($params) == count($params,1)){ 
     $params = array($params); 
     $multiQuery = FALSE; 
    } else { 
     $multiQuery = TRUE; 
    } 

    if($typeDef){ 
     $bindParams = array();  
     $bindParamsReferences = array(); 
     $bindParams = array_pad($bindParams,(count($params,1)-count($params))/count($params),"");   
     foreach($bindParams as $key => $value){ 
     $bindParamsReferences[$key] = &$bindParams[$key]; 
     } 
     array_unshift($bindParamsReferences,$typeDef); 
     $bindParamsMethod = new ReflectionMethod('mysqli_stmt', 'bind_param'); 
     $bindParamsMethod->invokeArgs($stmt,$bindParamsReferences); 
    } 

    $result = array(); 
    foreach($params as $queryKey => $query){ 
     foreach($bindParams as $paramKey => $value){ 
     $bindParams[$paramKey] = $query[$paramKey]; 
     } 
     $queryResult = array(); 
     if(mysqli_stmt_execute($stmt)){ 
     $resultMetaData = mysqli_stmt_result_metadata($stmt); 
     if($resultMetaData){                    
      $stmtRow = array(); 
      $rowReferences = array(); 
      while ($field = mysqli_fetch_field($resultMetaData)) { 
      $rowReferences[] = &$stmtRow[$field->name]; 
      }         
      mysqli_free_result($resultMetaData); 
      $bindResultMethod = new ReflectionMethod('mysqli_stmt', 'bind_result'); 
      $bindResultMethod->invokeArgs($stmt, $rowReferences); 
      while(mysqli_stmt_fetch($stmt)){ 
      $row = array(); 
      foreach($stmtRow as $key => $value){ 
       $row[$key] = $value;   
      } 
      $queryResult[] = $row; 
      } 
      mysqli_stmt_free_result($stmt); 
     } else { 
      $queryResult[] = mysqli_stmt_affected_rows($stmt); 
     } 
     } else { 
     $queryResult[] = FALSE; 
     } 
     $result[$queryKey] = $queryResult; 
    } 
    mysqli_stmt_close($stmt); 
    } else { 
    $result = FALSE; 
    } 

    if($multiQuery){ 
    return $result; 
    } else { 
    return $result[0]; 
    } 
} 
?> 

Example(s): 
For a table of firstName and lastName: 
John Smith 
Mark Smith 
Jack Johnson 
Bob Johnson 

<?php 
//single query, single result 
$query = "SELECT * FROM names WHERE firstName=? AND lastName=?"; 
$params = array("Bob","Johnson"); 

mysqli_prepared_query($link,$query,"ss",$params) 
/* 
returns array( 
0=> array('firstName' => 'Bob', 'lastName' => 'Johnson') 
) 
*/ 

//single query, multiple results 
$query = "SELECT * FROM names WHERE lastName=?"; 
$params = array("Smith"); 

mysqli_prepared_query($link,$query,"s",$params) 
/* 
returns array( 
0=> array('firstName' => 'John', 'lastName' => 'Smith') 
1=> array('firstName' => 'Mark', 'lastName' => 'Smith') 
) 
*/ 

//multiple query, multiple results 
$query = "SELECT * FROM names WHERE lastName=?"; 
$params = array(array("Smith"),array("Johnson")); 

mysqli_prepared_query($link,$query,"s",$params) 
/* 
returns array( 
0=> 
array( 
0=> array('firstName' => 'John', 'lastName' => 'Smith') 
1=> array('firstName' => 'Mark', 'lastName' => 'Smith') 
) 
1=> 
array( 
0=> array('firstName' => 'Jack', 'lastName' => 'Johnson') 
1=> array('firstName' => 'Bob', 'lastName' => 'Johnson') 
) 
) 
*/ 
+1

我認爲將它更容易在一個類中,而不是一個功能 – YamahaSY

+2

不,它不行。 –

回答

9

對不起,但不,我認爲這是一個可怕的主意。

一個好的函數/方法要短,給點意見,並專門做一兩件事,只有一件事做好。它應該儘可能地避免分支邏輯(保持if和switch語句的數量最少)。這些功能很容易理解,因爲它們的內部工作可以用相對小的努力來掌握。

較長的一個功能是,它成爲理解,因爲程序員必須持有更多的在他們的頭就它是如何工作的難度。函數包含的if/switch/try/catch/throw語句越多,它就越難理解,因爲它們會修改執行可能流經函數的方式。你必須考慮一些被稱爲npath複雜性的東西(一個函數可以執行的可能方式)。如果添加,每一個都會增加npath複雜度。純粹基於計數ifs我得到了64的複雜度,這太高了!循環也會增加npath的複雜度,所以你的函數的實際複雜性指標可能比這個要高很多。

更改一個像你提供的函數的函數,如果它是一個較小的簡單函數的集合,它的工作量將會大大增加,因爲很難做出特定的更改以實現預期的新行爲而不會產生不需要的連鎖效應。當然,您可以使用單元測試來確保不會發生這種情況,但npath的複雜性很高,爲確保函數的功能得到充分覆蓋,您必須編寫的測試數量非常大。拇指

良好的一般規則:

  • 如果函數的身體不適合你的屏幕上,那麼它可能不適合在你的腦袋任。避免比編輯器窗口更長的功能。你永遠不應該滾動來查看整個函數。
  • 你得到2個ifs每個功能。不止如此,npath的複雜性可能開始變得難以管理。
  • 功能應該做好一件事情。試圖成爲所有交易中的一員的功能在任何情況下都可能無法正確。另外,函數試圖採取的責任越多,函數就越難滿足它所承擔的所有責任。
  • 小函數可重用,大函數不可重用。
  • 在所有神聖的名字中,評論你的代碼!其他人幾乎不可能看到你的功能,並找出它的意義。按照先前的指導方針進行分解將有很大幫助,但即使如此,計算機代碼也不如向普通英語表達其他人的想法。評論澄清了一些不太清楚的觀點,可以幫助其他程序員在設計和實現代碼時找出頭腦中的問題。他們在執行時間方面沒有任何花費,所以真的沒有理由不發表評論。如果你一個人留下這些代碼,並在一年後再回來看看它,我可以保證你在寫代碼的時候永遠不會知道你在想什麼。

更好的解決方案是實現一個類,該類提供您需要的服務作爲一系列方法。

更好的解決方案是檢查這個PHP可以通過其內置的功能爲您做多少。由於我無法真正理解你的函數,所以我無法確定PHP是否已經可以完成你需要這個功能的功能,但是我懷疑PHP中已經有很多功能可以實現。

+3

+1對於'如果一個功能的身體不適合你的屏幕,那麼它可能不適合你的頭。「 – Robik

+1

令人難以置信的徹底!很好的答案。 – MetalFrog

1

一刀切必然意味着會有一些代碼(可能很多),只有解決一個具體的情況並不適用於所有的操作。這個函數中會有一些代碼在阻礙你的發展。也可能會有很多代碼沒有考慮的邊界情況,當你發現它們會導致你很多嘗試調試代碼的麻煩。

對此的簡單回答是「不要使用它」。它效率較低,可能會讓你對其他開發者感到困惑。

學習正確使用MySQLi。這並不困難,從長遠來看它會給你帶來很大的好處。

相關問題