2015-09-24 4 views
1

У меня возникла проблема, которую я пытался исследовать и исправлять в течение нескольких часов, и я нахожусь в своем уму, не понимая, почему она работает неправильно.Параметры jQuery .post не отправляются

У меня есть диалоговое окно jQuery (через jQuery UI), когда кто-то хочет удалить элемент (нажав на изображение значка удаления и вызвав функцию JS с предоставленным «id» целым числом). Всплывающее диалоговое окно работает правильно и содержит всю доступную информацию и параметры кнопок. Вот код, который:

function removeItem(id) { 
    var rid = id; 
    $("#dialog").dialog({ 
     title: "Removal Confirmation", 
     resizable: false, 
     height: 200, 
     modal: true, 
     show: { 
      effect: "blind", 
      duration: 800 
     }, 
     buttons: { 
      "Confirm": function() { 
       $.post("includes/inc_details.php", { 
        "type":"remove", 
        "id":rid 
       }); 
       window.location.reload(); 
       $(this).dialog("close"); 
      }, 
      Cancel: function() { 
       $(this).dialog("close"); 
      } 
     } 
    }); 
} 

Когда «Confirm» кнопку в диалоговом окне будет нажата, это предположим .post к PHP-файл для дальнейшей обработки (код для этой части ниже), и когда полная воля перезагрузите окно браузера и закройте диалоговое окно.

Однако, что обычно происходит, страница выглядит просто перезагруженной, а затем диалог закрывается, но элемент не удаляется. Я смотрю обработку с помощью инструментов chromeDev, и кажется, что при вызове php-файла .post оба параметра не отправляются вместе с ним. (Я использовал аналогичные .posts другие места - хотя и без диалогового окна JQuery UI - без проблем).

ПОМОЩЬ!

PHP код вызывается с помощью метода .POST:

$sql = "select * from shopping_cart WHERE id=$_POST[id] LIMIT 1"; 
      $result = mysql_query($sql); 
      $row = mysql_fetch_assoc($result); 

      if ($row["Type"] == "CouponUsed") { 
       $sql_delete_free_item = "delete from shopping_cart where ProductID=".$_SESSION["freeProductId"]." and SessionID='".session_id()."'"; 
       $query = mysql_query($sql_delete_free_item); 
       unset($_SESSION["freeProductId"]); 
      } 
$sql_id = "SELECT ProductID FROM shopping_cart WHERE id=$_POST[id] LIMIT 1"; 
    $result_id = mysql_query($sql_id); 
    $row_id = mysql_fetch_assoc($result_id); 
    $sql_remove = "DELETE FROM shopping_cart WHERE id=$_POST[id] LIMIT 1"; 
if (mysql_query($sql_remove)) { 
     $sql_remove2 = "DELETE FROM shopping_cart_single WHERE singleid=$_POST[id]"; 
     mysql_query($sql_remove2); 
    } 
mysql_close($conn); 
    exit(); 

Спасибо заранее!

+1

** Опасность **: Вы используете [** устарели * * API базы данных] (http://stackoverflow.com/q/12859942/19068) и должен использовать [современную замену] (http://php.net/manual/en/mysqlinfo.api.choosing.php). Вы уязвимы для [SQL-инъекций] (http://bobby-tables.com/) **, что современный API упростит [защиту] (http://stackoverflow.com/questions/60174/ наилучшим образом-чтобы-предотвратить-sql-injection-in-php). – Quentin

ответ

1

Просто включив соответствующую деталь.

"Confirm": function() { 
      $.post("includes/inc_details.php", { 
       "type":"remove", 
       "id":rid 
      }).then(function() { 
       window.location.reload(); 
       $(this).dialog("close"); 
      }); 
     }, 

Помните, что означает A в AJAX - асинхронный!

EDIT: Чтобы объяснить, что происходит, объясните, как браузер реагирует.

  1. POST запрос в очереди для представления. Асинхронный, поэтому не сразу. Запросы занимают гораздо больше времени, чем другие действия пользователя, поэтому он не будет запускать его и блокировать поток пользовательского интерфейса.
  2. Window сказал, чтобы перезагрузить. Браузер отменяет все ожидающие запросы - iframes, images, ajax просит и начинает загрузку новой страницы.
  3. (Если бы не перезагружается, то, как только Javascript стек закончился, он будет фактически отправить запрос)
+0

Тем не менее запрос отправляется в php-файл, поэтому элемент должен быть удален. –

0

Когда «Confirm» кнопку в диалоговом окне будет нажата, это предположим .post для php-файла для дальнейшей обработки (код для этой части ниже) и , когда он завершен, перезагрузит окно браузера и закроет диалоговое окно.

Ваш призыв к reload() является после$.post() вызова. Поэтому вы сообщаете браузеру, чтобы сделать запрос POST, затем немедленно перезагрузите страницу. Поскольку вы перезагружаете страницу перед отправкой запроса POST, вы отменяете запрос POST.

Вам необходимо перевести вызов на reload() в функцию обратного вызова, которую вы передаете в $.post().

Лучше все еще: не используйте Ajax. Просто отправьте обычную форму и обработчик серверной стороны перенаправляет URL-адрес, который вы хотите перезагрузить.

1

выберите * из shopping_cart WHERE ID = ' "$ _ POST [ID]."' LIMIT 1

Ваша проблема в том, что вы не добавить двойные кавычки и точки вокруг $ _POST [ID],

, а также ваши $ sql_remove, пожалуйста, перепроверьте все ваши $ _POST [ID] является '$ _ POST [ID]. ".'

Смежные вопросы