مشكلة في انشاء نموذج اسئلة من قاعدة البيانات

أسماء الأماسي • منذ 6 سنوات

السلام عليكم ، بحاول اسوي موقع يسحب أسئلة من جدولها بشكل عشوائي ويقارن اذا كانت صح بعدين يسجل النتيجة في جدول للنتايج

المشكلة عندي هي انو الاجابة حتى لو كانت خطا يسجل صح ,, جربت if لكل خيار لكن ما زبط وشلته لكن برضو مو راضي

واحيان فجاه يعكس ويصير دايما يسجل انو خطأ ( لما كنت حاطة اذا خطا سجل خطأ) 

مدري اش المشكلة الي تخليه يلخبط .. يديكم العافية مقدماً 

الجداول:

جدول الاسئلة

score

الاكواد:

<?php
  $dbc = mysqli_connect('localhost', 'root', '', 'quiz')
    or die('Error connecting to MySQL server.');

$quiz = "SELECT * 
    FROM question
ORDER BY rand() 
   LIMIT 1";

$answers = "SELECT * 
    FROM userscore";

	 $result = mysqli_query($dbc, $quiz);     
     while($row = mysqli_fetch_array($result)) {
         
        $quizid = $row['id'];
         $question = $row['qus'];
         $ans1 = $row['ans'];
         $ans2 = $row['ans2'];
         $ans3 = $row['ans3'];
         $ans4 = $row['ans4'];
     } 
  
if($_SERVER['REQUEST_METHOD'] == 'POST') {
$userans = $_POST['answers'];

if($userans = $ans1){
    $score = "INSERT INTO userscore (score) VALUES ('correct')";
    mysqli_query($dbc, $score);
     echo $userans . '  is correct !';}
    
    else {
        echo $userans .' is wrong';
}}
    
?>

 

 

 



    <!DOCTYPE html>
    <html lang="en">

    <head>
        <meta charset="UTF-8">
        <title>quiz</title>
    </head>

    <body>

        <form action="quiz.php" method="post">
           <label for="qus"><?php echo $question ?></label>
            <select name="answers">
           <option value="ans"><?php echo $ans1 ?></option>
            <option value="ans2"><?php echo $ans2 ?></option>
            <option value="ans3"><?php echo $ans3 ?></option>
            <option value="ans4"><?php echo $ans4 ?></option>
        </select>
<input type="submit" name="submit">
        </form>
    </body>
    </html>

 

كلمات دليلية: mysql php web

الإجابة الصحيحة

Ali Majrashi • منذ 6 سنوات

وعليكم السلام ورحمة الله وبركاته 

الخطا هنا 

if($userans = $ans1){
    $score = "INSERT INTO userscore (score) VALUES ('correct')";
    mysqli_query($dbc, $score);
     echo $userans . '  is correct !';}
    
    else {
        echo $userans .' is wrong';
}}

للمقارنة. نستخدم == للتحقق من ان قيمة المتغير $userans تساوي قيمة المتغير $ans1 

كالتالي

if($userans == $ans1){
   $score = "INSERT INTO userscore (score) VALUES ('correct')";
   mysqli_query($dbc, $score);
   echo $userans . '  is correct !';
} else {
   echo $userans .' is wrong';
};

ملاحظة بعد التحقق راح يرجع دائما false لان راح يقارن القيمة المختاره بالنموذج الي تخزنت بالمتغير $userans من قبل الزائر ثم يقارنها باول اجابة مخزنة بقاعدة البيانات 

القيم الحاليه المعرفه بالنموذج هي

  1. ans
  2. ans2
  3. ans3
  4. ans4

بينما عند المقارنة داخل if قيمة المتغير $ans1 مختلفة على حسب الاجابة الاولى على السؤال

لحل مشكلة المقارنة نغير كود النموذج ونستبدل قيم كل اجابة بالاجابة الصحيحة كالتالي:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>quiz</title>
</head>

