только опция удаления не работает PHP CRUD - PullRequest
0 голосов
/ 14 октября 2019

Я работал над базовым PHP CRUD. Я использую PHP, AJAX, MySQL на основе CRUD.

У меня есть такие функции, как Add / Update / Delete / GetResults / Search. Все работает нормально, кроме опции Delete. Я пробовал много способов решить эту проблему, но не могу найти точную ошибку или ошибку в коде. Вот код, который я использую для операций CRUD.

exam_packages.php

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Add / Update / Delete Exam Packages</title>
<link rel="stylesheet" href="css/bootstrap.min.css" type="text/css" media="all">
<link href="css/jquery.bootgrid.css" rel="stylesheet" />
<script src="js/jquery-1.11.1.min.js"></script>
<script src="js/bootstrap.min.js"></script>
<script src="js/jquery.bootgrid.min.js"></script>
</head>
<body>
    <div class="container">
      <div class="">
        <h1 style="text-align: center;">Add / Update / Delete Exam Packages</h1>
        <div class="col-sm-12">
        <div class="well clearfix">
            <div class="pull-right"><button type="button" class="btn btn-xs btn-primary" id="command-add" data-row-id="0">
            <span class="glyphicon glyphicon-plus"></span> Add New Exam Package</button></div></div>
        <table id="exam_package_grid" class="table table-condensed table-hover table-striped" width="60%" cellspacing="0" data-toggle="bootgrid">
            <thead>
                <tr>
                    <th data-column-id="pkg_id" data-type="numeric" data-identifier="true">Package ID</th>
                    <th data-column-id="test_quantity">Test Quantity</th>
                    <th data-column-id="price">Price</th>
                    <th data-column-id="commands" data-formatter="commands" data-sortable="false">Commands</th>
                </tr>
            </thead>
        </table>
    </div>
      </div>
    </div>

<div id="add_model" class="modal fade">
    <div class="modal-dialog">
        <div class="modal-content">
            <div class="modal-header">
                <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
                <h4 class="modal-title">Add New Exam Package</h4>
            </div>
            <div class="modal-body">
                <form method="post" id="frm_add">
                          <input type="hidden" value="add" name="action" id="action">
                  <div class="form-group">
                    <label for="test_quantity" class="control-label">Test Quantity:</label>
                    <input type="text" class="form-control" id="test_quantity" name="test_quantity"/>
                  </div>
                  <div class="form-group">
                    <label for="price" class="control-label">Price:</label>
                    <input type="text" class="form-control" id="price" name="price"/>
                  </div>
            </div>
            <div class="modal-footer">
                <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
                <button type="button" id="btn_add" class="btn btn-primary">Save</button>
            </div>
            </form>
        </div>
    </div>
</div>
<div id="edit_model" class="modal fade">
    <div class="modal-dialog">
        <div class="modal-content">
            <div class="modal-header">
                <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
                <h4 class="modal-title">Edit Exam Package</h4>
            </div>
            <div class="modal-body">
                <form method="post" id="frm_edit">
                          <input type="hidden" value="edit" name="action" id="action">
                          <input type="hidden" value="0" name="edit_pkg_id" id="edit_pkg_id">
                  <div class="form-group">
                    <label for="test_quantity" class="control-label">Test Quantity:</label>
                    <input type="text" class="form-control" id="edit_test_quantity" name="edit_test_quantity"/>
                  </div>
                  <div class="form-group">
                    <label for="price" class="control-label">Price:</label>
                    <input type="text" class="form-control" id="edit_price" name="edit_price"/>
                  </div>
            </div>
            <div class="modal-footer">
                <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
                <button type="button" id="btn_edit" class="btn btn-primary">Save</button>
            </div>
            </form>
        </div>
    </div>
