【问题标题】:Issue trying to preform a delete with php and angular尝试使用 php 和 angular 执行删除的问题
【发布时间】:2015-07-06 21:58:17
【问题描述】:

我正在尝试使用 angular 和 php 进行删除。我很确定我的 php 是正确的。

但我无法删除。在我的控制台日志中它说我的删除是成功的,但是在查看表格时我仍然看到记录。

在 chrome 中使用调试器进一步检查后,我发现我的参数索引未定义 -> http://gyazo.com/88b6dcf9d4c03a1fc9dd235303b20a8f

(部分)我的 HTML 代码:

<md-button  class="md-primary" ng-click="delete_task(task.id)">Delete</md-button>

(部分)我的 app.js 文件:

/** function to delete a task from list referencing php **/
        $scope.delete_task = function(index) {  
            debugger;
            $http.post('db.php?action=delete_task', 
                {
                    'task_index' : index
                }
            )      
            .success(function (data, status, headers, config) {   
                // here we also replace how to get the user
                getTaskFunction( 
                    /* success function */ 
                    function(data) { 
                        $scope.taskInfo = data; 
                       console.log("The taks have been reloaded" , $scope.taskInfo);
                    }, 
                    /* error function */ 
                    function() 
                    { 
                        alert("Server load failed"); 
                    } 
                );
                console.log('Deletion was succesfull');
            })
            .error(function(data, status, headers, config) {
               console.log("You were NOT succesfull in deleting a task"); 
            }
        );

(部分)我的 PHP 代码:

<?php
    include('config.php');

    switch($_GET['action'])  {
        case 'get_ProjectType_Info' :
            get_ProjectType_Info();
            break;
        case 'add_task' :
            add_task();
            break;
        case 'get_Location_Info' :
            get_Location_Info();
            break;
        case 'get_Task_Info' :
            get_Task_Info();
            break;
        case 'delete_task' :
            delete_task();
            break;
    }

    /**  Function to delete a task   **/
    function delete_task() {
        $data = json_decode(file_get_contents("php://input"));
        $index = $data->task_index;
        echo ($index);
        //print_r($data);
        $del = mysql_query("DELETE FROM tblTask WHERE id = ".$index);
        if($del)
        return true;
        return false;
    }

我不知道从现在开始如何继续。

【问题讨论】:

  • 如果索引丢失,那么您的参数“task.id”可能是错误的。打印出来看看它的价值是多少。您也可以通过调用 $scope.delete_task("a known id") 在范围内手动触发删除并查看它是否有效。如果是,那么函数和后端都可以,但你的参数是错误的
  • @RainerPlumer,我只是添加 $scope.delete_task(100);在我的删除功能之后?当我在删除功能中记录我的索引时,它会显示但不断重复 -> gyazo.com/ee08c8c0cbc00c711c40abbb92a3730c
  • 是的,那么...如果删除按预期工作,您就知道您的“task.id”是问题所在,其余的工作正常。
  • 现在等一下,当我像这样记录索引时 console.log(index);它表明它的未定义 -> gyazo.com/8923f8b1df132108a1b9f8ca6a843792
  • 一旦您对该测试值进行硬编码,它就不应该说“未定义”。确保您的浏览器缓存已禁用,并且 Angular 正在重新加载您的模板/代码。此外,您的代码中一个更严重的错误实际上是“$del = mysql_query("DELETE FROM tblTask​​ WHERE id = ".$index);"永远不要将这样的变量传递到您的查询中......即使是初学者黑客也可以相当容易地清除您的数据库。使用 mysql_real_escape_string 或类型转换为 (int)

标签: javascript php angularjs angular-material


【解决方案1】:

最好不要像你正在做的那样将查询字符串变量与 post 变量一起使用。在 javascript 语句上创建一个完整的对象,以便有这样的东西:

{
    'task_index' : index,
    action: 'delete_task'
 }

然后你应该在你的切换器中威胁这个对象数据。

如果您采用一些使代码更简洁、更易于理解的做法,那就太好了。

首先,您应该测试您的delete_task 方法。为了成功,我建议您将调用file_get_contents("php://input")) 的变量放入开关并将它们作为方法参数传递。这样做:

<?php
   // ...
   // Receive id you have already collected
   function delete_task($task_id){        
    $del = mysql_query("DELETE FROM tblTask WHERE id = ".$task_id);
    if($del) return true;
    return false;
   }

   // test that method
   function test_delete(){
     $ret = delete_task(4);   // test with valid and invalid ids 
   }
 ?>

显然,这不是测试方法的好方法,您应该考虑使用任何测试框架进行单元测试。但是以可以更改参数并观察其行为的方式构建方法很重要。一旦你确信这个方法(在这个场景中更批评的方法)是有效的,你可以在堆栈上下降一层并检查你的切换器是否运行良好。此时,您可以使用 Chrome 的 Postman 测试您的端点,例如。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-11
    • 2019-04-01
    • 2020-06-12
    • 2011-08-08
    • 2012-11-30
    • 2014-02-11
    • 1970-01-01
    • 2023-03-22
    相关资源
    最近更新 更多