发布不通过JS(Jquery)工作,但与表单

时间:2010-12-20 10:26:50

标签: php javascript jquery mysql forms

我有一个相当混乱的问题。

我有一个php文件(http://example.com/delete.php)

<?php
session_start(); 
$user_id = $_SESSION['user_id'];
$logged_in_user = $_SESSION['username'];
require_once('../classes/config.php');
require_once('../classes/post.php');
$post = new Post(NULL,$_POST['short']);
#print_r($post);
try {
 if ($post->user_id == $user_id) {
  $pdo = new PDOConfig();     

   $sql = "DELETE FROM posts WHERE id=:id";

   $q = $pdo->prepare($sql);
   $q->execute(array(':id'=>$post->id));       

  $pdo = NULL;
 }
 else {throw new Exception('false');}
}       
catch (Exception $e) {
   echo 'false';
}
?>

我试图让这个jquery向它发布数据,从而删除数据。

$('.post_delete').bind('click', function(event) {

    var num = $(this).data('short');

    var conf = confirm("Delete This post? (" + num + ")");

    if (conf == true) {
        var invalid = false;
        $.post("http://example.com/delete.php", {short: num},
        function(data){

            if (data == 'false') {
                alert('Deleting Failed!');
                invalid = true;
            }
        });

        if (invalid == false) { 
          alert("post Has Been Deleted!");
        } 
        else {
            event.preventDefault();
            return false;
        }


    } 
    else {
        event.preventDefault();
        return false;
    }



});

当我这样做时,它会返回“Post has Beented!”但不删除帖子。

对此感到困惑,我制作了一个表格来测试php。

<form action="http://example.com/delete.php" method="POST">
<input type="hidden" value="8" name="short"/>
<input type="submit" name="submit" value="submit"/>
</form>

效果很好。很奇怪。

我删除评论的代码几乎相同,而且在javascript中效果很好。

有什么想法吗?打败我。

提前致谢, 将

编辑: 这有效......但最后不遵循href,这是理想的效果。奇

$('.post_delete').bind('click', function(event) {

    var num = $(this).data('short');

    var conf = confirm("Delete This Post? (http://lala.in/" + num + ")");

    if (conf == true) {
        var invalid = false;
        $.post("http://example.com/delete/post.php", {short: num},
        function(data){

            if (data == 'false') {
                alert('Deleting Failed!');
                invalid = true;
            }
        });

        if (invalid == false) { 
          alert("Post Has Been Deleted!");
        ******************************************
            event.preventDefault();
            return false;
        ******************************************
        } 
        else {
            event.preventDefault();
            return false;
        }


    } 
    else {
        event.preventDefault();
        return false;
    }



   });

2 个答案:

答案 0 :(得分:1)

如果你的PHP脚本删除帖子,它不会返回任何内容。


我的不好,它没有回答真正的问题,但仍然是一个错误;)

实际上,似乎PHP会话和AJAX有时并不能很好地协同工作。

这意味着if ($post->user_id == $user_id)永远不会验证,因此非删除问题。

有两种看法:

  1. 记录$user_id,看看它是否不是null
  2. 尝试使用您的ajax帖子发送$_SESSION['user_id']并进行检查。但出于安全原因,不在生产中。

  3. <强> 1 -

    你的PHP应该在每个的情况下返回一些内容(至少,当你在寻找像你的实际案例一样的bug时)。

    <?php
    [...]
    try {
     if ($post->user_id == $user_id) {
      [...]
      echo 'true';
     }
     else {throw new Exception('false');}
    }       
    catch (Exception $e) {
       echo 'false';
    }
    ?>
    

    <强> 2 -

    jQuery很适合用于AJAX,原因很多。例如,它处理许多浏览器并为您进行检查,而且,您可以在同一.ajax() / .post() / .get()函数中处理成功和错误\ o /

    $('.post_delete').bind('click', function(event) {
        var num = $(this).data('short'); // If that's where your data is... Fair enough.
        if (confirm("Delete This Post? (http://lala.in/" + num + ")")) {
            $.post("delete/post.php", {short: num}, // Relative is nice :D
            function(data){
                if (data == 'false') {
                    alert('Deleting Failed!');
                 }else{
                    alert("Post Has Been Deleted!");
                    // Your redirection here ?
                }
            });
         }
    });
    

    第3 -

    如果您需要将表单中的数据发送到脚本然后进行重定向,我不会推荐通常用于不离开页面的AJAX ! 因此,您应该在注释中执行操作,将PHP表单显示为删除某些内容然后执行重定向。

答案 1 :(得分:0)

在您的代码中,我没有看到num在任何地方定义...并且您认为invalid未设置,因此您没有传递8值回来,你得到错误的信息,要么你需要这个:

$.post("http://example.com/delete.php", {short: $("input[name=short]").val()},

或者更简单,只需<form> $.post("http://example.com/delete.php", $("form").serialize(), ,它也适用于任何未来的输入类型元素:

<form>

我不确定您的代码在哪里被调用,例如,如果它是.submit() $("form").submit(function() { $.post("http://example.com/delete.php", $(this).serialize(), function(data){ if (data == 'false') { alert('Deleting Failed!'); } else { alert("Post Has Been Deleted!"); } }); 处理程序,它看起来像这样:

invalid

请注意,您需要检查内部回调,因为true将不会设置为{{1}},直到服务器以您当前拥有的方式返回数据,因为它是异步调用。