Jump to content

Olumide

Members
  • Posts

    130
  • Joined

  • Last visited

  • Days Won

    3

Olumide last won the day on November 25 2023

Olumide had the most liked content!

Profile Information

  • Gender
    Male

Recent Profile Visitors

2,665 profile views

Olumide's Achievements

Advanced Member

Advanced Member (4/5)

10

Reputation

5

Community Answers

  1. The error PHP Warning: Undefined property: MySQLtabledit::$content is due to the fact that the $content property is being referenced in your code, but it hasn't been explicitly declared as a class property in the MySQLtabledit class. Modified Snippet of Your Class class MySQLtabledit { var $content; // Declare the content property }
  2. You can create a script that pulls weather data from a public API and displays the current weather for your location or any given city.
  3. This should work for you <?php include('styles/top.php'); ?> <div id="left"> <?php if ($user_level != 1) { // You might want to show a message if the user is not admin } else { $sql = "SELECT SUM(status='Pending') as pending , SUM(status='Layon') as layon , SUM(status='Late') as late , SUM(status='Paid') as paid FROM orders"; $result = mysqli_query($con, $sql); $row = mysqli_fetch_assoc($result); echo " <form action='pending.php'> <input type=\"submit\" class=\"button\" value=\"Pending Payments ( {$row['pending']} )\"> </form> <form action='total-layons.php'> <input type=\"submit\" class=\"button\" value=\"Total Layons ( {$row['layon']} )\"> </form> <form action='total-late.php'> <input type=\"submit\" class=\"button\" value=\"Total Late Payments ( {$row['late']} )\"> </form> <form action='total-paid.php'> <input type=\"submit\" class=\"button\" value=\"Total Paid Payments ( {$row['paid']} )\"> </form> <form action='add-customer.php'> <input type=\"submit\" class=\"button2\" value=\"Add Customer\"> </form> "; } ?> </div> <div id="right"> <div id="view_box"> <ul> <li><img src="images/1.png" /></li> </ul> </div> <hr /> <?php if ($user_level != 1) { echo "No Access Allowed Admin Only "; } else { $form = " <form action='add-customer.php' method='post'> <table cellspacing='10' cellpadding='10'> <tr> <td>Customer Name</td> <td><input type='text' name='customer_name' /></td> </tr> <tr> <td></td> <td><input type='submit' name='submit' class='button' value='Add New Order To The system'/></td> </tr> </table> </form>"; if (isset($_POST['submit'])) { $name = $_POST['customer_name']; if ($name) { // Prepared statement for better security if ($stmt = mysqli_prepare($con, "INSERT INTO customers (customer_name) VALUES (?)")) { mysqli_stmt_bind_param($stmt, "s", $name); if (mysqli_stmt_execute($stmt)) { echo "<font color='Yellow'>Thank you, Information has been saved to the database <a href='index.php'>Click Here</a> To Return to Previous Page!.</font> <br>"; } else { echo "Error inserting customer name: " . mysqli_error($con); } mysqli_stmt_close($stmt); } else { echo "Error preparing statement: " . mysqli_error($con); } } else { echo "Please enter customers name. <br> $form"; } } else { echo $form; } } ?> </div> <?php include('styles/bottom.php'); ?>
  4. In your form handling code, you're calling `incude('');`, which is a typo. It should be `include('');` but I don't think it's meant to be there. This line is not needed, so you should just remove it.
  5. Thank you sir, but I have created a table for user_responses and yet, while using the pagination (next, previous) the selected option are all deselected. Attached is the screenshot of page1 and page 2 and database with my script DROP TABLE IF EXISTS `exams`; CREATE TABLE IF NOT EXISTS `exams` ( `id` int NOT NULL AUTO_INCREMENT, `title` varchar(255) DEFAULT NULL, `description` text, `duration` int DEFAULT NULL, `pass_mark` int NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=42 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; DROP TABLE IF EXISTS `questions`; CREATE TABLE IF NOT EXISTS `questions` ( `id` int NOT NULL AUTO_INCREMENT, `exam_id` int NOT NULL, `question` text NOT NULL, `answer_a` varchar(255) DEFAULT NULL, `answer_b` varchar(255) DEFAULT NULL, `answer_c` varchar(255) DEFAULT NULL, `answer_d` varchar(255) DEFAULT NULL, `correct_answer` char(1) DEFAULT NULL, PRIMARY KEY (`id`), KEY `exam_id` (`exam_id`) ) ENGINE=MyISAM AUTO_INCREMENT=252 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; DROP TABLE IF EXISTS `results`; CREATE TABLE IF NOT EXISTS `results` ( `id` int NOT NULL AUTO_INCREMENT, `user_id` int DEFAULT NULL, `exam_id` int DEFAULT NULL, `score` int DEFAULT NULL, PRIMARY KEY (`id`), KEY `user_id` (`user_id`), KEY `exam_id` (`exam_id`) ) ENGINE=MyISAM AUTO_INCREMENT=37 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; DROP TABLE IF EXISTS `users`; CREATE TABLE IF NOT EXISTS `users` ( `id` int NOT NULL AUTO_INCREMENT, `name` varchar(100) DEFAULT NULL, `email` varchar(100) DEFAULT NULL, `password` varchar(255) DEFAULT NULL, `role` enum('admin','student') DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=29 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; DROP TABLE IF EXISTS `user_responses`; CREATE TABLE IF NOT EXISTS `user_responses` ( `id` int NOT NULL AUTO_INCREMENT, `user_id` int NOT NULL, `exam_id` int NOT NULL, `question_id` int NOT NULL, `selected_option` varchar(255) NOT NULL, `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=27 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; exam.php <?php if (session_status() == PHP_SESSION_NONE) { session_start(); } include 'db_connect.php'; if (!isset($_SESSION['fullName']) || !isset($_SESSION['email']) || !isset($_SESSION['exam_id']) || !isset($_SESSION['user_id'])) { header('Location: instruction.php?exam_id=' . $_SESSION['exam_id']); exit; } $exam_id = $_SESSION['exam_id']; $user_id = $_SESSION['user_id']; $fullName = $_SESSION['fullName']; $email = $_SESSION['email']; $stmt = $pdo->prepare('SELECT * FROM exams WHERE id = ?'); $stmt->execute([$exam_id]); $exam = $stmt->fetch(PDO::FETCH_ASSOC); if (!$exam) { die('Exam not found'); } $stmt = $pdo->prepare('SELECT * FROM questions WHERE exam_id = ?'); $stmt->execute([$exam_id]); $questions = $stmt->fetchAll(PDO::FETCH_ASSOC); $remainingTime = $_SESSION['remaining_time'] ?? ($exam['duration'] * 60); if (isset($_SESSION['exam_start_time'])) { $elapsedTime = time() - $_SESSION['exam_start_time']; $remainingTime = max(0, $remainingTime - $elapsedTime); } else { $_SESSION['exam_start_time'] = time(); } $_SESSION['remaining_time'] = $remainingTime; $selected_answers = $_SESSION['selected_answers'] ?? []; $questionsPerPage = 5; $totalQuestions = count($questions); $totalPages = ceil($totalQuestions / $questionsPerPage); $page = isset($_GET['page']) ? (int)$_GET['page'] : 1; $page = max(1, min($page, $totalPages)); $offset = ($page - 1) * $questionsPerPage; $questionsToDisplay = array_slice($questions, $offset, $questionsPerPage); ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title><?php echo htmlspecialchars($exam['title']); ?></title> <link rel="stylesheet" type="text/css" href="styles.css"> <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script> <script> $(document).ready(function() { let duration = <?php echo $remainingTime; ?>; let timer; function startTimer() { timer = setInterval(function() { duration--; if (duration < 0) duration = 0; $('#timer').text(`${Math.floor(duration / 60)}:${duration % 60 < 10 ? '0' : ''}${duration % 60}`); if (duration === 0) { clearInterval(timer); submitExam(); } else if (duration <= 30) { $('#examForm input[type="radio"]').prop('disabled', true); if (duration === 5) { new Audio('alarm.mp3').play(); } } }, 1000); } startTimer(); function saveAnswers(callback) { let answers = {}; $('#examForm input[type="radio"]:checked').each(function() { let questionId = $(this).attr('name').match(/\d+/)[0]; let value = $(this).val(); answers[questionId] = value; }); $.ajax({ url: 'save_answers.php', type: 'POST', data: { answers: JSON.stringify(answers) }, success: function(response) { if (callback) callback(); } }); } function submitExam() { clearInterval(timer); let answers = {}; $('#examForm input[type="radio"]:checked').each(function() { let questionId = $(this).attr('name').match(/\d+/)[0]; let value = $(this).val(); answers[questionId] = value; }); $('<input>').attr({ type: 'hidden', name: 'selected_answers', value: JSON.stringify(answers) }).appendTo('#examForm'); $.ajax({ url: 'submit_exam.php', type: 'POST', data: $('#examForm').serialize(), success: function(response) { $('#examStatus').html(response); $('#examForm').hide(); }, error: function() { $('#examStatus').html('Error submitting exam.'); } }); } $('#examForm').on('submit', function(e) { e.preventDefault(); if (duration > 0) { if (confirm('Are you sure you want to submit the exam?')) { saveAnswers(submitExam); } else { if (timer) clearInterval(timer); startTimer(); } } else { submitExam(); } }); $('.pagination a').on('click', function(e) { e.preventDefault(); saveAnswers(function() { window.location.href = $(this).attr('href'); }.bind(this)); }); function preselectAnswers() { let selectedAnswers = <?php echo json_encode($selected_answers); ?>; for (let questionId in selectedAnswers) { let answer = selectedAnswers[questionId]; $(`input[name="answers[${questionId}]"][value="${answer}"]`).prop('checked', true); } } preselectAnswers(); }); </script> </head> <body> <div class="header"> <div class="timer">Time Remaining: <span id="timer"></span></div> <div class="subject"> <h1><?php echo htmlspecialchars($exam['title']); ?></h1> </div> <div class="name"> <?php echo htmlspecialchars($fullName); ?> </div> </div> <div style="padding-top: 60px; height: calc(100vh - 60px); overflow: auto;"> <form id="examForm"> <input type="hidden" name="exam_id" value="<?php echo htmlspecialchars($exam['id']); ?>"> <?php foreach ($questionsToDisplay as $index => $question): ?> <div class="question"> <p><?php echo ($offset + $index + 1) . '. ' . htmlspecialchars($question['question']); ?></p> <?php $options = [ 'A' => $question['answer_a'] ?? '', 'B' => $question['answer_b'] ?? '', 'C' => $question['answer_c'] ?? '', 'D' => $question['answer_d'] ?? '', ]; ?> <ul style="list-style-type: none;"> <?php foreach ($options as $key => $option): ?> <?php if (!empty($option)): ?> <li> <label> <input type="radio" name="answers[<?php echo $question['id']; ?>]" value="<?php echo htmlspecialchars($key); ?>" <?php echo (isset($selected_answers[$question['id']]) && $selected_answers[$question['id']] === $key) ? 'checked' : ''; ?>> <?php echo htmlspecialchars($key . '. ' . $option); ?> </label> </li> <?php endif; ?> <?php endforeach; ?> </ul> </div> <?php endforeach; ?> <div class="pagination"> <?php if ($page > 1): ?> <a href="?page=<?php echo $page - 1; ?>">&laquo; Previous</a> <?php endif; ?> <?php if ($page < $totalPages): ?> <a href="?page=<?php echo $page + 1; ?>">Next &raquo;</a> <?php endif; ?> </div> <div style="text-align: center;"> <button type="submit" style="display: inline-block;">Submit</button> </div> </form> <div id="examStatus"></div> </div> </body> </html> save_answers.php <?php if (session_status() == PHP_SESSION_NONE) { session_start(); } include 'db_connect.php'; if (!isset($_SESSION['exam_id']) || !isset($_SESSION['user_id'])) { die('Invalid request'); } $exam_id = $_SESSION['exam_id']; $user_id = $_SESSION['user_id']; $answers = json_decode($_POST['answers'], true); if (!$answers) { die('No answers to save'); } $_SESSION['selected_answers'] = array_merge($_SESSION['selected_answers'] ?? [], $answers); try { foreach ($answers as $question_id => $selected_option) { $stmt = $pdo->prepare('REPLACE INTO user_responses (user_id, exam_id, question_id, selected_option) VALUES (?, ?, ?, ?)'); $stmt->execute([$user_id, $exam_id, $question_id, $selected_option]); } echo 'Answers saved successfully'; } catch (PDOException $e) { echo 'Error saving answers: ' . $e->getMessage(); } submit_exam.php <?php if (session_status() == PHP_SESSION_NONE) { session_start(); } include 'db_connect.php'; // Ensure this file sets up the $pdo variable if ($_SERVER['REQUEST_METHOD'] === 'POST') { $exam_id = $_SESSION['exam_id']; $user_id = $_SESSION['user_id']; $selected_answers = json_decode($_POST['selected_answers'], true); // Insert or update user responses foreach ($selected_answers as $question_id => $selected_option) { $stmt = $pdo->prepare('REPLACE INTO user_responses (user_id, exam_id, question_id, selected_option) VALUES (?, ?, ?, ?)'); $stmt->execute([$user_id, $exam_id, $question_id, $selected_option]); } // Calculate the score $score = 0; foreach ($selected_answers as $question_id => $selected_option) { $stmt = $pdo->prepare('SELECT correct_answer FROM questions WHERE id = ?'); $stmt->execute([$question_id]); $correct_answer = $stmt->fetchColumn(); if ($correct_answer === $selected_option) { $score++; } } // Insert or update the result in the results table $stmt = $pdo->prepare('REPLACE INTO results (user_id, exam_id, score) VALUES (?, ?, ?)'); $stmt->execute([$user_id, $exam_id, $score]); // Destroy the session session_unset(); session_destroy(); // Response message echo "Exam submitted successfully! Your score is: $score"; } ?> Screen shot
  6. Hi, I am having issues with this cbt project whereby my questions are selected 5 per page and when the user click on NEXT, the first page selected radio button option should be saved so that when the user click on previous button, he should be able to see the selected options. But I have been finding difficult to do. And I don't think it is right to create another table again to store the user answers because in each subjects, there are more than 15 questions. Please here is exam script and the screen short of the first page of the exam. <!DOCTYPE html> <html> <head> <title><?php echo htmlspecialchars($exam['title']); ?></title> <link rel="stylesheet" type="text/css" href="styles.css"> <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script> <script> $(document).ready(function() { let duration = <?php echo $remainingTime; ?>; let timer; function startTimer() { timer = setInterval(function() { duration--; if (duration < 0) duration = 0; $('#timer').text(`${Math.floor(duration / 60)}:${duration % 60 < 10 ? '0' : ''}${duration % 60}`); if (duration === 0) { clearInterval(timer); submitExam(); // Automatically submit the form when time expires } else if (duration <= 30) { // Disable form elements when less than 30 seconds remain $('#examForm input[type="radio"]').prop('disabled', true); if (duration === 5) { // Play alarm sound if time is below 5 seconds new Audio('alarm.mp3').play(); } } }, 1000); } startTimer(); function saveAnswers() { let answers = {}; $('#examForm input[type="radio"]:checked').each(function() { let name = $(this).attr('name'); let value = $(this).val(); answers[name] = value; }); return $.ajax({ url: 'save_answers.php', type: 'POST', data: { page: <?php echo $page; ?>, answers: JSON.stringify(answers) } }); } function submitExam() { clearInterval(timer); let answers = {}; $('#examForm input[type="radio"]:checked').each(function() { let name = $(this).attr('name'); let value = $(this).val(); answers[name] = value; }); $('<input>').attr({ type: 'hidden', name: 'selected_answers', value: JSON.stringify(answers) }).appendTo('#examForm'); $.ajax({ url: 'submit_exam.php', type: 'POST', data: $('#examForm').serialize(), success: function(response) { $('#examStatus').html(response); $('#examForm').hide(); // Hide the form after submission }, error: function() { $('#examStatus').html('Error submitting exam.'); } }); } $('#examForm').on('submit', function(e) { e.preventDefault(); if (duration > 0) { if (confirm('Are you sure you want to submit the exam?')) { saveAnswers().done(function() { submitExam(); }); } else { if (timer) clearInterval(timer); startTimer(); } } else { submitExam(); } }); $('.pagination a').on('click', function(e) { e.preventDefault(); saveAnswers().done(function() { window.location.href = $(this).attr('href'); // Navigate to the new page }.bind(this)); }); function preselectAnswers() { let selectedAnswers = <?php echo json_encode($selected_answers); ?>; for (let questionId in selectedAnswers) { let answer = selectedAnswers[questionId]; $(`input[name="answers[${questionId}]"][value="${answer}"]`).prop('checked', true); } } preselectAnswers(); }); </script> </head> <body> <div class="header"> <div class="timer">Time Remaining: <span id="timer"></span></div> <div class="subject"> <h1><?php echo htmlspecialchars($exam['title']); ?></h1> </div> <div class="name"> <?php echo htmlspecialchars($fullName); ?> </div> </div> <div style="padding-top: 60px; height: calc(100vh - 60px); overflow: auto;"> <!-- Adjusted for fixed header --> <form id="examForm"> <input type="hidden" name="exam_id" value="<?php echo htmlspecialchars($exam['id']); ?>"> <?php foreach ($questionsToDisplay as $index => $question): ?> <div class="question"> <p><?php echo ($offset + $index + 1) . '. ' . htmlspecialchars($question['question']); ?></p> <?php $options = isset($question['options']) ? json_decode($question['options'], true) : null; if (is_null($options) || !is_array($options)) { $options = [ 'A' => $question['answer_a'] ?? '', 'B' => $question['answer_b'] ?? '', 'C' => $question['answer_c'] ?? '', 'D' => $question['answer_d'] ?? '', ]; } ?> <ul style="list-style-type: none;"> <?php foreach ($options as $key => $option): ?> <?php if (!empty($option)): ?> <li> <label> <input type="radio" name="answers[<?php echo $question['id']; ?>]" value="<?php echo htmlspecialchars($key); ?>" <?php echo (isset($_SESSION['selected_answers'][$question['id']]) && $_SESSION['selected_answers'][$question['id']] === $key) ? 'checked' : ''; ?>> <?php echo htmlspecialchars($key . '. ' . $option); ?> </label> </li> <?php endif; ?> <?php endforeach; ?> </ul> </div> <?php endforeach; ?> <div class="pagination"> <?php if ($page > 1): ?> <a href="?page=<?php echo ($page - 1); ?>" class="pagination button">&laquo; Previous</a> <?php endif; ?> <?php if ($page < $totalPages): ?> <a href="?page=<?php echo ($page + 1); ?>" class="pagination button">Next &raquo;</a> <?php endif; ?> </div> <button type="submit">Submit Exam</button> </form> <div id="examStatus"></div> </div> </body> </html> save_answers.php <?php session_start(); if ($_SERVER['REQUEST_METHOD'] === 'POST') { $page = isset($_POST['page']) ? (int)$_POST['page'] : 0; $answers = isset($_POST['answers']) ? json_decode($_POST['answers'], true) : []; if (!isset($_SESSION['selected_answers'])) { $_SESSION['selected_answers'] = []; } // Update session with the received answers $_SESSION['selected_answers'][$page] = $answers; echo 'Answers saved.'; } ?> screen short
  7. Hi, I am currently using a shared hosting provider that includes cPanel, MySQL database support, and phpMyAdmin, but I've been experiencing frequent fluctuations and downtime. I'm looking for a more stable and reliable hosting solution that is also cost-effective. Here are my requirements: cPanel or Equivalent: I need a control panel for easy website and server management. MySQL Database Support: Reliable MySQL database hosting is essential. phpMyAdmin: A web-based interface for managing MySQL databases. Uptime and Stability: A hosting provider known for good uptime and stability. Cost-Effective: Affordable pricing, ideally comparable to shared hosting costs. Additional Features: Any additional features like automatic backups, SSL certificates, and support for PHP applications would be a plus. Could you please recommend any hosting providers that meet these criteria? Personal experiences and specific plans that you have had success with would be greatly appreciated. Thank you for your assistance!
  8. You'll need to install Composer on your web server. Composer is a dependency manager for PHP that allows you to easily manage libraries and packages. Go to the https://getcomposer.org/, download the Installer for Composer depending on your OS. Open the downloaded Composer-Setup.exe (Windows OS as an example) file. Follow the prompts in the installation wizard. Make sure to select the option to add Composer to the system PATH during installation. Verify Installation: Open Command Prompt. Type composer and press Enter. You should see the Composer version and available commands, confirming that Composer is installed and accessible globally. Open Command Prompt and navigate to your project directory: cd path\to\your\project\directory Use Composer to install the PhpSpreadsheet library by creating a composer.json file and running composer install. Include the Composer autoload file in your PHP script and use PhpSpreadsheet to read your Excel files.
  9. To read .xlsx files using PHP 8, you can use the PhpSpreadsheet library. It's the successor to PHPExcel and fully supports PHP 8. You can run this command "composer require phpoffice/phpspreadsheet" and Once you have PhpSpreadsheet installed, you can use it to read .xlsx files. Here's a basic example: <?php require 'vendor/autoload.php'; use PhpOffice\PhpSpreadsheet\IOFactory; try { $spreadsheet = IOFactory::load('path/to/your/file.xlsx'); $sheet = $spreadsheet->getActiveSheet(); // Get the highest row and column numbers referenced in the worksheet $highestRow = $sheet->getHighestRow(); // e.g. 10 $highestColumn = $sheet->getHighestColumn(); // e.g 'F' // Iterate over each row in the worksheet in turn for ($row = 1; $row <= $highestRow; $row++) { $rowData = $sheet->rangeToArray('A' . $row . ':' . $highestColumn . $row, NULL, TRUE, FALSE); print_r($rowData); } } catch (Exception $e) { echo 'Error loading file: ', $e->getMessage(); } ?>
  10. Thank you so much for the support and all the guidance. Though, I have solved the problem by using instascan instead of the previous quagga and html5 qrcode. But getting worked is nothing but to take to practices all the programming advices you have highlighted which is very essential. I cannot but to always thank you all in this forum for your help and I can say ever since I have joined this forum, I have never for once regret that. You are all amazing. Cheers
  11. I want to design an attendance system such that the class teacher can scan students' ID card QR code using their phone, and it will be recorded immediately in the database. Currently, I have tested HTML QR code and Quagga, but I haven't tested scanning the ID card yet. I am only testing with a phone and PC camera because I want the user to be able to use either device to scan the student ID card. I'm not sure where the error is. Could anyone please enlighten me? Here is the dashboard.php where the user can click scan ID Card <?php // pages/dashboard.php session_start(); if (!isset($_SESSION['username'])) { header('Location: login.php'); exit(); } ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link rel="stylesheet" href="../css/styles.css"> <title>Dashboard</title> </head> <body> <div class="container"> <header> <div id="branding"> <h1>QR Smart Attendance</h1> </div> <nav> <ul> <li><a href="dashboard.php">Dashboard</a></li> <li><a href="generate_id_card.php">Generate ID Card</a></li> <li><a href="record_attendance.php">Record Attendance</a></li> <li><a href="transfer_attendance.php">Transfer Attendance</a></li> <li><a href="logout.php">Logout</a></li> </ul> </nav> </header> <div class="dashboard-container"> <h2>Welcome, <?php echo htmlspecialchars($_SESSION['username']); ?></h2> <!-- Add a button for scanning ID cards --> <button id="scanButton">Scan ID Card</button> <!-- Container for the scanner --> <div id="scanner-container" style="width: 100%; height: 400px; display:none;"></div> <script src="https://unpkg.com/@ericblade/quagga2/dist/quagga.min.js"></script> <script> document.getElementById('scanButton').addEventListener('click', function() { // Display the scanner container document.getElementById('scanner-container').style.display = 'block'; Quagga.init({ inputStream: { name: "Live", type: "LiveStream", target: document.querySelector('#scanner-container'), constraints: { width: 640, height: 480, facingMode: "environment" // or "user" for front-facing camera } }, decoder: { readers: ["qr_reader"] // Use the QR reader }, locate: true // Enable locating the QR code in the image }, function(err) { if (err) { console.error('QuaggaJS initialization failed:', err); return; } console.log("QuaggaJS initialization finished. Ready to start"); Quagga.start(); }); // Handle scanned results Quagga.onDetected(function(result) { if (result && result.codeResult && result.codeResult.code) { console.log('Scanned code:', result.codeResult.code); // Redirect to record_attendance.php with student_id or handle accordingly window.location.href = 'record_attendance.php?student_id=' + result.codeResult.code; } else { console.warn('No code detected'); } }); // Optional: Handle processing errors Quagga.onProcessed(function(result) { var drawingCtx = Quagga.canvas.ctx.overlay, drawingCanvas = Quagga.canvas.dom.overlay; if (result) { if (result.boxes) { drawingCtx.clearRect(0, 0, drawingCanvas.width, drawingCanvas.height); result.boxes.filter(function(box) { return box !== result.box; }).forEach(function(box) { Quagga.ImageDebug.drawPath(box, { x: 0, y: 1 }, drawingCtx, { color: "green", lineWidth: 2 }); }); } if (result.box) { Quagga.ImageDebug.drawPath(result.box, { x: 0, y: 1 }, drawingCtx, { color: "#00F", lineWidth: 2 }); } if (result.codeResult && result.codeResult.code) { Quagga.ImageDebug.drawPath(result.line, { x: 'x', y: 'y' }, drawingCtx, { color: 'red', lineWidth: 3 }); } } }); }); </script> </div> </div> </body> </html> And here is record_attendance.php <?php // pages/record_attendance.php session_start(); if (!isset($_SESSION['username'])) { header('Location: login.php'); exit(); } require_once '../includes/db.php'; // Include db.php for database connection and functions // Check if a student ID is scanned and process attendance if (isset($_GET['student_id'])) { $student_id = sanitizeInput($_GET['student_id']); $date = date('Y-m-d'); // Check if attendance record already exists for today $query = "SELECT * FROM attendance WHERE student_id = ? AND date = ?"; $stmt = $conn->prepare($query); $stmt->bind_param("is", $student_id, $date); $stmt->execute(); $stmt->store_result(); if ($stmt->num_rows == 0) { // If no record exists, insert new attendance record $query = "INSERT INTO attendance (student_id, date, status) VALUES (?, ?, 'present')"; $stmt = $conn->prepare($query); $stmt->bind_param("is", $student_id, $date); $stmt->execute(); // Optional: Redirect back to dashboard after recording attendance header('Location: dashboard.php'); exit(); } else { // Optional: Handle case where attendance is already recorded for today echo "Attendance already recorded for today."; // Redirect or display message as needed } } else { // Handle case where no student ID is scanned echo "No student ID received. Please scan a valid student ID."; // Redirect or display message as needed } ?> Here is generate_id_card.php <?php // pages/generate_id_card.php session_start(); if (!isset($_SESSION['username']) || $_SESSION['role'] != 'admin') { header('Location: login.php'); exit(); } require_once '../includes/db.php'; // Ensure this path is correct require_once '../includes/functions.php'; if ($_SERVER['REQUEST_METHOD'] == 'POST') { $name = sanitizeInput($_POST['name']); $class = sanitizeInput($_POST['class']); $photo = $_FILES['photo']; if ($photo['error'] == 0) { $photo_path = '../images/' . basename($photo['name']); move_uploaded_file($photo['tmp_name'], $photo_path); // Insert student data into the database $insert_query = "INSERT INTO students (name, class, photo) VALUES (?, ?, ?)"; $stmt = $conn->prepare($insert_query); $stmt->bind_param("sss", $name, $class, $photo_path); $stmt->execute(); // Retrieve the inserted student's ID $student_id = $conn->insert_id; // Generate ID card with the student's details $id_card = generateIDCard($name, $class, $photo_path); echo "<p>ID Card generated: <a href='$id_card'>Download ID Card</a></p>"; } else { echo "<p>Error uploading photo.</p>"; } } ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link rel="stylesheet" href="../css/styles.css"> <title>Generate ID Card</title> </head> <body> <div class="container"> <header> <div id="branding"> <h1>QR Smart Attendance</h1> </div> </header> <div class="generate-container"> <h2>Generate Student ID Card</h2> <form method="post" enctype="multipart/form-data"> <input type="text" name="name" placeholder="Student Name" required> <input type="text" name="class" placeholder="Class" required> <input type="file" name="photo" accept="image/*" required> <button type="submit">Generate</button> </form> </div> </div> </body> </html> Here is functions.php <?php require_once '../vendor/autoload.php'; use Endroid\QrCode\QrCode; use Endroid\QrCode\Writer\PngWriter; function generateIDCard($name, $class, $photo_path) { // Ensure QR code directory exists $qrCodeDir = '../images/qrcodes'; if (!is_dir($qrCodeDir)) { mkdir($qrCodeDir, 0755, true); } // Generate a unique ID for the QR code $uniqueId = uniqid(); // Create the QR code $qrCode = new QrCode($uniqueId); $qrCode->setSize(300); // Set the QR code file path $qrCodePath = "$qrCodeDir/$uniqueId.png"; $qrCode->writeFile($qrCodePath); // Ensure font file exists $fontPath = '../fonts/arial.ttf'; if (!file_exists($fontPath)) { die('Font file not found.'); } // Create the ID card image $idCard = imagecreate(600, 400); $white = imagecolorallocate($idCard, 255, 255, 255); $black = imagecolorallocate($idCard, 0, 0, 0); // Add student details imagettftext($idCard, 20, 0, 20, 50, $black, $fontPath, "Name: $name"); imagettftext($idCard, 20, 0, 20, 100, $black, $fontPath, "Class: $class"); imagettftext($idCard, 20, 0, 20, 150, $black, $fontPath, "ID: $uniqueId"); // Add the student photo $photo = imagecreatefromjpeg($photo_path); if ($photo) { imagecopyresized($idCard, $photo, 400, 20, 0, 0, 160, 160, imagesx($photo), imagesy($photo)); } else { die('Photo file not found.'); } // Add the QR code $qrImage = imagecreatefrompng($qrCodePath); if ($qrImage) { imagecopyresized($idCard, $qrImage, 20, 200, 0, 0, 160, 160, imagesx($qrImage), imagesy($qrImage)); } else { die('QR code file not found.'); } // Ensure ID card directory exists $idCardDir = '../images/idcards'; if (!is_dir($idCardDir)) { mkdir($idCardDir, 0755, true); } // Save the ID card image $idCardPath = "$idCardDir/$uniqueId.png"; imagepng($idCard, $idCardPath); // Free up memory imagedestroy($idCard); imagedestroy($photo); imagedestroy($qrImage); return $idCardPath; } ?> My database DROP TABLE IF EXISTS `attendance`; CREATE TABLE IF NOT EXISTS `attendance` ( `id` int NOT NULL AUTO_INCREMENT, `student_id` int NOT NULL, `date` date NOT NULL, `status` enum('present','absent') NOT NULL, PRIMARY KEY (`id`), KEY `student_id` (`student_id`) ) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; DROP TABLE IF EXISTS `notifications`; CREATE TABLE IF NOT EXISTS `notifications` ( `id` int NOT NULL AUTO_INCREMENT, `message` text NOT NULL, `date` timestamp NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; -- -------------------------------------------------------- -- -- Table structure for table `students` -- DROP TABLE IF EXISTS `students`; CREATE TABLE IF NOT EXISTS `students` ( `id` int NOT NULL AUTO_INCREMENT, `name` varchar(100) NOT NULL, `class` varchar(50) NOT NULL, `photo` varchar(255) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; DROP TABLE IF EXISTS `users`; CREATE TABLE IF NOT EXISTS `users` ( `id` int NOT NULL AUTO_INCREMENT, `username` varchar(50) NOT NULL, `password` varchar(255) NOT NULL, `role` enum('admin','teacher') NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `username` (`username`) ) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
  12. Olumide

    CBT Exam

    I appreciate you, but that does not give me the options. Though, I pending the project for now as it is taking more time and still no solution. I will still get back on it.
  13. Olumide

    CBT Exam

    I keep getting this error Warning: DOMDocument::loadXML(): Namespace prefix m on oMath is not defined in Entity, line: 1 in C:\wamp64\www\cbt\cbt_exam\vendor\phpoffice\math\src\Math\Reader\OfficeMathML.php on line 39 Call Stack #TimeMemoryFunctionLocation 10.0005449024{main}( )...\upload.php:0 20.0080581080convertDocxToHtml( $filename = 'uploads/Question_me2.docx' )...\upload.php:30 30.0087581080PhpOffice\PhpWord\IOFactory::load( $filename = 'uploads/Question_me2.docx', $readerName = ??? )...\upload.php:120 40.0100581872PhpOffice\PhpWord\Reader\Word2007->load( $docFile = 'uploads/Question_me2.docx' )...\IOFactory.php:89 50.0479598432PhpOffice\PhpWord\Reader\Word2007->readPart( $phpWord = class PhpOffice\PhpWord\PhpWord { private $sections = [0 => class PhpOffice\PhpWord\Element\Section { ... }]; private $collections = ['Bookmarks' => class PhpOffice\PhpWord\Collection\Bookmarks { ... }, 'Titles' => class PhpOffice\PhpWord\Collection\Titles { ... }, 'Footnotes' => class PhpOffice\PhpWord\Collection\Footnotes { ... }, 'Endnotes' => class PhpOffice\PhpWord\Collection\Endnotes { ... }, 'Charts' => class PhpOffice\PhpWord\Collection\Charts { ... }, 'Comments' => class PhpOffice\PhpWord\Collection\Comments { ... }]; private $metadata = ['DocInfo' => class PhpOffice\PhpWord\Metadata\DocInfo { ... }, 'Settings' => class PhpOffice\PhpWord\Metadata\Settings { ... }, 'Compatibility' => class PhpOffice\PhpWord\Metadata\Compatibility { ... }] }, $relationships = ['main' => ['rId1' => [...], 'rId2' => [...], 'rId3' => [...]], 'document' => ['rId1' => [...], 'rId2' => [...], 'rId3' => [...], 'rId4' => [...], 'rId5' => [...], 'rId6' => [...]]], $commentRefs = [], $partName = 'Document', $docFile = 'uploads/Question_me2.docx', $xmlFile = 'word/document.xml' )...\Word2007.php:89 and here is the OfficeMathML.php <?php namespace PhpOffice\Math\Reader; use DOMDocument; use DOMNode; use DOMXPath; use PhpOffice\Math\Element; use PhpOffice\Math\Exception\InvalidInputException; use PhpOffice\Math\Exception\NotImplementedException; use PhpOffice\Math\Math; class OfficeMathML implements ReaderInterface { /** @var DOMDocument */ protected $dom; /** @var Math */ protected $math; /** @var DOMXpath */ protected $xpath; /** @var string[] */ protected $operators = ['+', '-', '/', '∗']; public function read(string $content): ?Math { $nsMath = 'xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math"'; $nsWord = 'xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"'; $content = str_replace( $nsMath, $nsMath . ' ' . $nsWord, $content ); $this->dom = new DOMDocument(); $this->dom->loadXML($content); $this->math = new Math(); $this->parseNode(null, $this->math); return $this->math; } /** * @see https://devblogs.microsoft.com/math-in-office/officemath/ * @see https://learn.microsoft.com/fr-fr/archive/blogs/murrays/mathml-and-ecma-math-omml * * @param Math|Element\AbstractGroupElement $parent */ protected function parseNode(?DOMNode $nodeRowElement, $parent): void { $this->xpath = new DOMXpath($this->dom); foreach ($this->xpath->query('*', $nodeRowElement) ?: [] as $nodeElement) { $element = $this->getElement($nodeElement); $parent->add($element); if ($element instanceof Element\AbstractGroupElement) { $this->parseNode($nodeElement, $element); } } } protected function getElement(DOMNode $nodeElement): Element\AbstractElement { switch ($nodeElement->nodeName) { case 'm:f': // Numerator $nodeNumerator = $this->xpath->query('m:num/m:r/m:t', $nodeElement); if ($nodeNumerator && $nodeNumerator->length == 1) { $value = $nodeNumerator->item(0)->nodeValue; if (is_numeric($value)) { $numerator = new Element\Numeric(floatval($value)); } else { $numerator = new Element\Identifier($value); } } else { throw new InvalidInputException(sprintf( '%s : The tag `%s` has no numerator defined', __METHOD__, $nodeElement->nodeName )); } // Denominator $nodeDenominator = $this->xpath->query('m:den/m:r/m:t', $nodeElement); if ($nodeDenominator && $nodeDenominator->length == 1) { $value = $nodeDenominator->item(0)->nodeValue; if (is_numeric($value)) { $denominator = new Element\Numeric(floatval($value)); } else { $denominator = new Element\Identifier($value); } } else { throw new InvalidInputException(sprintf( '%s : The tag `%s` has no denominator defined', __METHOD__, $nodeElement->nodeName )); } return new Element\Fraction($numerator, $denominator); case 'm:r': $nodeText = $this->xpath->query('m:t', $nodeElement); if ($nodeText && $nodeText->length == 1) { $value = trim($nodeText->item(0)->nodeValue); if (in_array($value, $this->operators)) { return new Element\Operator($value); } if (is_numeric($value)) { return new Element\Numeric(floatval($value)); } return new Element\Identifier($value); } throw new InvalidInputException(sprintf( '%s : The tag `%s` has no tag `m:t` defined', __METHOD__, $nodeElement->nodeName )); case 'm:oMath': return new Element\Row(); default: throw new NotImplementedException(sprintf( '%s : The tag `%s` is not implemented', __METHOD__, $nodeElement->nodeName )); } } } And here is my upload.php <?php session_start(); if ($_SESSION['role'] !== 'teacher') { header("Location: login.php"); exit(); } require 'db.php'; require 'vendor/autoload.php'; // Load the PHPWord library use PhpOffice\PhpWord\IOFactory; use PhpOffice\PhpWord\Settings; use PhpOffice\PhpWord\Shared\Html; $database = new Database(); $db = $database->getConnection(); if ($_SERVER['REQUEST_METHOD'] == 'POST') { $class_id = $_POST['class_id']; $subject_id = $_POST['subject_id']; $file = $_FILES['file']; if ($file['type'] == 'application/vnd.openxmlformats-officedocument.wordprocessingml.document') { $upload_dir = 'uploads/'; $file_path = $upload_dir . basename($file['name']); if (move_uploaded_file($file['tmp_name'], $file_path)) { try { // Convert .docx file to HTML $htmlFilePath = convertDocxToHtml($file_path); if ($htmlFilePath) { echo "File converted to HTML successfully.<br>"; } else { echo "Failed to convert file to HTML.<br>"; exit(); } // Parse the HTML file $htmlContent = file_get_contents($htmlFilePath); $questions = parseHtmlToQuestions($htmlContent); foreach ($questions as $question) { $stmt = $db->prepare("INSERT INTO questions (question_text, question_type, option_a, option_b, option_c, option_d, correct_option, subject_id) VALUES (?, 'Multiple Choice', ?, ?, ?, ?, ?, ?)"); if ($stmt->execute([ $question['question_text'], $question['options']['a'] ?? '', $question['options']['b'] ?? '', $question['options']['c'] ?? '', $question['options']['d'] ?? '', $question['correct_option'], $subject_id ])) { echo "Question inserted successfully: " . htmlspecialchars($question['question_text']) . "<br>"; } else { echo "Failed to insert question: " . htmlspecialchars($question['question_text']) . "<br>"; print_r($stmt->errorInfo()); } } echo "File uploaded and questions added successfully."; } catch (Exception $e) { echo "Error processing file: " . htmlspecialchars($e->getMessage()); } } else { echo "Failed to upload file."; } } else { echo "Invalid file type. Please upload a .docx file."; } } else { $classes = $db->query("SELECT * FROM classes")->fetchAll(PDO::FETCH_ASSOC); ?> <!DOCTYPE html> <html> <head> <title>Upload Questions</title> </head> <body> <h1>Upload Questions</h1> <form action="upload.php" method="post" enctype="multipart/form-data"> <label for="class">Class:</label> <select name="class_id" id="class" onchange="fetchSubjects(this.value)"> <option value="">Select Class</option> <?php foreach ($classes as $class): ?> <option value="<?= htmlspecialchars($class['class_id']) ?>"><?= htmlspecialchars($class['class_name']) ?></option> <?php endforeach; ?> </select> <label for="subject">Subject:</label> <select name="subject_id" id="subject"> <option value="">Select Subject</option> <!-- Subjects will be populated based on selected class --> </select> <label for="file">Choose a file:</label> <input type="file" name="file" id="file" accept=".docx"> <button type="submit">Upload</button> </form> <script> function fetchSubjects(classId) { fetch(`fetch_subjects.php?class_id=${classId}`) .then(response => response.json()) .then(data => { const subjectSelect = document.getElementById('subject'); subjectSelect.innerHTML = '<option value="">Select Subject</option>'; data.forEach(subject => { const option = document.createElement('option'); option.value = subject.subject_id; option.textContent = subject.subject_name; subjectSelect.appendChild(option); }); }); } </script> </body> </html> <?php } function convertDocxToHtml($filename) { $phpWord = IOFactory::load($filename); $htmlWriter = IOFactory::createWriter($phpWord, 'HTML'); $htmlFilePath = str_replace('.docx', '.html', $filename); $htmlWriter->save($htmlFilePath); return $htmlFilePath; } function parseHtmlToQuestions($htmlContent) { $questions = []; $currentQuestion = null; $dom = new DOMDocument; @$dom->loadHTML($htmlContent); $paragraphs = $dom->getElementsByTagName('p'); $currentPassage = ''; foreach ($paragraphs as $paragraph) { $text = trim($paragraph->textContent); $nodeContent = ''; foreach ($paragraph->childNodes as $node) { if ($node->nodeName === 'b' || $node->nodeName === 'strong') { $nodeContent .= '<b>' . $node->textContent . '</b>'; } elseif ($node->nodeName === 'i' || $node->nodeName === 'em') { $nodeContent .= '<i>' . $node->textContent . '</i>'; } elseif ($node->nodeName === 'img') { $src = $node->getAttribute('src'); $nodeContent .= '<img src="' . $src . '">'; } else { $nodeContent .= $node->textContent; } } // Handle equations (assuming they are marked with a specific tag or format) if (strpos($text, 'Equation:') === 0) { $equation = substr($text, 9); $currentQuestion['equation'] = $equation; // Store equations separately } if (strpos($text, 'Passage:') === 0) { if ($currentPassage) { $questions[] = ['passage' => $currentPassage, 'questions' => []]; } $currentPassage = substr($text, 8); } elseif (strpos($text, 'Question:') === 0) { if ($currentQuestion) { $questions[] = $currentQuestion; } $currentQuestion = [ 'question_text' => $nodeContent, 'options' => [], 'correct_option' => '', 'equation' => '', 'images' => [] ]; } elseif (preg_match('/^[A-D]\)/', $text)) { if ($currentQuestion) { $optionKey = strtolower($text[0]); $currentQuestion['options'][$optionKey] = substr($text, 3); } } elseif (strpos($text, 'Answer:') === 0) { if ($currentQuestion) { $currentQuestion['correct_option'] = trim(substr($text, 7)); } } } if ($currentQuestion) { $questions[] = $currentQuestion; } return $questions; } ?>
  14. Olumide

    CBT Exam

    You are very intelligent sir. I saved the document as an html file and it created a folder as you have said. But my problem is, how do extract them? Here is my upload.php which extract text directly from Microsoft word but not extracting images or equation. <?php session_start(); if ($_SESSION['role'] !== 'teacher') { header("Location: login.php"); exit(); } require 'db.php'; require 'vendor/autoload.php'; // Load the PHPWord library use PhpOffice\PhpWord\IOFactory; $database = new Database(); $db = $database->getConnection(); if ($_SERVER['REQUEST_METHOD'] == 'POST') { $class_id = $_POST['class_id']; $subject_id = $_POST['subject_id']; $file = $_FILES['file']; if ($file['type'] == 'application/vnd.openxmlformats-officedocument.wordprocessingml.document') { $upload_dir = 'uploads/'; $file_path = $upload_dir . basename($file['name']); if (move_uploaded_file($file['tmp_name'], $file_path)) { $phpWord = IOFactory::load($file_path, 'Word2007'); if ($phpWord) { echo "File loaded successfully.<br>"; } else { echo "Failed to load file.<br>"; exit(); } $questions = []; $currentQuestion = null; foreach ($phpWord->getSections() as $section) { foreach ($section->getElements() as $element) { if (method_exists($element, 'getText')) { $text = trim($element->getText()); // Convert bold text $text = preg_replace('/\*\*(.*?)\*\*/', '<strong>$1</strong>', $text); // Convert italicized text $text = preg_replace('/__(.*?)__/', '<em>$1</em>', $text); // Convert quoted text to blockquote $text = preg_replace('/\"(.*?)\"/', '<blockquote>$1</blockquote>', $text); // Convert subscript text $text = preg_replace('/~(.*?)~/', '<sub>$1</sub>', $text); // Convert superscript text $text = preg_replace('/\^(.*?)\^/', '<sup>$1</sup>', $text); if (strpos($text, 'Question:') === 0) { if ($currentQuestion) { $questions[] = $currentQuestion; } $currentQuestion = [ 'question_text' => substr($text, 10), 'options' => [], 'correct_option' => '' ]; } elseif (strpos($text, 'A)') === 0 || strpos($text, 'B)') === 0 || strpos($text, 'C)') === 0 || strpos($text, 'D)') === 0) { if ($currentQuestion) { $optionKey = strtolower($text[0]); $currentQuestion['options'][$optionKey] = substr($text, 3); } } elseif (strpos($text, 'Answer:') === 0) { if ($currentQuestion) { $currentQuestion['correct_option'] = trim(substr($text, 7)); } } } elseif (method_exists($element, 'getDrawing')) { // Handle image extraction $drawing = $element->getDrawing(); $imagePath = $drawing->getPath(); $imageName = basename($imagePath); $newImagePath = $upload_dir . $imageName; copy($imagePath, $newImagePath); // Here you can store $newImagePath in the database for the question } } } if ($currentQuestion) { $questions[] = $currentQuestion; } foreach ($questions as $question) { $stmt = $db->prepare("INSERT INTO questions (question_text, question_type, option_a, option_b, option_c, option_d, correct_option, subject_id) VALUES (?, 'Multiple Choice', ?, ?, ?, ?, ?, ?)"); if ($stmt->execute([ $question['question_text'], $question['options']['a'] ?? '', $question['options']['b'] ?? '', $question['options']['c'] ?? '', $question['options']['d'] ?? '', $question['correct_option'], $subject_id ])) { echo "Question inserted successfully: " . $question['question_text'] . "<br>"; } else { echo "Failed to insert question: " . $question['question_text'] . "<br>"; print_r($stmt->errorInfo()); } } echo "File uploaded and questions added successfully."; } else { echo "Failed to upload file."; } } else { echo "Invalid file type. Please upload a .docx file."; } } else { $classes = $db->query("SELECT * FROM classes")->fetchAll(PDO::FETCH_ASSOC); ?> <!DOCTYPE html> <html> <head> <title>Upload Questions</title> </head> <body> <h1>Upload Questions</h1> <form action="upload.php" method="post" enctype="multipart/form-data"> <label for="class">Class:</label> <select name="class_id" id="class" onchange="fetchSubjects(this.value)"> <option value="">Select Class</option> <?php foreach ($classes as $class): ?> <option value="<?= $class['class_id'] ?>"><?= $class['class_name'] ?></option> <?php endforeach; ?> </select> <label for="subject">Subject:</label> <select name="subject_id" id="subject"> <option value="">Select Subject</option> <!-- Subjects will be populated based on selected class --> </select> <label for="file">Choose a file:</label> <input type="file" name="file" id="file" accept=".docx"> <button type="submit">Upload</button> </form> <script> function fetchSubjects(classId) { fetch(`fetch_subjects.php?class_id=${classId}`) .then(response => response.json()) .then(data => { const subjectSelect = document.getElementById('subject'); subjectSelect.innerHTML = '<option value="">Select Subject</option>'; data.forEach(subject => { const option = document.createElement('option'); option.value = subject.subject_id; option.textContent = subject.subject_name; subjectSelect.appendChild(option); }); }); } </script> </body> </html> <?php } ?>
  15. Olumide

    CBT Exam

    Thank you sir. Can you please explain this further. In my previous and abandoned work, I do upload images inside the Microsoft word but and also wrote a script to identify that, but it doesn't work. It only captured the text documents.
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.