Модераторы: Sardar, Aliance

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Моментальная обработка Checkbox, Асинхронные запросы к БД 
:(
    Опции темы
DARKLOTOS
Дата 8.6.2011, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 9.12.2010

Репутация: нет
Всего: нет



Доброго времени суток! Пришёл на форум тупо от безысходности. Есть очень важный проект, на него потрачено огромное колличество времени (пол года жизни =) ). Задача в принципе проста, но для меня невыполнима, точнее выполнима, если это не выходит за рамки php, но появилось условие, которое вынуждает использовать AJAX. Помогите с фукнцией... Гугл как не странно ничего толкового по этому вопросу не дал =(, книги тоже, только мозг вынесли.
Задача значит следующая, банальная до ужаса, нужно чтобы значение отмеченных checkbox менялось в БД с 0 на 1. После выполнения запроса к БД пользователю выдаётся список, который строится вот таким кодом 
Код

if($myrow['personal']==1)
{$o[]="<td class='check'><input type=checkbox name=\"call_select[]\" checked data-on=\"Personal\" data-off=\"Business\" value=\"$value\" ></td>";}
             else
{$o[]="<td class='check'><input type=checkbox name=\"call_select[]\" data-on=\"Personal\" data-off=\"Business\"  value=\"$value\" ></td>";}
             $o[]="<td align=right>{$myrow['cost']}</td>";
             $o[]="<td>{$myrow['recipient']}</td>";
             $o[]="<td>{$myrow['date_of_call']}</td>";
             $o[]="<td>{$myrow['time_of_call']}</td>";
             $o[]="<td>{$myrow['duration']}</td>";
             $o[]="<td align=right>{$myrow['connection_type']}</td>";
             $o[]="<td align=center>{$myrow['volume']}</td>";
             $o[]="<td>{$myrow['rouming']}</td>";
             $o[]="</thead></tr>";
       }
       $o[]="</tbody></table>";
       $o[]="<input type=\"submit\" name=\"set_personal\" value=\"RESULT\">";
       $o[]="</form><br>";
       echo implode('',$o);

Т.е. если в таблице значение поля personal=1, то здесь отображается Checked, в противном случае пустой чекбокс.
Здесь есть кнопка Submit "Result". Есть указание от неё избавиться, т.е. сделать так чтобы при отметке чекбокса его значение в БД сразу менялось. Это же можно сделать через xmlHttpRequest, кот только как, я не знаю. Подскажите плиз. smile  smile 
PM MAIL   Вверх
EmilRegis
Дата 8.6.2011, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 306
Регистрация: 21.9.2007

Репутация: 3
Всего: 4



так в чём проблема..Гуглишь по запросу AJAX примеры, получаешь пример работы с асинхронными запросами и по клику на чекбоксах отправляешь на сервер нужную тебе информацию, а на сервере уже апдейтешь твою таблицу в бд
PM MAIL   Вверх
DARKLOTOS
Дата 8.6.2011, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 9.12.2010

Репутация: нет
Всего: нет



Логически я тоже понимаю что должно быть именно так, проблема с реализацией, как именно можно передать серверу запрос на изменение данных в БД без использования кнопки?

Это сообщение отредактировал(а) DARKLOTOS - 8.6.2011, 10:33
PM MAIL   Вверх
Evghenusi
Дата 8.6.2011, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


майский жук
**


Профиль
Группа: Участник
Сообщений: 506
Регистрация: 3.8.2006
Где: Молдова, Кишинёв

Репутация: 3
Всего: 15



Цитата
как именно можно передать серверу запрос на изменение данных в БД без использования кнопки?
чекбоксы кидаешь в форму, и при клике на них (событие) 
Код

document.getElementById('form1').submit()
хотя если речь о аяксе, то просто вызываешь функцию
Код

<input name="Name" onclick="function()" type="checkbox" value="ON" checked="" />

Код

$o[]="</form><br>";
echo implode('',$o);
зачем собирать массив, а после его склеивать?

и распиши пожалуйста по пунктам что тебе надо




Это сообщение отредактировал(а) Evghenusi - 8.6.2011, 11:06
PM WWW   Вверх
DARKLOTOS
Дата 8.6.2011, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 9.12.2010

Репутация: нет
Всего: нет