</div>
</body>
</html>
<script type="text/javascript">
$( document ).ready(function() {
    var grid = $("#exam_package_grid").bootgrid({
        ajax: true,
        rowSelect: true,
        post: function ()
        {
            /* To accumulate custom parameter with the request object */
            return {
                id: "b0df282a-0d67-40e5-8558-c9e93b7befed"
            };
        },

        url: "exam_package_response.php",
        formatters: {
                "commands": function(column, row)
                {
                    return "<button type=\"button\" class=\"btn btn-xs btn-default command-edit\" data-row-id=\"" + row.pkg_id + "\"><span class=\"glyphicon glyphicon-edit\"></span></button> " + 
                        "<button type=\"button\" class=\"btn btn-xs btn-default command-delete\" data-row-id=\"" + row.pkg_id + "\"><span class=\"glyphicon glyphicon-trash\"></span></button>";
                }
            }
   }).on("loaded.rs.jquery.bootgrid", function()
{
    /* Executes after data is loaded and rendered */
    grid.find(".command-edit").on("click", function(e)
    {
        //alert("You pressed edit on row: " + $(this).data("row-id"));
            var ele =$(this).parent();
            var g_pkg_id = $(this).parent().siblings(':first').html();

        //console.log(grid.data());//
        $('#edit_model').modal('show');
                    if($(this).data("row-id") >0) {

                                // collect the data
                                $('#edit_pkg_id').val(ele.siblings(':first').html()); // in case we're changing the key
                                $('#edit_test_quantity').val(ele.siblings(':nth-of-type(2)').html());
                                $('#edit_price').val(ele.siblings(':nth-of-type(3)').html());
                    } else {
                     alert('No row selected! First select row, then click edit button');
                    }
    }).end().find(".command-delete").on("click", function(e)
    {

        var conf = confirm('Delete No.' + $(this).data("row-id") + ' package?');
        alert(conf);
    if(conf==true){
      // console.log($(this).data("row-id"));
      $.post('exam_package_response.php', { id: $(this).data("row-id"), action:'delete'}, function()
      {
        $("#exam_package_grid").bootgrid('reload');
      }); 
            $(this).parent('tr').remove();
            $("#exam_package_grid").bootgrid('remove', $(this).data("row-id"))
                    }
    });
});

function ajaxAction(action) {
                data = $("#frm_"+action).serializeArray();
                $.ajax({
                  type: "POST",  
                  url: "exam_package_response.php",  
                  data: data,
                  dataType: "json",       
                  success: function(response)  
                  {
                    $('#'+action+'_model').modal('hide');
                    $("#exam_package_grid").bootgrid('reload');
                  }   
                });
            }

            $( "#command-add" ).click(function() {
              $('#add_model').modal('show');
            });
            $( "#btn_add" ).click(function() {
              ajaxAction('add');
            });
            $( "#btn_edit" ).click(function() {
              ajaxAction('edit');
            });
});
</script>

exam_package_resposnse.php

<?php
    //include connection file 
    include_once("db_connection_mysqli.php");

    $db = new dbObj();
    $connString =  $db->getConnstring();

    $params = $_REQUEST;

    // console.log($params);
    // echo '<script>alert("aaaaaaaaaa");</script>';
    $action = isset($params['action']) != '' ? $params['action'] : '';
    $empCls = new ExamPackage($connString);

    switch($action) {
     case 'add':
        $empCls->insertExamPackage($params);
     break;
     case 'edit':
        $empCls->updateExamPackage($params);
     break;
     case 'delete':
        $empCls->deleteExamPackage($params);
     break;
     default:
     $empCls->getExamPackages($params);
     return;
    }

    class ExamPackage {
    protected $conn;
    protected $data = array();
    function __construct($connString) {
        $this->conn = $connString;
    }

    public function getExamPackages($params) {

        $this->data = $this->getRecords($params);

        echo json_encode($this->data);
    }

    function insertExamPackage($params) {
        $data = array();;
        $sql = "INSERT INTO `tblExamPackages` (test_quantity, price) VALUES('" . $params["test_quantity"] . "', '" . $params["price"] . "');  ";

        echo $result = mysqli_query($this->conn, $sql) or die("error to insert package data");

    }

    function getRecords($params) {
        $rp = isset($params['rowCount']) ? $params['rowCount'] : 10;

        if (isset($params['current'])) { $page  = $params['current']; } else { $page=1; };  
        $start_from = ($page-1) * $rp;

        $sql = $sqlRec = $sqlTot = $where = '';

        if( !empty($params['searchPhrase']) ) {   
            $where .=" WHERE ";
            $where .=" (test_quantity LIKE '%".$params['searchPhrase']."%' ";
            $where .=" OR price = '".$params['searchPhrase']."' )";
       }
       if( !empty($params['sort']) ) {  
            $where .=" ORDER By ".key($params['sort']) .' '.current($params['sort'])." ";
        }
       // getting total number records without any search
        $sql = "SELECT * FROM `tblExamPackages` ";
        $sqlTot .= $sql;
        $sqlRec .= $sql;

        //concatenate search sql if value exist
        if(isset($where) && $where != '') {
            $sqlTot .= $where;
            $sqlRec .= $where;
        }
        if ($rp!=-1)
        $sqlRec .= " LIMIT ". $start_from .",".$rp;


        $qtot = mysqli_query($this->conn, $sqlTot) or die("error to fetch tot package  data");
        $queryRecords = mysqli_query($this->conn, $sqlRec) or die("error to fetch package data");

        while( $row = mysqli_fetch_assoc($queryRecords) ) { 
            $data[] = $row;
        }

        $json_data = array(
            "current"            => intval($params['current']), 
            "rowCount"            => 10,            
            "total"    => intval($qtot->num_rows),
            "rows"            => $data   // total data array
            );

        return $json_data;
    }

    function updateExamPackage($params) {
        $data = array();
        //print_R($_POST);die;
        $sql = "Update `tblExamPackages` set test_quantity = '" . $params["edit_test_quantity"] . "', price='" . $params["edit_price"]."' WHERE pkg_id='".$_POST["edit_pkg_id"]."'";

        echo $result = mysqli_query($this->conn, $sql) or die("error to update package data");
    }

    function deleteExamPackage($params) {
        $data = array();
        echo "<script>
        var conf = confirm('Delete No.' + $(this).data('row-id') + ' package?');
        alert(conf);</script>";

        $sql = "delete from `tblExamPackages` WHERE pkg_id'" . $_REQUEST["edit_pkg_id"] . "'";

        echo $result = mysqli_query($this->conn, $sql) or die("error to delete package data");
    }
}
?>