<body>

    <form action="" method="post">
      <label for="qus"><?php echo $question ?></label>
        <select name="answers">
        <option value="<?php echo $ans1 ?>"><?php echo $ans1 ?></option>
        <option value="<?php echo $ans2 ?>"><?php echo $ans2 ?></option>
        <option value="<?php echo $ans3 ?>"><?php echo $ans3 ?></option>
        <option value="<?php echo $ans4 ?>"><?php echo $ans4 ?></option>
    </select>
<input type="submit" name="submit">
    </form>
</body>
</html>

هنا راح نطيح بمشكلة عند المقارنة احيانا بيكون صح واحيانا بيكون خطأ 

السبب: ان لما المستخدم يستعرض سؤال احنا جبنا هالسؤال بشكل عشوائي من قاعدة البيانات ولما المستخدم يرسل الاجابة عشان التحقق راح يجي سؤال عشوائي ثاني من قاعدة البيانات لان معتمدين على اول استعلام بالتحقق بعد وهنا ممكن يكون نفس السؤال والمقارنة يكون ناتجها صح وممكن يجي سؤال ثاني والمقارنة يكون ناتجها خطأ لحل هالمشكلة انا نضيف حقل مخفي يحمل id حق السؤال يتم ارساله مع النموذج وقبل التحقق نستدعي السؤال من قاعدة البياانت لعملية التحقق الصحيحة كالتالي 

النموذج بيكون كذا الكود

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>quiz</title>
</head>

<body>

    <form action="" method="post">
      <input type="hidden" name="quiz_id" value="<?php echo $quizid ?>">
      <label for="qus"><?php echo $question ?></label>
        <select name="answers">
        <option value="<?php echo $ans1 ?>"><?php echo $ans1 ?></option>
        <option value="<?php echo $ans2 ?>"><?php echo $ans2 ?></option>
        <option value="<?php echo $ans3 ?>"><?php echo $ans3 ?></option>
        <option value="<?php echo $ans4 ?>"><?php echo $ans4 ?></option>
    </select>
<input type="submit" name="submit">
    </form>
</body>
</html>

ونغير كود التحقق انه يجيب السؤال المدخل بالنموذج بالاعتماد على quiz_id راح يكون الكود كالتالي

if($_SERVER['REQUEST_METHOD'] == 'POST') {
   $quiz_id = $_POST['quiz_id'];
   $userans = $_POST['answers'];

   $quiz = "SELECT *
       FROM question
   WHERE id = $quiz_id
      LIMIT 1";

      $result = mysqli_query($dbc, $quiz);
       while($row = mysqli_fetch_array($result)) {
           $quizid = $row['id'];
           $question = $row['qus'];
           $ans1 = $row['ans'];
           $ans2 = $row['ans2'];
           $ans3 = $row['ans3'];
           $ans4 = $row['ans4'];
       }

   if($userans == $ans1){
       $score = "INSERT INTO userscore (score, quiz_id) VALUES ('correct', $quizid)";
        mysqli_query($dbc, $score);
        echo $userans . '  is correct !';

      } else {
         $score = "INSERT INTO userscore (score, quiz_id) VALUES ('not correct', $quizid)";
         echo $userans .' is wrong';
      }
}

حاليا بالكود نقارن الاجابات باول اجابة اذا متشابهة تعتبر صح بس ممكن مستقبلا تخلين الاجابة مختلفة ممكن الاولى او الثانية او الثالثه لاضافتها بشكل سهل ممكن اضافة حقل داخل جدول question باسم correct_ans ثم نضع قيمة الاجابة الصحيحه وهي تكون نفس قيمة احد الاجابات وعند المقارنة نقارن فيها بدل اول اجابة للتحقق 

 

تقدرين تستفيدين من هالدرس يوضح انواع العمليات الممكن تنفيذها في php

العمليات في بي اتش بي PHP Operators

فيه ملاحظة بعد بالكود فيه هالسطر ماادري اش الفايدة منه ؟ اذا كل شي hardcoded ان الاجابة الاولى هي الصح دائما 

$answers = "SELECT * 
    FROM userscore";

