2015-10-21 3 views
1

Я знаю проблему, но я не могу ее исправить, и я надеялся, что кто-то здесь может направить меня в правильном направлении. Что я хочу сделать, это проверить, чтобы увидеть если пользователь уже отправил правильный ответ на вопрос, прежде чем проверять его на базе базы данных ответов и вставлять его в базу данных. Просто, чтобы один и тот же вопрос был ответен несколько раз, я новичок с MYSQLi и не очень хорош, изучая его.PHP проверить, если форма уже отправлена ​​с использованием num строк

То, что я в настоящее время до сих пор:

$mysqli = new mysqli($host,$username,$password,$database); 

if($mysqli -> connect_error)die($mysqli->connect_error); 

$questionID = $_POST['id']; 
$userAnswer = $_POST['answer']; 
$userAnswer = strtolower(trim($userAnswer)); 
$questionValue = $_POST['qValue']; 

$teamName = $_SESSION['user_email']; 
$user_id = "SELECT t.teamID,t.questionGroupID FROM team as t WHERE t.teamName ='$teamName'"; 


$result2 = $mysqli->query($user_id); 

    if ($result2->num_rows > 0) { 
    // output data of each row 
    while($row = $result2->fetch_assoc()) { 

     $userID = $row["teamID"]; 
     } 
    } 


$query = "SELECT answers FROM answers WHERE questionID=?"; 
$statement = $mysqli->prepare($query); 
$statement ->bind_param('i', $questionID); 
$statement->execute(); 
$statement->bind_result($answer); 


//checking the database to see if the current question is there from the current user/teamName 
if ($result = mysqli_query($mysqli, "SELECT * FROM submissions where teamID='$teamName' and questionID='$questionID'")) { 

    /* determine number of rows result set */ 
    $row_cnt = mysqli_num_rows($result); 


    /* close result set */ 
    mysqli_free_result($result); 
} 


/* close connection */ 
mysqli_close($mysqli); 


//checking to see if it returns a result 
if(($row_cnt)= 0){ 
while ($statement->fetch()) { 
    if ($answer != $userAnswer) { 
     echo '<br><br><div class="alert alert-danger"><h5> 
      <strong>Sorry!</strong> the answer is incorrect! Please Try again!.</h5> 
      </div>'; 

     "<h3>Sorry the answer is incorrect! Please Try again!</h3><br>"; 
     //return to previous Page 
     echo '<a href="./question.php?id=' . $questionID . '" class="btn btn-primary btn-block">Return to Question </a>'; 
     $statement->free_result(); 
     $sql = "INSERT INTO `submissions`(`submissionsID`, `teamID`, `questionID`, `answer`,`qValue`,`status`,`timestamp`) VALUES (null,'$teamName','$questionID','$userAnswer','0','Wrong',NOW())"; 

     if (mysqli_query($mysqli, $sql)) { 

     } else { 
      echo "Error: " . $sql . "<br>" . mysqli_error($mysqli); 
     } 


    } else { 


     echo '<br><br><div class="alert alert-success"><h5> 
    <strong>Success!</strong> Correct Answer, Good Luck with the Next </h5> 
</div>'; 
     echo "<a href='questionList.php' class='btn btn-success btn-block'>Continue with other questions! </a>"; 

     $statement->free_result(); 

     //MySqli Insert Query 

     $sql = "INSERT INTO `submissions`(`submissionsID`, `teamID`, `questionID`, `answer`,`qValue`,`status`,`timestamp`) VALUES (null,'$teamName','$questionID','$userAnswer','$questionValue','Correct',NOW())"; 

     if (mysqli_query($mysqli, $sql)) { 

     } else { 
      echo "Error: " . $sql . "<br>" . mysqli_error($mysqli); 
     } 


    } 

}  
}else{ 
     echo '<br><br><div class="alert alert-warning"><h5> 
    <strong>Already Answered!</strong> Good Luck with the Next </h5> 
</div>'; 
     echo "<a href='questionList.php' class='btn btn-warning btn-block'>Continue with other questions! </a>"; 
} 

