Форма Ajax, PHP, MySQL

Если Вы совсем новичок и слабо представляете себе возможности jQuery, не можете понять в каком форуме задать свой вопрос - Вам сюда.

Модераторы: TRAHOMOTO, tuareg, Gennady

Форма Ajax, PHP, MySQL

Сообщение lexpage » 04 авг 2010, 12:53

Доброго времени суток.
Столкнулся вот с такой проблемой. Делаю форму (добавление новой записи в БД), есть много полей, в т.ч. и типа файл.
В базе нужно хранить только имя, сам файл загружать в определенную папку.
Также в этой форме я сделал проверку вводимых данных. Вот привожу тексты файлов:
1. сама форма вызывается через функцию
Код: выделить все
function display_newtask_form($start_id)
{
?>
<div id="carbonForm">
<span class="header"><? echo menu_7_1; ?></span>
   <form enctype="multipart/form-data" method="post" action="task_new.php" id="signupForm">
      <div class="fieldContainer">
         <div class="formRow" style="height:30px;">
            <div class="label"><label for="task_name"><? echo new_task_name; ?></label></div>
            <div class="field"><input type="text" name="task_name" id="task_name" size="78" maxlength="255"></input></div>
         </div>
         <div class="formRow" style="height:110px;">
            <div class="label"><label for="task_desc"><? echo new_task_desc; ?></label></div>
            <div class="field"><textarea name="task_desc" id="task_desc" cols="75" rows="5"></textarea></div>
         </div>
         <div class="formRow" style="height:30px;">
            <div class="label"><label for="task_name"><? echo new_task_cost; ?></label></div>
            <div class="field"><input type="text" name="task_cost" id="task_cost" size="10" maxlength="5" value="0.00"></input></div>
            <div class="label" style="width: 200px;"><label for="task_name"><? echo new_task_pr; ?></label></div>
            <div class="field">
               <select name="task_pr" id="task_pr">
                  <option value="1">1</option>
                  <option value="2">2</option>
                  <option value="3">3</option>
                  <option value="4">4</option>
                  <option value="5">5</option>
               </select>
               <input type="hidden" name="starter_id" id="starter_id" value="<? echo $start_id;?>"></input>
            </div>
         </div>
         <div class="formRow" style="height:30px;">
            <div class="label"><label for="task_name"><? echo new_task_date_fin; ?></label></div>
            <div class="field" style="padding:0;">
               <input name="task_fin_d" id="task_fin_d" size="4" maxlength="4" value="1"></input>
               &nbsp;<label style="padding:0 10px 0 0;text-align:right;color:#fff;"><? echo help_day; ?></label>&nbsp;&nbsp;&nbsp;
               <input name="task_fin_h" id="task_fin_h" size="4" maxlength="2" value="0"></input>
               &nbsp;<label style="padding:0 10px 0 0;text-align:right;color:#fff;"><? echo help_hour; ?></label>&nbsp;&nbsp;&nbsp;
               <input name="task_fin_min" id="task_fin_min" size="4" maxlength="2" value="0"></input>
               &nbsp;<label style="padding:0 10px 0 0;text-align:right;color:#fff;"><? echo help_min; ?></label>&nbsp;&nbsp;&nbsp;
            </div>
         </div>
         <div class="formRow" style="height:30px;">
            <div class="label"><label for="task_name"><? echo new_task_worker; ?></label></div>
            <div class="field"><input type="text" name="task_worker_id" id="task_worker_id" size="20" maxlength="20"></input></div>
            <div class="label" style="width: 60px;"><label for="task_name"><? echo new_task_file; ?></label></div>
            <div class="field"><input name="userfile" type="file"></div>
         </div>
      </div>
      <div class="signupButton">
         <input type="submit" name="submit" id="submit" value="<? echo new_task_subm; ?>">
      </div>
   </form>
</div>

<script type="text/javascript" src="<? echo HTTP_SERVER.'/jscript/new_task.js'; ?>"></script>
<?
}


2. Подключаемый яваскрипт new_task.js
Код: выделить все
$(document).ready(function(){
   // $(document).ready() is executed after the page DOM id loaded
   
   
   // Binding an listener to the submit event on the form:
   $('#signupForm').submit(function(e){

      // If a previous submit is in progress:
      if($('#submit').hasClass('active')) return false;
      
      // Adding the active class to the button. Will show the preloader gif:
      $('#submit').addClass('active');
      
      // Removing the current error tooltips
      $('.errorTip').remove();
      
      // Issuing a POST ajax request to submit.php (the action attribute of the form):
      $.post($('#signupForm').attr('action'),$('#signupForm').serialize()+'&fromAjax=1',function(response){
         
         if(!response.status)
         {
            // Some kind of input error occured
            
            // Looping through all the input text boxes,
            // and checking whether they produced an error
            $('input[type!=submit]').each(function(){
               var elem = $(this);
               var id = elem.attr('id');
               
               if(response[id])
                  showTooltip(elem,response[id]);
            });
         }
         else location.replace(response.redirectURL);
         
         $('#submit').removeClass('active');
      },'json');
      
      e.preventDefault();
   });
   
   $(window).resize();
});