ملاحظة اخيره دام احنا بالاستعلام راح نرجع سؤال واحد فقط نقدر نستغني عن while ونستخدم دالة mysqli_fetch_assoc الي راح ينفذ query ويجيب البيانات من جدول question على شكل associative array بحيث اسم الحقل مقابله القيمة المخزنه 

نقدر نستبدل هذا الكود

$result = mysqli_query($dbc, $quiz);
while($row = mysqli_fetch_array($result)) {
   $quizid = $row['id'];
   $question = $row['qus'];
   $ans1 = $row['ans'];
   $ans2 = $row['ans2'];
   $ans3 = $row['ans3'];
   $ans4 = $row['ans4'];
}

بهذا الكود

$result = mysqli_query($dbc, $quiz);
$row = mysqli_fetch_assoc($result);

$quizid = $row['id'];
$question = $row['qus'];
$ans1 = $row['ans'];
$ans2 = $row['ans2'];
$ans3 = $row['ans3'];
$ans4 = $row['ans4'];

وراح يشتغل بدون الحاجة لاستخدام while لان الناتج مصفوفة واحدة من النوع  associative نقدر نوصل لاي قيمة باستخدام اسم الحقل بالجدول

الإجابات (1)

Ali Majrashi • منذ 6 سنوات
الإجابة الصحيحة

وعليكم السلام ورحمة الله وبركاته 

الخطا هنا 

if($userans = $ans1){
    $score = "INSERT INTO userscore (score) VALUES ('correct')";
    mysqli_query($dbc, $score);
     echo $userans . '  is correct !';}
    
    else {
        echo $userans .' is wrong';
}}

للمقارنة. نستخدم == للتحقق من ان قيمة المتغير $userans تساوي قيمة المتغير $ans1 

كالتالي

if($userans == $ans1){
   $score = "INSERT INTO userscore (score) VALUES ('correct')";
   mysqli_query($dbc, $score);
   echo $userans . '  is correct !';
} else {
   echo $userans .' is wrong';
};

ملاحظة بعد التحقق راح يرجع دائما false لان راح يقارن القيمة المختاره بالنموذج الي تخزنت بالمتغير $userans من قبل الزائر ثم يقارنها باول اجابة مخزنة بقاعدة البيانات 

القيم الحاليه المعرفه بالنموذج هي

  1. ans
  2. ans2
  3. ans3
  4. ans4

بينما عند المقارنة داخل if قيمة المتغير $ans1 مختلفة على حسب الاجابة الاولى على السؤال

لحل مشكلة المقارنة نغير كود النموذج ونستبدل قيم كل اجابة بالاجابة الصحيحة كالتالي:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>quiz</title>
</head>

<body>

    <form action="" method="post">
      <label for="qus"><?php echo $question ?></label>
        <select name="answers">
        <option value="<?php echo $ans1 ?>"><?php echo $ans1 ?></option>
        <option value="<?php echo $ans2 ?>"><?php echo $ans2 ?></option>
        <option value="<?php echo $ans3 ?>"><?php echo $ans3 ?></option>
        <option value="<?php echo $ans4 ?>"><?php echo $ans4 ?></option>
    </select>
<input type="submit" name="submit">
    </form>
</body>
</html>

هنا راح نطيح بمشكلة عند المقارنة احيانا بيكون صح واحيانا بيكون خطأ 

السبب: ان لما المستخدم يستعرض سؤال احنا جبنا هالسؤال بشكل عشوائي من قاعدة البيانات ولما المستخدم يرسل الاجابة عشان التحقق راح يجي سؤال عشوائي ثاني من قاعدة البيانات لان معتمدين على اول استعلام بالتحقق بعد وهنا ممكن يكون نفس السؤال والمقارنة يكون ناتجها صح وممكن يجي سؤال ثاني والمقارنة يكون ناتجها خطأ لحل هالمشكلة انا نضيف حقل مخفي يحمل id حق السؤال يتم ارساله مع النموذج وقبل التحقق نستدعي السؤال من قاعدة البياانت لعملية التحقق الصحيحة كالتالي 

