2017-02-13 2 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); 

EDIT: Причина, я использовал массив вместо просто прямо вверх, используя переменную POST в то время цикла так есть место, прежде чем запустить что-нибудь для проверки (обеспечивая ваш массив вопроса содержит 10 размещенных значений и т.д.)

+1

, когда вы делаете запросы db из цикла, используйте, по крайней мере, подготовленные операторы, чтобы защитить некоторые из служебных данных. – radicarl

+0

Согласен с Radicarl, я отвечал на его вопрос с точки зрения того, как обрабатывать переданные POST, а не фиксировать весь блок кода. Я бы согласился, когда они реализуют решение, подготовленные заявления всегда являются способом –

1

Во-первых, чтобы сделать ваш код современной и эффективной, вы должны использовать PHP Data Objects или 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); 
Смежные вопросы