// Helper function that creates an error tooltip:
function showTooltip(elem,txt)
{
   // elem is the text box, txt is the error text
   $('<div class="errorTip">').html(txt).appendTo(elem.closest('.formRow'));
}


3. Обработчик task_new.php
Код: выделить все
<?php
require_once("func/auth_fns.php");
require_once("func/tasks_fns.php");
error_reporting(E_ALL^E_NOTICE);
$redirectURL = 'http://адрес сайта/message.php?msg=new_task';
$errors = array();

function task_add($task_name, $task_desc, $task_fin_date, $task_cost, $task_starter_id, $task_worker_id, $task_pr, $userfile_name)
{
   $task_status = 1;
   $task_start_date = date("Y-m-d H:i:s", time());
   $task_visits = 0;
   
   $conn = db_connect();
   if (!$conn)
      return error_connect;
   
   $id = mysql_query("select max(id) from tasks");
   $id++;
   $result = mysql_query("insert into tasks values ('$id', '$task_name', '$task_desc', '$task_start_date',
                    '$task_fin_date', '$task_cost', '$task_status', '$task_starter_id', '$task_worker_id',
                    '$task_pr', '$task_visits', '$userfile_name')");
   if (!$result)
      return error_task_add;
   
   return true;
}

if(!$_POST['task_name'] || strlen($_POST['task_name'])<3 || strlen($_POST['task_name'])>255)
{
   $errors['task_name']='Введите правильно название!<br />Оно должно быть от 3 до 255 символов.';
}
if(!$_POST['task_desc'] || strlen($_POST['task_desc'])<3 || strlen($_POST['task_desc'])>3000)
{
   $errors['task_desc']='Введите правильно описание!<br />Оно должно быть от 3 до 3000 символов.';
}
if(!$_POST['task_cost'] || !preg_match("/^[\.0-9]{1,5}$/", $_POST['task_cost']))
{
   $errors['task_cost']='Введите правильно стоимость!<br />Она должна состоять из цифр, десятичные знаки отделяются точкой.';
}
if(!$_POST['task_pr'] || $_POST['task_pr']<1 || $_POST['task_pr']>5)
{
   $errors['task_pr']='Введите правильно приоритет!<br />Он должен быть в пределах от 1 до 5.';
}
if(!$_POST['task_worker_id'] || !preg_match("/^[0-9]{1,4}$/", $_POST['task_worker_id']))
{
   $errors['task_worker_id']='Введите правильно номер исполнителя!<br />Он должен состоять только из цифр и быть до 4 знаков.';
}
if(!preg_match("/^[0-9]{1,4}$/", $_POST['task_fin_d']) || !preg_match("/^[0-9]{1,4}$/", $_POST['task_fin_h']) ||
   !preg_match("/^[0-9]{1,4}$/", $_POST['task_fin_min']))
{
   $errors['task_fin_d']='Введите правильно срок выполнения.<br />Формат ДДДД дней, ЧЧ часов, ММ минут.';
}

if($_POST['fromAjax'])
{
   if(count($errors))
   {
      $errString = array();
      foreach($errors as $k=>$v)
      {
         $errString[]='"'.$k.'":"'.$v.'"';
      }
      die   ('{"status":0,'.join(',',$errString).'}');
   }

   $task_name = $_POST['task_name'];
   $task_desc = $_POST['task_desc'];
   $task_cost = $_POST['task_cost'];
   $task_pr = $_POST['task_pr'];
   $task_fin_date = date("Y-m-d H:i:s", time()+(60*($_POST['task_fin_min'] + 60*($_POST['task_fin_h'] + 24*$_POST['task_fin_d']))));
   $task_worker_id = $_POST['task_worker_id'];
   $task_starter_id = $_POST['starter_id'];
   if (isset($_FILES["userfile"]))
   {
      $userfile_name = $_FILES['userfile']['name'];
      if (is_uploaded_file($_FILES['userfile']['tmp_name'])) {
         $uploadfile = "/home/ims/public_html/docs/".$userfile_name;
         @move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile);
      }
   } else {
      $userfile_name = "none";
   }
   $task_added = task_add($task_name, $task_desc, $task_fin_date, $task_cost, $task_starter_id, $task_worker_id, $task_pr, $userfile_name);
   if ($task_added == "true")
   {
      echo '{"status":1,"redirectURL":"'.$redirectURL.'"}';
   }
   else
   {
      echo $task_added;
      exit;
   }
   exit;
}

