Во-первых, ваш код опасен, потому что может быть взломан с помощью 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 - очень удобный и мощный способ взаимодействия с базой данных. См. Пример.