2017-02-13 48 views
0

我有以下代碼:避免對MySQL查詢代碼重複(多一會兒)

<?php 
include_once "connect.php"; 

$question_01 = mysqli_real_escape_string($con, $_POST['question_01']); 
// $question_02 - $question_09 go here... 
$question_10 = mysqli_real_escape_string($con, $_POST['question_10']); 

    $i = 0; 
    $array_sum=[]; 
    while ($i < 10){ 
     $i++; 
     $sql = "SELECT * FROM parteners WHERE question_no = 1 AND answer_variant = '$question_01'"; 
     $result = mysqli_query($con, $sql); 

     $final_array_1 = array(); 

     while ($row = mysqli_fetch_array($result, MYSQLI_NUM)) 
     { 

     $final_array_1 = $row; 
      $array_sum = array_map(function() { 
       return array_sum(func_get_args()); 
      }, $array_sum, $final_array_1); 
     } 
} 
print_r($final_array_1); 

正如你所看到的,我需要重複的代碼,每個$問題_ ##。除了重複代碼之外,還有更聰明的方法嗎?我不僅關心將所有事情都變成代碼意大利麪,而且還關心加載時間的操作效率。

讓我知道你是否需要澄清。

更新:基本上應該在查詢中增加了「question_no」的值,直到達到10,並挑選每個問題對應的$ _POST值。

+0

所以有什麼問題?使用'$ i'在循環中構建sql字符串。基本字符串連接。 –

+0

@JuanCarlosOropeza我得到了連接部分。我對這個循環過程更感興趣。我應該保持這兩個時間嗎? – SporeDev

+0

'$ sql =「SELECT * FROM parteners ORDER BY question_no ASC LIMIT 10」;'直接在db中檢查並讓我知道是否顯示所需的輸出? –

回答

1

有兩種方式,可變的變量或數組。我建議數組,因爲它們不太容易在任何地方拋出錯誤。

<?php 
include_once "connect.php"; 
$questions = array(); 
$questions[1] = mysqli_real_escape_string($con, $_POST['question_01']); 
// $question_02 - $question_09 go here... 
$questions[10] = mysqli_real_escape_string($con, $_POST['question_10']); 

    $i = 0; 
    $array_sum=[]; 
    while ($i < 10){ 
     $i++; 
     $sql = "SELECT * FROM parteners WHERE question_no = $i AND answer_variant = '".$questions[$i]."'"; 
     $result = mysqli_query($con, $sql); 

     $final_array_1 = array(); 

     while ($row = mysqli_fetch_array($result, MYSQLI_NUM)) 
     { 

     $final_array_1 = $row; 
      $array_sum = array_map(function() { 
       return array_sum(func_get_args()); 
      }, $array_sum, $final_array_1); 
     } 
} 
print_r($final_array_1); 

編輯:我用了一個數組,而不是隻是直線上升使用POST變量在while循環的原因是爲了有空間,你的驗證運行任何東西(確保你的問題陣列包含10個貼值等)之前,

+1

當您從循環中執行db查詢時,至少使用準備語句來安全地處理一些開銷。 – radicarl

+0

同意Radicarl,我正在回答他的問題,關於如何處理傳遞的POST,而不是修復整個代碼塊。當他們實施解決方案時,我會同意,準備好的聲明總是要走 –

1

首先,讓你的代碼現代化和高效率,你應該使用PHP 簡稱 數據對象,或PDO。您將可以訪問準備好的 聲明,這些聲明完全是爲了:您可以構建查詢 「模板」並以非常高效和安全的不同數據執行。

循環是做它的正確方法。此外,您$questions陣列是一個 有點不必要的,因爲你可以從$_POST右內 你的循環中檢索數據。但是如果您想使用它,則不需要爲數據庫「逃避」 字符串,因爲它是由PDO處理的。所以,你可以在一個更簡單的方法建立 您的數組:

$questions = [ 
    $_POST['question_01'], 
    $_POST['question_02'], 
    $_POST['question_03'], 
    # ... 
    $_POST['question_10'], 
]; 

你的循環與PDO:

$dbh = ... # create your database handle, connect to it 
$st = $dbh->prepare(" 
    SELECT * FROM parteners 
    WHERE question_no = ? AND answer_variant = ?; 
"); 

foreach (range(1, 10) as $i) { 

    $result = $st->execute([ $i, $questions[$i-1] ]); 
    # or, to build directly 
    $result = $st->execute([ 
     $i, $_POST[ sprintf("question_%02d", $i) ] 
    ]); 

    $final_array[] = $result->fetchAll(PDO::FETCH_NUM); 

} 

print_r($final_array); 
1

我將建立一個的SQL語句包含的所有問題,並anwsers與編程做休息邏輯。循環中的SQL查詢是一個壞主意,因爲您必須爲完成任務執行大量開銷,數據庫服務器可以做得更好。你也應該使用準備好的語句來提高性能和安全性。

$query = "SELECT * FROM parteners WHERE (question_no = 1 AND answer_variant = ?) OR (question_no = 2 AND answer_variant = ?) OR (question_no = 3 AND answer_variant = ?) OR (question_no = 4 AND answer_variant = ?) OR (question_no = 5 AND answer_variant = ?) OR (question_no = 6 AND answer_variant = ?) OR (question_no = 7 AND answer_variant = ?) OR (question_no = 8 AND answer_variant = ?) OR (question_no = 9 AND answer_variant = ?) OR (question_no = 10 AND answer_variant = ?)" 
$stmt = myqli_prepare($query); 
mysqli_stmt_bind_param($stmt, 'ssssssssss', $question_01, $question_02, $question_03,.....); 
mysqli_stmt_execute($stmt); 
$result = mysqli_stmt_get_result($stmt);