mysqli_fetch_array как получить по одной строке за раз? - PullRequest
0 голосов
/ 15 апреля 2020

Мой php код выглядит следующим образом: Это часть теста, в котором я отображаю один вопрос и 4 варианта ответа на странице html через ajax jQuery. Я знаю, как запустить l oop и отображать все данные один за другим, но как мне отображать только один вопрос за раз?

Итак, после ответа на один вопрос я бы хотел посмотреть следующий. Можно ли запустить счетчик и получить один результат за раз, следующий результат и т. Д.?

<?php 
header("Access-Control-Allow-Origin: *");
require 'db.php';
// making empty variable
$createTable = "";

        $test_id=$_POST["test_id"];
        $sql=mysqli_query($con,"select * from mst_question where test_id='$test_id' ");
    $counter = 0;

while($row=mysqli_fetch_array($sql))
        {   
    $counter++;
        $createTable .= '<div class="text-subhead-2 text-center" style="background-color:#42A5F5">Question ';
        $createTable .= $counter;
        $createTable .= ' of 25</div>';
        $createTable .= '<div class="panel panel-default paper-shadow" data-z="0.5">';

        $createTable .= '<div class="panel-body">';
        $createTable .= '<p class="text-body-2">';
        $createTable .= $row['que_desc'];
        $createTable .= '</p>';
       $createTable .= '</div>';
        $createTable .= '</div>';

        $createTable .= '<div class="text-subhead-2 text-light">Your Answer</div>';
        $createTable .= '<div class="panel panel-default paper-shadow" data-z="0.5">';
        $createTable .= '<div class="panel-body">';
        $createTable .= '<div class="radio radio-success">';
        $createTable .= '<input type="radio" name="radio';
        $createTable .= $counter;
        $createTable .= '" id="radio1';
        $createTable .= $counter;
        $createTable .= '" value="';
        $createTable .= $row['ans1'];
        $createTable .= '" >';
        $createTable .= '<label for="radio1';
        $createTable .= $counter;
        $createTable .= '">';
        $createTable .= $row['ans1'];
        $createTable .= '</label>';
        $createTable .= '</div>';
        $createTable .= '<div class="radio radio-success">';
        $createTable .= '<input type="radio" name="radio';
        $createTable .= $counter;
        $createTable .= '" id="radio2';
        $createTable .= $counter;
        $createTable .= '" value="';
        $createTable .= $row['ans2'];
        $createTable .= '" >';
        $createTable .= '<label for="radio2';
        $createTable .= $counter;
        $createTable .= '">';
        $createTable .= $row['ans2'];
        $createTable .= '</label>';
        $createTable .= '</div>';
        $createTable .= '<div class="radio radio-success">';
        $createTable .= '<input type="radio" name="radio';
        $createTable .= $counter;
        $createTable .= '" id="radio3';
        $createTable .= $counter;
        $createTable .= '" value="';
        $createTable .= $row['ans3'];
        $createTable .= '" >';
        $createTable .= '<label for="radio3';
        $createTable .= $counter;
        $createTable .= '">';
        $createTable .= $row['ans3'];
        $createTable .= '</label>';
        $createTable .= '</div>';
        $createTable .= '<div class="radio radio-success">';
        $createTable .= '<input type="radio" name="radio';
        $createTable .= $counter;
        $createTable .= '" id="radio4';
        $createTable .= $counter;
        $createTable .= '" value="';
        $createTable .= $row['ans4'];
        $createTable .= '" >';
        $createTable .= '<label for="radio4';
        $createTable .= $counter;
        $createTable .= '">';
        $createTable .= $row['ans4'];
        $createTable .= '</label>';
        $createTable .= '</div>';
        $createTable .= '</div>';
        $createTable .= '</div>';

                        }

    echo $createTable;
    mysqli_close($con);
    ?>

1 Ответ

0 голосов
/ 15 апреля 2020

Во-первых, ваш код опасен, потому что может быть взломан с помощью sql инъекции. Вы всегда должны использовать привязки параметров.

Самый простой способ - передать идентификатор вопроса, сохраненного в mst_question, и выбрать его с помощью предложения WHERE (например, test_id).

//...
$test_id=$_POST["test_id"];
$questionId = filter_var($_POST['question_id'],FILTER_VALIDATE_INT);
if (!$questionId){
   die('done');
}

$stmt= mysqli_prepare($con,"select * from mst_question where test_id='$test_id' AND id=?");
mysqli_stmt_bind_param(**$stmt**, 'd',$questionId);
mysqli_stmt_execute(**$stmt**);
// work with $stmt. 
// f.e. your loop but now there will be only one execution
mysqli_stmt_close($stmt);
//...
$createTable .= '<input type="hidden" name="nextQuestionId" value="'.$nextQuestionId.'"/>';
//...

С полем ввода вы вернет идентификатор следующего вопроса, который может быть передан в аргументе url в коде javascript.

Если вы беспокоитесь о мошенниках-викторинах, вы можете повысить безопасность, хэшируя nextQuestionId.

//...
$stmt = mysqli_prepare($con,"select * from mst_question where test_id='$test_id' AND sha1(CONCAT('slat_',id))=?");
//...
$createTable .= '<input type="hidden" name="nextQuestionId" value="'.sha1('salt_'.$nextQuestionId).'"/>';
//...

Это не лучшее решение, но требующее минимальных изменений вашего кода.

Я хотел бы предложить перейти на PDO - очень удобный и мощный способ взаимодействия с базой данных. См. Пример.

...