По пунктам? Легко! =)
1. Показать пользователю выпадающий список с номерами телефонов, по которым он звонил в прошлом месяце.
Код

option value='0'>Select the recipient</option><?$q = mysql_query("SELECT distinct recipient FROM Calls WHERE phone_number=$phone_number  AND Calls.date_of_call 
BETWEEN DATE_SUB(DATE_SUB(CURDATE(), INTERVAL 1 MONTH), INTERVAL DAY(CURDATE())-1 DAY) 
AND DATE_SUB(CURDATE(), INTERVAL DAY(CURDATE()) DAY) and Calls.Cost<>0 ");
$p = mysql_fetch_array ($q);
do{echo "<option value=".$p['recipient'].">".$p['recipient']."</option>";}
while ($p = mysql_fetch_array ($q));?></select>

2.В зависимости от выбора отобрать с БД все звонки на указанный номер за прошлый меяц и выстроить в таблицу.
Код

if (isset($_POST["option"]) and ($_POST["option"]>0)) {
    $option = $_POST["option"];
    $query="Select * From Calls Where phone_number=$_SESSION[phone_number] and recipient=$option AND Calls.date_of_call 
BETWEEN DATE_SUB(DATE_SUB(CURDATE(), INTERVAL 1 MONTH), INTERVAL DAY(CURDATE())-1 DAY) 
AND DATE_SUB(CURDATE(), INTERVAL DAY(CURDATE()) DAY) and Calls.Cost<>0";
    $result=mysql_query($query);
    if($result)
 {//далее код из первого поста

В результате пользователь видит все звонки за прошлый месяц, в виде таблицы с чекбоксами.
Визуально чекбоксы заменены на красную кнопку Personal(если отмечен) либо на зелёную кнопку Business(если не отмечен)
Как сделано: Выводится список, пользователь отметил, нажал Result, посылается запрос на изменение поля personal в таблицу Calls и на запись некоторых данных в таблицу Stats
Как нужно: При клике на чек Business он должен не просто сменить значение на checked но и выполнить запрос к БД, изменив в таблице Calls поле personal у этого звонка.
Чтобы пользователю не нужно было нажимать кнопку. Хотя я так думаю в любом случае кнопка останется, но уже для того чтобы передать данные в таблицу Stats.
Для чего это делается:
1. Пользователи не всегда нажимают кнопку, а если они забыли, им приходится отмечать всё сначала, потому-что после уничтожения сессии данные теряются.
2. Проверяющему будет проще ориентироваться в ситуации, когда он будет заходить и видеть что пользователь был в системе,отметил звонки (т.е. их значение в БД 1), но ещё не окончательно(таблица Stat пустая), значит результат рассчётов ещё будет меняться.

Это сообщение отредактировал(а) DARKLOTOS - 8.6.2011, 14:18
PM MAIL   Вверх
EmilRegis
Дата 8.6.2011, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 306
Регистрация: 21.9.2007

Репутация: 3
Всего: 4



так что в итоге непонятно? как ajax-ом пользоваться? или что?
PM MAIL   Вверх
Evghenusi
Дата 8.6.2011, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


майский жук
**


Профиль
Группа: Участник
Сообщений: 506
Регистрация: 3.8.2006
Где: Молдова, Кишинёв

Репутация: 3
Всего: 15



сколько платишь за реализацию?  smile 

если будет настроение по читать - сюда
(или на методе POST поищи, он даже лучше)
PM WWW   Вверх
DARKLOTOS
Дата 8.6.2011, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 9.12.2010

Репутация: нет
Всего: нет



Цитата(EmilRegis @ 8.6.2011,  14:30)
так что в итоге непонятно? как ajax-ом пользоваться? или что?

Именно! Вообще непонятно. На php работаю,  c MySQL вроде дружу, а что это за зверь такой AJAX вообще не знаю.

Добавлено @ 14:54
Цитата(Evghenusi @ 8.6.2011,  14:33)
если будет настроение по читать - сюда
(или на методе POST поищи, он даже лучше)

Прочитал. Там только показано как вытягивать данные из БД. Это у меня и так работает, без AJAX

Это сообщение отредактировал(а) DARKLOTOS - 8.6.2011, 14:56
PM MAIL   Вверх
нуп
Дата 8.6.2011, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ботокодер
**


Профиль
Группа: Участник
Сообщений: 987
Регистрация: 22.6.2009
Где: Кременчуг

Репутация: 12
Всего: 33



Пример как раз тот, что вам нужен. Дальше дело за вами  smile 
PM MAIL   Вверх
DARKLOTOS
Дата 8.6.2011, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 9.12.2010

Репутация: нет
Всего: нет



В примере показано только как вытянуть данные.
А можно это как-то сделать используя такую функцию? 
Код

$(document).ready(function(){
  // --------------
  $("#a1").click(
    function () {
      $.ajax({
        type: "POST",
        data: "n=3",
        url: "events.php"
      });    
    });
  // --------------
  $("#loading").ajaxStart(function(){
   $(this).show();
   $("#message").hide();
  });
  $("#loading").ajaxStop(function(){
   $(this).hide();
  });
  $("#message").ajaxComplete(function(){
   $(this).show();
 });  
});

Это код с другого проекта

Это сообщение отредактировал(а) DARKLOTOS - 8.6.2011, 15:15
PM MAIL   Вверх
Evghenusi
Дата 8.6.2011, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


майский жук
**


Профиль
Группа: Участник
Сообщений: 506
Регистрация: 3.8.2006
Где: Молдова, Кишинёв

Репутация: 3
Всего: 15



Цитата(DARKLOTOS @  8.6.2011,  14:51 Найти цитируемый пост)
Прочитал. Там только показано как вытягивать данные из БД. Это у меня и так работает, без AJAX
 smile ...нечего мне сказать, попробуй на код посмотреть прищурившись, вдруг поможет  smile 

Код

if($myrow['personal']==1)
{$o="<td class='check'><input type=checkbox name='call_select[]' checked data-on='Personal' data-off='Business' value='$value'></td>";}
else
{$o="<td class='check'><input type=checkbox name='call_select[]' data-on='Personal' data-off='Business'  value='$value'></td>";}
             $o.="<td align=right>{$myrow['cost']}</td>";
             $o.="<td>{$myrow['recipient']}</td>";
             $o.="<td>{$myrow['date_of_call']}</td>";
             $o.="<td>{$myrow['time_of_call']}</td>";
             $o.="<td>{$myrow['duration']}</td>";
             $o.="<td align=right>{$myrow['connection_type']}</td>";
             $o.="<td align=center>{$myrow['volume']}</td>";
             $o.="<td>{$myrow['rouming']}</td>";
             $o.="</thead></tr>";
       }
       $o.="</tbody></table>";
       $o.="<input type='submit' name='set_personal' value='RESULT'>";
       $o.="</form><br>";
в этом случае нет массива, есть длиннюююющая строка, и склеивать соответственно ничего не надо. так же \" заменил на одинарную кавычку '
PM WWW   Вверх
EmilRegis
Дата 8.6.2011, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 306
Регистрация: 21.9.2007

Репутация: 3
Всего: 4



DARKLOTOS, вот всё про ажакс http://javascript.ru/ajax/intro
Просто почитайте, там всё понятно.

Если же используете жквери(как в вашем примере выше), то тут всё ещё проще, хотя лучше сначала понять как это всё работает, а потом уже применять библиотеки.
Код

$.ajax({
  url: "test.html",
  type: 'Post',
  success: function(){
    $(this).addClass("done");
  }
});

Здесь url - адрес, куда отсылается запрос, success - callback-функция, которая вызывается после того как сервер вернёт ответ на ваш запрос. Этот ответ в php возвращается после всех необходимых манипуляций с БД обычным echo
PM MAIL   Вверх
DARKLOTOS
Дата 9.6.2011, 06:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 9.12.2010

Репутация: нет
Всего: нет



Цитата(Evghenusi @ 8.6.2011,  15:31)
в этом случае нет массива, есть длиннюююющая строка, и склеивать соответственно ничего не надо. так же \" заменил на одинарную кавычку '

Да. Конечно разница ощутима =)
Теперь вообще ничего не выводится =)
И переделывание цикла не решит проблемы с кнопкой
PM MAIL   Вверх
DARKLOTOS
Дата 9.6.2011, 06:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 9.12.2010