Я тестировал большинство способов, Что мне нужно сделать, это запустить проверку, чтобы увидеть, если текущий зарегистрированный пользователь уже правильно ответил на QuestionID, Я использую num_rows, чтобы увидеть, если его больше 0, если оно больше 0, они ответили на него.

Итак, мой вопрос: правильно ли я подхожу к нему и какой подход следует принять?

+0

Ваша логика возвращается на передний план. Вам не нужно сначала проверять. Вместо этого создайте составной ключ для пользователя и ответ. – Strawberry

+0

Также посмотрите, как вы подготовили второй запрос? Это хорошо. – Strawberry

ответ

1

Это хороший подход. Попробуйте использовать

$row_cnt = $result->num_rows; 

вместо

$row_cnt = mysqli_numrows($result); 

также не забывать, что $row_cnt будет равен -1 в случае какой-либо форме ошибки запроса, так что вы должны проверить, что прежде, чем принять все значения, что ARN 't 0 действительны.

+0

Спасибо за ответ, я пробовал это и установил счетчик <= 0, но теперь моя проблема в том, что он, кажется, задерживается, когда я устанавливаю счетчик = 0, я получаю конец инструкции (после else , где сказано, что вы уже ответили на вопрос), когда я установил его на что-нибудь еще, веб-страница показывает пустое – Keiththolt

+0

Я также использую код, который у вас есть, если $ row_cnt =, когда правильный синтаксис будет ==, поскольку вам нужен оператор сравнения а не оператор присваивания. – PC3TJ

+0

попробуйте установить error_reporting (E_ALL); в начале кода и посмотреть, получаете ли вы какие-либо синтаксические ошибки. – PC3TJ

0

Я предлагаю вам посмотреть обработка естественного языка (NLP). Если ваш ответ - униграмма (одно слово). Этот подход в порядке. Если вы имеете дело с n-граммами размером более 1, то есть длинными предложениями или абзацами, тогда ваш подход не будет работать. Ответы могут быть написаны по-разному. Поэтому я бы предложил некоторые семантические методы, такие как LSA (латентный семантический анализ) или просто модели векторного представления.

Я не могу придумать какие-либо другие методы для решения этой проблемы. Попробуйте методы НЛП. Дадут вам потрясающие результаты.

+0

Thomas, я считаю, что ее вопрос заключается в том, чтобы проверить, действительно ли этот пользователь отправил ответ на вопрос не о том, как проверить правильность ответа. Вкратце глядя на ее код, кажется, что это, вероятно, множественный выбор. – PC3TJ

+0

Привет, Томас, Спасибо, что нашли время ответить, я уже сделал сравнение, если ответ пользователя равен ответу в базе данных. Моя проблема на данный момент заключается в том, что я пытаюсь посмотреть, есть ли у текущего пользователя сообщение в таблице представлений, которая равна идентификатору пользователя и идентификатору вопроса. Если они есть, это будет означать, что они ответили на вопрос, и на него нельзя ответить снова. – Keiththolt

0

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

<?php session_start(); ?> 
<!DOCTYPE html> 
<html lang="en"> 

<head> 

    <meta charset="utf-8"> 
    <meta http-equiv="X-UA-Compatible" content="IE=edge"> 
    <meta name="viewport" content="width=device-width, initial-scale=1"> 
    <meta name="description" content=""> 
    <meta name="author" content=""> 


    <!-- Bootstrap Core CSS --> 
    <link href="css/bootstrap.min.css" rel="stylesheet"> 

    <!-- Custom CSS --> 
    <link href="css/modern-business.css" rel="stylesheet"> 

    <!-- Custom Fonts --> 
    <link href="font-awesome/css/font-awesome.min.css" rel="stylesheet" type="text/css"> 

    <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries --> 

    <!--[if lt IE 9]> 
     <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script> 
     <script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script> 
    <![endif]--> 

</head> 

<body> 

    <!-- Navigation --> 
    <?php include_once('navigation.php'); 

// establishing the MySQLi connection 

