skip to Main Content

I am currently making a project about grading system and I currently do not know how to deal with this as I am still learning. I’ve taken this part of code from the internet and it is not my own.

        $('#percentage-form').submit(function(e){
            e.preventDefault();
            $('.pop_msg').remove()
            var _this = $(this)
            var total = $('#total').text()
                total = total.replace(/%/gi,'')
                console.log(total)
            if(parseFloat(total) !== 100)
            {
                alert("Total Percentage must be 100%");
                return false;
            }
            var _el = $('<div>')
                _el.addClass('pop_msg')
            $('#uni_modal button').attr('disabled',true)
            $('#uni_modal button[type="submit"]').text('submitting form...')
            $.ajax({
                url:'./Actions.php?a=save_percentage',
                method:'POST',
                data:$(this).serialize(),
                dataType:'JSON',
                error:err=>{
                    console.log(err)
                    _el.addClass('alert alert-danger')
                    _el.text("An error occurred.")
                    _this.prepend(_el)
                    _el.show('slow')
                     $('#uni_modal button').attr('disabled',false)
                     $('#uni_modal button[type="submit"]').text('Save')
                },
                success:function(resp){
                    if(resp.status == 'success'){
                        _el.addClass('alert alert-success')
                        $('#uni_modal').on('hide.bs.modal',function(){
                            location.reload()
                        })
                    }else{
                        _el.addClass('alert alert-danger')
                    }
                    _el.text(resp.msg)

                    _el.hide()
                    _this.prepend(_el)
                    _el.show('slow')
                     $('#uni_modal button').attr('disabled',false)
                     $('#uni_modal button[type="submit"]').text('Save')
                }
            })
        })

I think the function save_percentage fits for sqlite3 and not with what I am using. I would like it so that this code would work with mine but I do not know how. I am using MySql and runs the server on XAMPP by the way.
This is the code for Actions.php

<?php 

Class Actions{
    function save_percentage(){
        extract($_POST);
        $data = "";
        foreach($component_id as $k => $v){
            if(!empty($data)) $data .= ", ";
            $data .= "('$id','{$v}','{$percentage[$k]}')";
        }
        if(!empty($data))
        $this->query("DELETE FROM `component_subject_percentage` where `subject_id` = '{$id}'");
        $sql = "INSERT INTO `component_subject_percentage` (`subject_id`,`component_id`,`percentage`)VALUES {$data}";
        $insert = $this->query($sql);
        if($insert){
            $resp['status'] ='success';
            $resp['msg'] = "Data successfully saved";
        }else{
            $resp['status'] ='failed';
            $resp['msg'] = "Data fails to save. Error: ". $this->lastErrorMsg();
            $resp['sql'] = $sql;
        }
        return json_encode($resp);
    }
}
$a = isset($_GET['a']) ?$_GET['a'] : '';
$action = new Actions();
switch($a){

    case 'save_percentage':
        echo $action->save_percentage();
    break;
    default:
    // default action here
    break;
}

My DBConnection.PHP:

<?php
$con=mysqli_connect("localhost", "root", "", "resultgrading");
if(mysqli_connect_errno()){
    echo "Connection Fail".mysqli_connect_error(); 
}

2

Answers


  1. Chosen as BEST ANSWER

    Okay, I was able to fix my code with this:

    <?php 
    
    Class Actions extends mysqli{
        public $sql;
        function __construct(){
            $this->sql = new mysqli("localhost", "root", "", "resultgrading");
        }
        function save_percentage(){
            extract($_POST);
            $data = "";
            foreach($component_id as $k => $v){
                if(!empty($data)) $data .= ", ";
                $data .= "('$id','{$v}','{$percentage[$k]}')";
            }
            if(!empty($data))
            $this->sql->query("DELETE FROM `component_subject_percentage` where `subject_id` = '{$id}'");
            $mb = "INSERT INTO `component_subject_percentage` (`subject_id`,`component_id`,`percentage`)VALUES {$data}";
            $insert = $this->sql->query($mb);
            if($insert){
                $resp['status'] ='success';
                $resp['msg'] = "Data successfully saved";
            }else{
                $resp['status'] ='failed';
                $resp['msg'] = "Data fails to save. Error: ". $this->sql->lastErrorMsg();
                $resp['sql'] = $sql;
            }
            return json_encode($resp);
        }
    }
    $a = isset($_GET['a']) ?$_GET['a'] : '';
    $action = new Actions();
    switch($a){
    
        case 'save_percentage':
            echo $action->save_percentage();
        break;
        default:
        // default action here
        break;
    }
    

  2. I do think it is a better idea to explain that to close this question.

    First of all, your code is highly risky as @Dharman pointed out. You HAVE TO use prepared statements. Even if it is a school project, good habits must be taken.

    Secondly, you use $_GET and $_POST in your code. You do a HTTP get or a HTTP post not both and your ajax is doing a post.

    And your loop is out of the scope of your query.

    Here is a small improvement to help you do it the right way, it might be wrong as we lack HTML :

    <?php 
    
    Class Actions{
        function save_percentage(){
            extract($_POST);
            foreach($component_id as $k => $v){
            $stmt = $this->prepare("DELETE FROM `component_subject_percentage` where `subject_id` = ?");
            $stmt->bind_param("s",$id);
            if (!$stmt->execute()) return false;
            $stmt = $this->prepare("INSERT INTO `component_subject_percentage` (`subject_id`,`component_id`,`percentage`) VALUES ?";
            $stmt->bind_param("sss",$id,$v,$percentage[$k]);
            if($stmt->execute()){
                $resp['status'] ='success';
                $resp['msg'] = "Data successfully saved";
            }else{
                $resp['status'] ='failed';
                $resp['msg'] = "Data fails to save. Error: ". $this->lastErrorMsg();
                $resp['sql'] = $sql;
            }
            }
            return json_encode($resp);
        }
    }
    $a = $_POST['a'] ?? '';
    $action = new Actions();
    switch($a){
    
        case 'save_percentage':
            echo $action->save_percentage();
        break;
        default:
        // default action here
        break;
    }
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search