Почему мой тест не взаимодействует с базой данных mysql? - PullRequest
0 голосов
/ 01 марта 2020

Я программировал веб-викторину, и я застрял в этой проблеме в течение нескольких недель.

В основном я использовал функцию var_dump и обнаружил, что мой массив пуст.

(C: \ wamp64 \ www\MyProject \ Quiz app \ final. php : 20: массив (размер = 0) пуст).

Проблема в том, что моя викторина может проверять вопросы и варианты выбора, используя базу данных mysql, однако она не может проверять вводимые данные. Вот почему я не могу также использовать переменную Score. Как я могу исправить эту проблему, чтобы мой тест мог проверить ответы с моей базой данных?

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

#Question.php

    <?php session_start(); ?>
    <?php include "database.php"; 
    ?>


    <?php
    //Set question
    $number = (int) $_GET['n'];


        /*
     * Get Total Questions
    */
     $query="SELECT * FROM questions" ;
     //Get Results
    $result = mysqli_query ($conn,$query);
    $total = mysqli_num_rows($result);



    /*
    * Get the Question
    */
    $query = "SELECT * FROM questions
    WHERE question_number = $number";

    //Get result
    $result = mysqli_query ($conn,$query);

    $question = mysqli_fetch_assoc($result);


    /*
    * Get choices
    */
    $query2 = "SELECT * FROM choices
    WHERE question_number = $number";

    //Get result
    $choices = mysqli_query($conn,$query2);


    ?>



     <!DOCTYPE html PUBLIC'>
    <html> 
        <head>
    <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
            <title>
                General Knowledge Quiz
            </title>
            <link href="css/other.css" type="text/css" rel="stylesheet" />
        </head>
        <body>
        <main>


    <div class="container" >
    <div class="current">Question <?php echo $question ['question_number'];?> of <?php echo $total; ?> </div>
    <p class="question">
     <?php echo $question ['text']; ?>
    </p>
    <form action="process.php" method="post"
      <ul class="choices"

    <?php while ($row = $choices->fetch_assoc()) : ?>
    <li><input name="choice" type="radio" value="<?php echo $row ['id'];?> " /><?php echo $row ['text']; ?></li>
          <input type="submit" name="submit" value="Sumbit"/>
          <input type="hidden" name= "number" value="<?php echo $number; ?>" />



     </main>
     </div>
        </body>
    </html>

    <?php endwhile?>

#Process.php

    <?php session_start(); ?>
    <?php include "database.php";?>
    <?php
    // check to see if score is set error_handler)
    if(!isset($_SESSION['score'] )) {
        $_SESSION ['score'] = 0;
    }   

    if($_POST) {
        $number = $_POST['number']; 
        $selected_choice = $_POST['choice'];
        $next = $number++;

        echo $number ;
        echo $selected_choice ; 
    }

        /*
     * Get Total Questions
    */
     $query="SELECT * FROM questions" ;
     //Get Results
    $results = mysqli_query ($conn,$query);
    $total = mysqli_num_rows($results);



        /*
        *   Get correct choice
        */
        $query = "SELECT * FROM choices
     WHERE question_number = $number AND is_correct=1";

    //Get result
    $result = mysqli_query($conn,$query);

    //Get Row
    $row = $result->fetch_assoc(); 

    //Set Correct choice
    $correct_choice = $row['id'];


    //Compare
    if ($correct_choice == $selected_choice) {
        //Answer is correct
    $_SESSION['score']++;}



    //Check if it is the last question
    if($number == $total){
        header("Location: final.php") ;
        exit();
        }  
        else { 
          header("Location: question.php?n=".$next);

        }
        ```

1 Ответ

0 голосов
/ 01 марта 2020

Не видя схемы базы данных, здесь есть определенное количество догадок, основанных на том, что я вывел из вышесказанного, но я надеюсь, что это может помочь указать путь к решению. Похоже, что 3 первоначально использованных запроса можно заменить одним запросом, который объединяет две таблицы, а также выполняет подзапрос, чтобы найти общее количество записей. Подобный комбинированный запрос можно сделать, я думаю, в process.php

Вопрос .... Вопрос. php

<?php

    session_start();
    if( !isset( $_SESSION['score'] ) )$_SESSION['score']=0;
    $number = isset( $_GET['n'] ) && is_numeric( $_GET['n'] ) ? intval( $_GET['n'] ) : 1;


    include "database.php"; 



    $sql="select
            ( select count(*) from `questions` ) as `total`,
            q.`question_number` as `qid`, 
            q.`text` as `question`, 
            c.`id` as `aid`, 
            c.`text` as `answer` 
        from `questions` q
            join `choices` c on c.`question_number`=q.`question_number`
        where q.`question_number` = ?";
    $stmt=$conn->prepare( $sql );

    if( $stmt ){
        $stmt->bind_param('i',$number);
        $stmt->execute();
        $stmt->store_result();
        $stmt->bind_result( $total, $qid, $question, $aid, $answer );
    }
?>
<!DOCTYPE html PUBLIC'>
<html> 
    <head>
        <meta charset="utf-8" />
        <title>General Knowledge Quiz</title>
        <link href="css/other.css" rel="stylesheet" />
    </head>
    <body>
        <main>
            <div class="container" >

                <div class="current">Question <?php printf('%d of %d',$qid,$total); ?></div>
                <p class="question"><?php echo $question; ?></p>

                <form action="process.php" method="post">
                    <ul class="choices">
                    <?php
                        if( $stmt ){
                            while( $rs=$stmt->fetch() ){
                                printf('
                                    <li>
                                        <input type="radio" name="choice" value="%d" />%s
                                    </li>',
                                    $aid,
                                    $answer
                                );
                            }
                        }
                    ?>
                    </ul>
                    <input type="submit" name="submit" value="Sumbit" />
                    <input type="hidden" name="number" value="<?php echo $number; ?>" />
                </form>
            </div>
        </main>
    </body>
</html>

И в обработать запрос: обработать. php

<?php
    if( $_SERVER['REQUEST_METHOD']=='POST' ){
        if( isset( $_POST['number'], $_POST['choice'] ) && is_numeric( $_POST['number'] ) ){

            session_start();
            include "database.php";

            if( !isset( $_SESSION['score'] ) ) $_SESSION['score'] = 0;
            $choice=filter_input( INPUT_POST, 'choice', FILTER_SANITIZE_NUMBER_INT );
            $number=filter_input( INPUT_POST, 'number', FILTER_SANITIZE_NUMBER_INT );


            $sql='select 
                ( select count(*) from questions ) as `total`,
                `id`
                from `choices`
                where `question_number`=? and is_correct=1;';
            $stmt=$conn->prepare( $sql );
            if( $stmt ){
                $stmt->bind_param('i',$number);
                $res=$stmt->execute();
                if( $res ){
                    $stmt->store_result();
                    $stmt->bind_result($total,$id);

                    $stmt->fetch();
                    if( $id==$choice )$_SESSION['score']++;
                    $stmt->free_result();
                    $stmt->close();


                    if( $number==$total )exit( header('Location: final.php') );
                    else exit( header( sprintf('Location: question.php?n=%s',( $number + 1 ) ) ) );
                }
            }
        }
        exit();
    }
    http_response_code(400);
?>

Следует отметить, что ничего из этого не было проверено, поэтому вполне могут быть синтаксические ошибки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...