require_once('connection-test.php'); 
$mysqli = new mysqli($host,$username,$password,$database); 

/* check connection */ 
if (mysqli_connect_errno()) { 
    printf("Connect failed: %s\n", mysqli_connect_error()); 
    exit(); 
} 

$questionID = $_POST['id']; 
$userAnswer = $_POST['answer']; 
$userAnswer = strtolower(trim($userAnswer)); 
$questionValue = $_POST['qValue']; 

$teamName = $_SESSION['user_email']; 
$user_id = "SELECT t.teamID,t.questionGroupID FROM team as t WHERE t.teamName ='$teamName'"; 


$result2 = $mysqli->query($user_id); 

    if ($result2->num_rows > 0) { 
    // output data of each row 
    while($row = $result2->fetch_assoc()) { 

     $userID = $row["teamID"]; 
     } 
    } 



$query = "SELECT answers FROM answers WHERE questionID=?"; 
$statement = $mysqli->prepare($query); 
$statement ->bind_param('i', $questionID); 

$statement->execute(); 

$statement->bind_result($answer); 

$statement->store_result(); 


?> 

    <div class="container"> 

    <!-- Page Content --> 

     <hr> 
<?php 
if ($result4 = $mysqli->query("SELECT * FROM submissions where teamID='$teamName' and questionID='$questionID'")) 
         { 
           // display records if there are records to display 
           if ($result4->num_rows > 0) 

           { 
         echo '<br><br><div class="alert alert-warning"><h5> 
         <strong>Already Answered!</strong> Good Luck with the Next </h5> 
        </div>'; 
         echo "<a href='questionList.php' class='btn btn-warning btn-block'>Continue with other questions! </a>"; 

           } 
           // if there are no records in the database, display an alert message 
           else 
           { 
             while ($statement->fetch()) { 
         if ($answer != $userAnswer) { 
          echo '<br><br><div class="alert alert-danger"><h5> 
           <strong>Sorry!</strong> the answer is incorrect! Please Try again!.</h5> 
           </div>'; 

          "<h3>Sorry the answer is incorrect! Please Try again!</h3><br>"; 
          //return to previous Page 
          echo '<a href="./question.php?id=' . $questionID . '" class="btn btn-primary btn-block">Return to Question </a>'; 
          $statement->free_result(); 
          $sql = "INSERT INTO `submissions`(`submissionsID`, `teamID`, `questionID`, `answer`,`qValue`,`status`,`timestamp`) VALUES (null,'$teamName','$questionID','$userAnswer','0','Wrong',NOW())"; 

          if (mysqli_query($mysqli, $sql)) { 

          } else { 
           echo "Error: " . $sql . "<br>" . mysqli_error($mysqli); 
          } 


         } else { 


          echo '<br><br><div class="alert alert-success"><h5> 
         <strong>Success!</strong> Correct Answer, Good Luck with the Next </h5> 
         </div>'; 
          echo "<a href='questionList.php' class='btn btn-success btn-block'>Continue with other questions! </a>"; 

          $statement->free_result(); 

          //MySqli Insert Query 

          $sql = "INSERT INTO `submissions`(`submissionsID`, `teamID`, `questionID`, `answer`,`qValue`,`status`,`timestamp`) VALUES (null,'$teamName','$questionID','$userAnswer','$questionValue','Correct',NOW())"; 

           if (mysqli_query($mysqli, $sql)) { 

           } else { 
            echo "Error: " . $sql . "<br>" . mysqli_error($mysqli); 
           } 


          } 

        } 

           } 
         } 
         // show an error if there is an issue with the database query 
         else 
         { 
           echo "<strong>Error:</strong>" . $mysqli->error; 
         } 


?> 
     <?php include_once('footer.php'); ?> 

    </div> 
    <!-- /.container --> 

    <!-- jQuery --> 
    <script src="js/jquery.js"></script> 

    <!-- Bootstrap Core JavaScript --> 
    <script src="js/bootstrap.min.js"></script> 

</body> 

</html> 
Смежные вопросы