Русскоязычный форум, посвященный фреймворку Kohana
http://forum.kohanaframework.su/

Вставка в БД при помощи Ajax не увенчалась успехом
http://forum.kohanaframework.su/viewtopic.php?f=33&t=205
Страница 1 из 2

Автор:  androidos [ 02 июн 2012, 17:57 ]
Заголовок сообщения:  Вставка в БД при помощи Ajax не увенчалась успехом

Привет парни,
Вообщем хочу сделать добавление в базу с аяксом, но данные не добавляются. Без Аякса - все работает. Нашел в инеие пример, делал по нему, но увы.

JS код
Код:
<script type="text/javascript">
(function($){   
   var form;
   function postSuccess(errors){

      $('.form-error, .form-success').hide();

      if (!errors.length && errors.length !== undefined) {

         form.reset();

         $('.form-success')
            .hide()
            .html('Message successfully sent!')
            .fadeIn('fast');

      } else {
         
         $.each(errors, function(key, val){

            var id = $('[name="' + key + '"]').attr('id');

            $('label[for="' + id + '"] .form-error')
               .hide()
               .html(val)
               .fadeIn('fast');
         });

      }
   }

   $('#ajax-form').submit(function(e){

      form = this;

      e.preventDefault();

      $.ajax({
         type: 'POST',
         url: this.action,
         data: $(this).serialize(),
         dataType: 'json',
         success: postSuccess
      });
   });

})(this.jQuery);
</script>


HTML
Код:
<form action="" method="post" id="ajax-form" accept-charset="utf-8">   <fieldset>

      <p class="form-success helper-hidden"></p>

      <div class="field">
         <label for="field-email">
            <span class="abc">Email</span>
            <span class="form-error">
                        </span>
         </label>
         <input type="text" id="field-email" name="email" />      </div>

      <div class="field">
         <label for="field-message">
            Message
            <span class="form-error">
                        </span>
         </label>
         <textarea id="field-message" name="message" cols="50" rows="10" style="height: 60px"></textarea>      </div>

      <input type="submit" id="submit" name="submit" value="Submit" class="button" />   </fieldset>
</form>


PHP
Код:
if(isset($_POST['submit']))
      {
         $username = $_POST['email'];
         $password = $_POST['message'];
         $insert = DB::insert('users')->columns(array('username', 'password'))->values(array($username, $password));
         list($insert_id, $affected_rows) = $insert->execute();
      }


Помогите пожалуйста реализовать
На названия полей не обращайте внимания, дело не в этом

Автор:  admin [ 02 июн 2012, 18:21 ]
Заголовок сообщения:  Re: Вставка в БД при помощи Ajax не увенчалась успехом

Немного занят. У вас фаербаг стоит ? Там очень удобно отслеживать аякс запросы.

Автор:  androidos [ 02 июн 2012, 18:28 ]
Заголовок сообщения:  Re: Вставка в БД при помощи Ajax не увенчалась успехом

Да, есть, пробую там тоже, но пока ничего не разобрать ((.

Автор:  admin [ 02 июн 2012, 18:41 ]
Заголовок сообщения:  Re: Вставка в БД при помощи Ajax не увенчалась успехом

Исходники дадите, посмотрю.
Нет времени создавать эти файлы.

Автор:  androidos [ 02 июн 2012, 18:58 ]
Заголовок сообщения:  Re: Вставка в БД при помощи Ajax не увенчалась успехом

Загрузил. Там именно те файлы, которые задействованы, не стал весь framework кидать, но если лучше весь, то без проблем

Вложения:
ajax.7z [28.61 КБ]
Скачиваний: 337

Автор:  qed [ 02 июн 2012, 21:16 ]
Заголовок сообщения:  Re: Вставка в БД при помощи Ajax не увенчалась успехом

В PHP Вы проверяете существование ключа submit в массиве $_POST
Код:
if(isset($_POST['submit']))
{
     $username = $_POST['email'];
     $password = $_POST['message'];
     $insert = DB::insert('users')->columns(array('username', 'password'))->values(array($username, $password));
     list($insert_id, $affected_rows) = $insert->execute();
}

Но метод .serialize() на js не сериализует саму кнопку, по которой была отправлена форма (да и вообще сейчас смотрю как-то мутно у него с кнопками..).
Код:
data: $(this).serialize(),

Как вариант проверять в php наличие нужных полей вместо submit.
А ещё лучше вынести обработку ajax запроса в отдельный метод, а то сейчас получается что ajax запрос подхватывает шаблоны и возвращает кучу всего(вместе с формой, скриптами и стилями), хотя вроде как и не должен.

Автор:  androidos [ 02 июн 2012, 21:38 ]
Заголовок сообщения:  Re: Вставка в БД при помощи Ajax не увенчалась успехом

Будет очень нагло если я попрошу показать, всё что Вы выше писали, на коде?

Автор:  androidos [ 02 июн 2012, 21:41 ]
Заголовок сообщения:  Re: Вставка в БД при помощи Ajax не увенчалась успехом

а про serialize(), я просто во многих примерах видел такое

Автор:  qed [ 02 июн 2012, 22:49 ]
Заголовок сообщения:  Re: Вставка в БД при помощи Ajax не увенчалась успехом

C serialize() всё верно, нужно только изменить обработчик. В массиве $_POST нету ключа submit. Можно изменить
Код:
if(isset($_POST['submit']))
на
Код:
if(isset($_POST['email']) AND isset($_POST['message']))

Это решит вашу проблему и данные начнут сохраняться в базу.
Но есть другой момент, в Вашем случае ajax-запрос должен возвращать только информацию о успешности операции, либо какие-нибудь ошибки, сейчас же он возвращает целиком всю страницу. Как вариант для ajax-запросов можно сделать отдельный контроллер, который будет наследоваться от Controller, а не от Controller_Template, ну и там уже держать экшены, которые будут обрабатывать сами запросы. Вот пример для Вашего кода:
Код:
<?php defined('SYSPATH') or die('No direct script access.');
class Controller_Ajax extends Controller {

   public function action_new_user()
   {
      $username = $_POST['email'];
      $password = $_POST['message'];
      $insert = DB::insert('users')->columns(array('username', 'password'))->values(array($username, $password));
      list($insert_id, $affected_rows) = $insert->execute();
   }

}

Ну и конечно же не помешали бы какие-нибудь валидации перед записью в базу.., правда это наверное ещё только наброски.

Автор:  androidos [ 02 июн 2012, 23:44 ]
Заголовок сообщения:  Re: Вставка в БД при помощи Ajax не увенчалась успехом

Спасибо большое, ajax сработал. По-поводу отдельного контроллера буду пробовать чуть позже. Валидацию попробую реализовать

Страница 1 из 2 Часовой пояс: UTC + 4 часа [ Летнее время ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/