Keiththolt
Keiththolt

Reputation: 57

PHP check if form is already submitted using num rows

I know the problem, But I cannot seem to fix it, and I was hoping someone on here could steer me in the right direction, What I want to do is check to see if a user has already submitted a correct answer to a question before checking it against the answers database and inserting it into the database, Simply to stop the same question being answered multiple times, I am a rookie with MYSQLi and not great at it, still learning it.

What I currently have so far is :

$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>";
}

I have tested it most ways, What I need to do is run a check to see if the current logged in user has already answered the questionID correctly, I am using a num_rows to see if its greater than 0, If it is greater than 0, they have answered it.

So my question is, Am I approaching it correctly, and what approach should I take?

Upvotes: 1

Views: 455

Answers (3)

Keiththolt
Keiththolt

Reputation: 57

I took a different approach to trying to get it to work and finally got it working, Just wanted to post my solution and thank everyone for helping.

<?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>

Upvotes: 0

PC3TJ
PC3TJ

Reputation: 852

It's a good approach. Try using

$row_cnt = $result->num_rows;

rather than

$row_cnt = mysqli_numrows($result);

also don't forget that $row_cnt will equal -1 in the event of any form of query error so you should check for that before assuming all values that arn't 0 are valid.

Upvotes: 1

Thomas N T
Thomas N T

Reputation: 459

I would suggest you to see natural language processing (NLP) techniques. If your answer is uni-gram (one word). This approach is ok. If you are dealing with n-grams of size more than 1,ie long sentences or paragraphs Then your approach will not work well. Answers can be written in different ways. So i would suggest some semantic methods like LSA(Latent Semantic Analysis) or simple vector representation models.

I can't think of any other methods to solve this problem.Try NLP methods. Will give you awesome results.

Upvotes: 0

Related Questions