النموذج بيكون كذا الكود

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>quiz</title>
</head>

<body>

    <form action="" method="post">
      <input type="hidden" name="quiz_id" value="<?php echo $quizid ?>">
      <label for="qus"><?php echo $question ?></label>
        <select name="answers">
        <option value="<?php echo $ans1 ?>"><?php echo $ans1 ?></option>
        <option value="<?php echo $ans2 ?>"><?php echo $ans2 ?></option>
        <option value="<?php echo $ans3 ?>"><?php echo $ans3 ?></option>
        <option value="<?php echo $ans4 ?>"><?php echo $ans4 ?></option>
    </select>
<input type="submit" name="submit">
    </form>
</body>
</html>

ونغير كود التحقق انه يجيب السؤال المدخل بالنموذج بالاعتماد على quiz_id راح يكون الكود كالتالي

if($_SERVER['REQUEST_METHOD'] == 'POST') {
   $quiz_id = $_POST['quiz_id'];
   $userans = $_POST['answers'];

   $quiz = "SELECT *
       FROM question
   WHERE id = $quiz_id
      LIMIT 1";

      $result = mysqli_query($dbc, $quiz);
       while($row = mysqli_fetch_array($result)) {
           $quizid = $row['id'];
           $question = $row['qus'];
           $ans1 = $row['ans'];
           $ans2 = $row['ans2'];
           $ans3 = $row['ans3'];
           $ans4 = $row['ans4'];
       }

   if($userans == $ans1){
       $score = "INSERT INTO userscore (score, quiz_id) VALUES ('correct', $quizid)";
        mysqli_query($dbc, $score);
        echo $userans . '  is correct !';

      } else {
         $score = "INSERT INTO userscore (score, quiz_id) VALUES ('not correct', $quizid)";
         echo $userans .' is wrong';
      }
}

حاليا بالكود نقارن الاجابات باول اجابة اذا متشابهة تعتبر صح بس ممكن مستقبلا تخلين الاجابة مختلفة ممكن الاولى او الثانية او الثالثه لاضافتها بشكل سهل ممكن اضافة حقل داخل جدول question باسم correct_ans ثم نضع قيمة الاجابة الصحيحه وهي تكون نفس قيمة احد الاجابات وعند المقارنة نقارن فيها بدل اول اجابة للتحقق 

 

تقدرين تستفيدين من هالدرس يوضح انواع العمليات الممكن تنفيذها في php

العمليات في بي اتش بي PHP Operators

فيه ملاحظة بعد بالكود فيه هالسطر ماادري اش الفايدة منه ؟ اذا كل شي hardcoded ان الاجابة الاولى هي الصح دائما 

$answers = "SELECT * 
    FROM userscore";

ملاحظة اخيره دام احنا بالاستعلام راح نرجع سؤال واحد فقط نقدر نستغني عن while ونستخدم دالة mysqli_fetch_assoc الي راح ينفذ query ويجيب البيانات من جدول question على شكل associative array بحيث اسم الحقل مقابله القيمة المخزنه 

نقدر نستبدل هذا الكود

$result = mysqli_query($dbc, $quiz);
while($row = mysqli_fetch_array($result)) {
   $quizid = $row['id'];
   $question = $row['qus'];
   $ans1 = $row['ans'];
   $ans2 = $row['ans2'];
   $ans3 = $row['ans3'];
   $ans4 = $row['ans4'];
}

بهذا الكود

$result = mysqli_query($dbc, $quiz);
$row = mysqli_fetch_assoc($result);

$quizid = $row['id'];
$question = $row['qus'];
$ans1 = $row['ans'];
$ans2 = $row['ans2'];
$ans3 = $row['ans3'];
$ans4 = $row['ans4'];

وراح يشتغل بدون الحاجة لاستخدام while لان الناتج مصفوفة واحدة من النوع  associative نقدر نوصل لاي قيمة باستخدام اسم الحقل بالجدول

لايوجد لديك حساب في عالم البرمجة؟

تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !