Публикация не работает через JS (Jquery), но с формой - PullRequest
0 голосов
/ 20 декабря 2010

У меня довольно запутанная проблема.

У меня есть 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 для отправки данных на него и, таким образом, удалитьdata.

$('.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;
    }



});

, и когда я это делаю, он возвращает сообщение «Сообщение было удалено!», но не удаляет сообщение.

Смущенный этим, я создал форму для проверки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.

AnyИдеи? Бьет меня.

Заранее спасибо, Will

РЕДАКТИРОВАТЬ: это работает ... но не следует за 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 ]

1 голос
/ 20 декабря 2010

Если ваш PHP-скрипт удаляет сообщение, он ничего не возвращает.


Мой плохой, он не отвечает на настоящий вопрос, но все еще является ошибкой;)

На самом деле, кажется, что PHP-сессия и AJAX иногда не очень хорошо работают вместе.

Это означает, что if ($post->user_id == $user_id) никогда не будет проверять, следовательно, проблема без удаления.

2 способа увидеть это:

  1. Log $user_id и посмотретьесли это не null
  2. Попробуйте отправить $_SESSION['user_id'] со своим постом ajax и проверьте его.Но не в производстве, по соображениям безопасности.

1-

Ваш PHP должен что-то возвращать в в каждом случае (по крайней мере, когда вы ищете ошибку, подобную вашей реальной ситуации).

<?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() function \ 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-скрипта, который, очевидно, что-то удалит, а затем сделает перенаправление.

0 голосов
/ 20 декабря 2010

В вашем коде я не вижу num определенного где-либо ... и invalid не устанавливается, когда вы думаете, что это так, поэтому вы не передаете это значение 8 назад и получаетенеправильное сообщение, либо вам нужно это:

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

Или проще, просто .serialize() <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, пока сервер не вернется с данными, как у вас сейчас, потому что это асинхронный вызов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...