if(count($errors))
{
   echo '<h2>'.join('<br /><br />',$errors).'</h2>';
   exit;
}

// Directly redirecting the visitor:

header("Location: ".$redirectURL);
?>


Работает все кроме закачки файла и добавления его имени в БД. Уже пробовал разные варианты. Пробовал убирать строку подключения проверки на яве из первого файла - файл закачался, а имя в БД все-равно не записалось. Сделал вывод, что PHP скрипт не видит почему-то глобальній массив $_FILES при использовании явы. Может кто-то подскажет, как побороть проблему?
lexpage
 
Сообщений: 5
Зарегистрирован: 04 авг 2010, 12:34

Re: Форма Ajax, PHP, MySQL

Сообщение EGORR » 04 авг 2010, 13:17

Причем здесь jQuery?
Life is very short, and there's no time
For fussing and fighting, my friend...
Аватар пользователя
EGORR
Модератор
 
Сообщений: 720
Зарегистрирован: 22 янв 2010, 01:44
Откуда: Ярославль

Re: Форма Ajax, PHP, MySQL

Сообщение lexpage » 04 авг 2010, 13:59

всмысле причем? у меня проверяется правильность ввода данных. Если что-то неправильно справа от нужного поля вылазит красным текст ошибки.
lexpage
 
Сообщений: 5
Зарегистрирован: 04 авг 2010, 12:34

Re: Форма Ajax, PHP, MySQL

Сообщение EGORR » 04 авг 2010, 14:26

lexpage писал(а):всмысле причем? у меня проверяется правильность ввода данных. Если что-то неправильно справа от нужного поля вылазит красным текст ошибки.


Вы пишете
Работает все кроме закачки файла и добавления его имени в БД.

Вот я и спрашиваю : Причем здесь jQuery?
Life is very short, and there's no time
For fussing and fighting, my friend...
Аватар пользователя
EGORR
Модератор
 
Сообщений: 720
Зарегистрирован: 22 янв 2010, 01:44
Откуда: Ярославль

Re: Форма Ajax, PHP, MySQL

Сообщение lexpage » 04 авг 2010, 14:41

Вот я и не знаю причем... Просто без проверки на валидность файл закачивается, а с проверкой- нет. а в БД не записывает ни так, ни так.
lexpage
 
Сообщений: 5
Зарегистрирован: 04 авг 2010, 12:34

Re: Форма Ajax, PHP, MySQL

Сообщение lexpage » 04 авг 2010, 14:41

Извините, если я некорректно вопрос где-то поставил. Вроде стралася максимально подробно описать
lexpage
 
Сообщений: 5
Зарегистрирован: 04 авг 2010, 12:34

Re: Форма Ajax, PHP, MySQL

Сообщение Gennady » 04 авг 2010, 23:27

Сделал вывод, что PHP скрипт не видит почему-то глобальній массив $_FILES при использовании явы

Вот только не явы наверное, а JavaScript? Есть разница небольшая, согласны?
А вывод в общем и целом правильный - действительно не видит, поскольку тот код, который Вы где-то взяли использует стандартный POST-запрос и не более того....
Как решение можно посоветовать использовать связку плагинов jquery.form + jquery.validate
Долог путь поучения, короток и успешен путь примеров (Сенека).
I'm a member of jQuery Meetups. jQuery users unite! Connect with other jQuery users... Присоединиться к jQuery Russia.
Аватар пользователя
Gennady
Администратор
 
Сообщений: 1886
Зарегистрирован: 14 янв 2010, 14:36
Откуда: Москва

Re: Форма Ajax, PHP, MySQL

Сообщение lexpage » 06 авг 2010, 10:18

А я вот кое-где нашел, что можно как-то через скрытый iframe. Так получится, не знаете?
lexpage
 
Сообщений: 5
Зарегистрирован: 04 авг 2010, 12:34

Re: Форма Ajax, PHP, MySQL

Сообщение Gennady » 06 авг 2010, 14:21

Вы себе хотите усложнить жизнь? ;) Используйте плагины - быстрее решите конкретную задачу.
Долог путь поучения, короток и успешен путь примеров (Сенека).
I'm a member of jQuery Meetups. jQuery users unite! Connect with other jQuery users... Присоединиться к jQuery Russia.
Аватар пользователя
Gennady
Администратор
 
Сообщений: 1886
Зарегистрирован: 14 янв 2010, 14:36
Откуда: Москва


Вернуться в Вопросы от совсем новичков

Кто сейчас на форуме

Сейчас этот форум просматривают: Google [Bot] и гости: 4