Пожалуйста, дайте мне знать, если я что-то пропустилВот. Все работает нормально, кроме Удалить

Ответы [ 3 ]

1 голос
/ 15 октября 2019

Краткий ответ:

Ваш запрос на удаление содержит синтаксическую ошибку. На это намекали в комментариях ...

Вы также смешиваете сторону сервера и сторону клиента, пытаясь использовать JavaScript в классе php. Это серьезная ошибка, требующая возвращения к рассмотрению основ.

Длинный ответ:

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

Но есть некоторые вещи, которые можно сделать лучше. Вот несколько идей:

  1. Используйте PDO вместо mysqli, а используйте подготовленные операторы . Очень вероятно, что это устранит синтаксическую ошибку в запросе.
  2. Всегда возвращать JSON-закодированные данные из запросов Ajax. Лично я всегда заставляю php-скрипт отвечать чем-то вроде return json_encode( ['message'=>$message, 'data'=>$data] );. Затем ваш JavaScript обратно в браузере может решить, что сообщить пользователю.
  3. Методы должны делать одно. Если метод становится больше, чем умещается на экране, вам, вероятно, необходимо провести рефакторинг. Например, getRecords() проверяет номер страницы, создает запрос, получает общее количество и получает все записи. Вероятно, это следует разбить на отдельные методы или, что еще лучше, создать объект разбиения на страницы, который можно внедрить в метод создания запроса.

Кстати, чтобы проиллюстрировать, насколько важны подготовленные утверждения: что, если кто-то пошел на hxxp://yourdomain/exam_package_response.php?action=delete&edit_pkg_id=1+or+1%3D1?

Ответ: Вы просто потеряли все данные вэта таблица . Подготовленные заявления предотвратят это.

0 голосов
/ 16 октября 2019

Мне удалось решить проблему с помощью советов некоторых других членов.

Так что в принципе я не мог удалить строку из своей таблицы CRUD. И на самом деле, я не смог правильно обнаружить ошибку. В соответствии с ответами и комментариями выше, я отследил ошибку и решил ее.

Вот изменения, которые я сделал, чтобы она заработала.

У удаления запроса произошла ошибка синтаксиса.

Мой запрос на удаление имел незначительную ошибку. Я пропустил = вход в where предложение. Хотя это не было первоначальной проблемой, эту проблему нужно было решить.

Не было получено pkg_id, отправленного с AJAX на PHP.

Итак, основная проблема заключалась в том, что мой запрос выполнялся, но я не получил значение pkg_id в переданной переменной. На самом деле я не отлаживал это должным образом, иначе мне даже не пришлось публиковать это здесь. Благодаря вышеупомянутому мистеру Мортону я отладил проблему. Странно, тем же способом я получал значение в функции UPDATE, но не в DELETE. Я попробовал некоторые методы, чтобы решить это, но не смог справиться.

Поэтому я использовал файлы cookie для решения проблемы. Обходной путь составляет Creating Cookie using AJAX and retrieving its value in PHP. Вот код, который я использовал для этого. Я упоминаю только часть кода, который я переписал.

exam_packages.php

Написал функцию для создания cookie сразу после $(document).ready(function()

function createCookie(name, value, days) 
    {
        var expires;
        if (days) 
          {
            var date = new Date();
            date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
            expires = "; expires=" + date.toGMTString();
          }
          else 
          {
            expires = "";
          }
        document.cookie = escape(name) + "=" + escape(value) + expires + "; path=/";
    }

и использование его как

createCookie("pkg_id", $(this).data("row-id"), "1");

после var conf = confirm('Delete No.' + $(this).data("row-id") + ' package?');

Это создает Cookie с именем pkg_id.

exam_package_resposnse.php

Доступ к значению cookie в этом файле

$pkg_id = $_COOKIE["pkg_id"];

и использование pkg_id в качестве параметра для моего предложения where.

Я знаю, что это может быть неправильный способ решить эту проблему, но это определенно один из способов. Я проверил это, и это работает. Если у кого-то есть лучший способ сделать это, пожалуйста, не стесняйтесь поделиться, так как это может быть полезно для кого-то еще и меня тоже. :)

С уважением

0 голосов
/ 15 октября 2019

В функции

deleteExamPackage ($ params)

в строке 7, перед оператором echo вы забыли добавить

=

изменить это

`$sql = "delete from `tblExamPackages` WHERE pkg_id'" . $_REQUEST["edit_pkg_id"] . "'";`

на

$sql = `"delete from `tblExamPackages` WHERE pkg_id = '" . $_REQUEST["edit_pkg_id"] . "'";`
...