Репутация: нет
Всего: нет



Пойдём более коротким путём.
Есть ли где-нибудь скрипт, который при клике на чекбокс, сразу меняет значение ячейки в БД, без подтверждающих кнопок?!
PM MAIL   Вверх
EmilRegis
Дата 9.6.2011, 08:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 306
Регистрация: 21.9.2007

Репутация: 3
Всего: 4



чем не устраивает
Код

$.ajax({
  url: "test.php",
  type: 'Post',
  success: function(){
    alert('ответ');
  }
});

PM MAIL   Вверх
Evghenusi
Дата 9.6.2011, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


майский жук
**


Профиль
Группа: Участник
Сообщений: 506
Регистрация: 3.8.2006
Где: Молдова, Кишинёв

Репутация: 3
Всего: 15



Цитата(DARKLOTOS @  9.6.2011,  06:08 Найти цитируемый пост)
Да. Конечно разница ощутима =)
Теперь вообще ничего не выводится =)
ну может я что-то где-то упустил, я человек, а не робот...звиняй
хотя ни мой редактор, ни подсветка синтаксиса на этом форуме ошибок не показывают.
может моя вина в том что echo не дописал в твоём коде....хз, но всё равно извини  smile 

Цитата(DARKLOTOS @  9.6.2011,  06:08 Найти цитируемый пост)
И переделывание цикла не решит проблемы с кнопкой 
а эту проблему решишь только ты, или полугодовой проект тоже не ты писал?
пока что мотивации писать за тебя нету((


P.S. всё закрываю рот, а то больше флуд чем помощь. 
модераторы и посетители звиняйте за лишние буквы

Это сообщение отредактировал(а) Evghenusi - 9.6.2011, 10:24
PM WWW   Вверх
DARKLOTOS
  Дата 14.6.2011, 08:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 9.12.2010

Репутация: нет
Всего: нет



Объясните плиз как это использовать. Ну прикрутил я этот код к странице, у меня теперь при входе на страницу выскакивает сообщение Ответ. И что мне это дало?
Как это использовать чтобы подтягивать данные из БД и отправлять туда результат?
Цитата(Evghenusi @  9.6.2011,  10:21 Найти цитируемый пост)
или полугодовой проект тоже не ты писал?

Проект писал я, но я же не использовал JS, там был только php, а на php я всегда для запросов использую кнопку.

Это сообщение отредактировал(а) DARKLOTOS - 14.6.2011, 08:59
PM MAIL   Вверх
нуп
Дата 14.6.2011, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ботокодер
**


Профиль
Группа: Участник
Сообщений: 987
Регистрация: 22.6.2009
Где: Кременчуг

Репутация: 12
Всего: 33



Разбейте задачу на несколько частей :
1) Вам нужна функция, которая принимает от вас данные(урл и пост данные), отправляет на сервер
2) Отрисовать форму с checkbox`ами и повесить на них событие (change или click) и по этому событию собрать данные, вызвать функцию из пункта 1
3) На сервере функция которая обрабатывает данные, вносит изменения в бд и отправляет ответ
4) Проверить все и попить чайку  smile 

PM MAIL   Вверх
DARKLOTOS
Дата 14.6.2011, 09:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 9.12.2010

Репутация: нет
Всего: нет



=(
Мда, на словах всё та легко, а для меня тёмный лес этот JS
 smile  smile 
как можно переделать этот код, чтобы он нормально работал. А тот тут получается что после того как отмечены чекбоксы, если отметки убрать то вместо 3х их становится 6. Или ошибка не в JS?
<?php
  if (isset($_POST['vs']))
  { var_dump($_POST['vs']);
    die();
  }
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js"></script>
    <script type="text/javascript">
      $(document).ready(function() {
        $('input:checkbox').change(function() {
          var vals = new Array();
          $('form :checked').each(function() {
            vals.push(this.value);
          })
          $('#container').load('test.php', { vs: vals } )
        })
      })
    </script>
  </head>
  <body>
    <form action="" method="post">
      <input type="checkbox" name="check[]" value="1" /> 1<br />
      <input type="checkbox" name="check[]" value="2" /> 2<br />
      <input type="checkbox" name="check[]" value="3" /> 3<br />
    </form>
    <div id="container"></div>
  </body>
</html>

Это может быть из-за того что в качетсве обработки указан самй текущий файл. Т.е. JS и PHP в одном файле находятся, и он получается сам себе данные передает

Это сообщение отредактировал(а) DARKLOTOS - 14.6.2011, 12:28
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0629 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.