Обработка неизвестного количества input
Доброго времени суток! Есть форма, которая создается с помощью php.
<?php $smet = mysql_query("SELECT id_pc_price, name_pc_price, min_pc_price, max_pc_price FROM pc_price") or die(mysql_error()); echo '<table class="table">'; echo " <thead> <tr> <th>Наименование</th> <th>Рекомендуемая цена</th> <th>Фактическая цена цена</th> </tr> </thead>"; while ($smeta = mysql_fetch_assoc($smet)) { $id_s = $smeta["id_pc_price"]; $name_s = $smeta["name_pc_price"]; $min_price = $smeta["min_pc_price"]; $max_price = $smeta["max_pc_price"]; echo " <tr> <td>$name_s</td> <td>$min_price-$max_price</td> <td> <form name='price' action='price.php' method='POST' id='price'> <input type='text' size='8' name='id_price[]' class='id_s' id='id_price'> </td> </tr> "; } echo " <input type='submit' name='in_price' value='Расчитать'> </form>"; ?> Мне нужно посчитать сумму, которую введет пользователь в поле "Фактическая цена". Кол-во полей заранее неизвестно. <script> $(function(){ $('#price').submit(function(){ //var field = $('#id_price').val(); //alert(field); //return false; var inputs = $('#id_price'); var iii = inputs.length; alert(iii); for (var i = 0; i < iii; i++) { alert(inputs[i]); return false; } }); // Конец submit }); // Конец function </script> //var field = $('#id_price').val(); //alert(field); //return false; Этот код работает, но обрабатывает только одно поле. var inputs = $('#id_price'); var iii = inputs.length; alert(iii); for (var i = 0; i < iii; i++) { alert(inputs[i]); return false; } Этот код работает, но когда вводишь число, то в переменную inputs[i] помещается object HtmlInputElement, а в переменную iii помещается число 1, хотя на странице 3 поля. Извините, если коряво описал проблему. |
or die(mysql_error()); - так можно писать в каком-то отдельном примере, когда нужно выяснить что-то. На реальных страницах такого быть не должно - нельзя вываливать ошибки запросов к базе на клиенте, это богатая пища для размышлений тем, кому эти ошибки как манна небесная. Если таким образом контролировать запросы, то нужно выводить ошибки по условию - включен режим отладки, значит ошибка, иначе сообщение "мол извиняйте, но...".
Плевать кусками тоже нет ни смысла не выгоды: echo '<table class="table"><tr> <th>Наименование</th> <th>Рекомендуемая цена</th> <th>Фактическая цена цена</th> </tr> </thead>'; Самое интересное дальше - $id_s = $smeta["id_pc_price"];, объявление этих промежуточных переменных для чего, облегчить жизнь интерпретатору? Ну так тогда зачем вы вгоняете эти переменные в строку, заставляя интерпретатор парсить ее, когда в этом нет никакой надобности? Не нужны эти "посредники" в коде если они не используются кроме этого цикла нигде более. А вогнав переменные в строку, даже не контролируете что получится: echo "<td>$min_price-$max_price</td>"; //что в итоге получится? И формы у вас нет, у вас бардак, потому, что открывающий тег формы выводится в цикле, а закрывающий вне его. В JS тоже полный швах, но сперва наведите порядок в серверной части. |
Решил переделать код, вот так получилось. Только все равно не пойму, как jquery обработать неизвестное кол-во инпутов
<?php define('DEBUG', 1); $order = mysql_query("SELECT * FROM pc_price") or die(DEBUG ? __FILE__ . '/' . __LINE__ . '/' . mysql_error() : 'Извините, ошибка'); while ($row = mysql_fetch_assoc($order)) { $html = "<div class='col-xs-6 col-md-4 proba2'> <p>Название услуги: $row[name_pc_price]</p> <p>Минимальная цена: $row[min_pc_price]</p> <p>Максимальная цена: $row[max_pc_price]</p> <form action='master_function.php' method='POST' name='in_work'> <label>Фактическая цена</label> <input type='text' name='fact_price' id='fact_price'> <input type='submit' name='in_w' value='Добавить в смету'> </form> </div>"; echo $html; } // Конец while ?> |
Не волнуйтесь за способности клиента, сможет он просчитать, вот только что?
Сначала у вас была ошибка в том, что серверный скрипт формировал некорректный html-код. Сейчас этой ошибки нет, но в контексте вашего вопроса "обработать N-количество полей формы", по идее возникает логическая ошибка. У вас сейчас будет формироваться N-форм с одним полем ввода каждая, и если нажать в любой из форм кнопку submit, то эта форма и будет отправлена. А какой тогда смысл обрабатывать N-полей, и в вашем случае не одной, а нескольких форм? Нет ли в этом у вас ошибки? И зачем вы опять вгоняете переменные в строку? РНР строку заключенную в одинарные кавычки не разбирает, вот и выводите так, а переменные конкатенацией. И либо сразу вывод строки (к чему у вас отдельное echo $html;?), либо собирайте в одну строку $html .= 'string'; в итерации, а после цикла echo $html; while ($row = mysql_fetch_assoc($order)) $html .= '<div class="col-xs-6 col-md-4 proba2"> <p>Название услуги: ', $row['name_pc_price'], '</p> <p>Минимальная цена: ', $row['min_pc_price'], '</p> <p>Максимальная цена: ', $row['max_pc_price'], '</p> <form action="master_function.php" method="post" name="in_work"> <label>Фактическая цена</label> <input type="text" name="fact_price" id="fact_price"> <input type="submit" name="in_w" value="Добавить в смету"> </form> </div>'; //фигурные скобки не обязательны, цикл содержит одно выражение echo $html; //а это после цикла |
Я просто пытаюсь сделать что-то наподобие корзины. Из базы выводится название работы, диапазон цены (минимальная и максимальная) и фактическая цена. Пользователь сам вводит фактическую цену. В итоге в базу заносится название работы и цена, которую указал пользователь.
Пытаюсь сделать так, нашел в одном из видео(http://www.youtube.com/watch?v=QE6yhvqRlwg) <?php define('DEBUG', 1); $order = mysql_query("SELECT * FROM pc_price") or die(DEBUG ? __FILE__ . '/' . __LINE__ . '/' . mysql_error() : 'Извините, ошибка'); while ($row = mysql_fetch_assoc($order)) { $html = "<div class='col-xs-6 col-md-4 proba2'> <p>Название услуги: $row[name_pc_price]</p> <p>Минимальная цена: $row[min_pc_price]</p> <p>Максимальная цена: $row[max_pc_price]</p> <form action='handler/pc_smeta.php' method='POST' name='in_work'> <label>Фактическая цена</label> <input type='text' name='fact_price' id='fact_price$row[id_pc_price]'> <input type='submit' name='in_w' value='Добавить в смету' id='$row[id_pc_price]'> </form> </div>"; echo $html; } // Конец while ?> <script> $(function(){ $('#<?php echo $row[id_pc_price]?>').click(function { var item = $('#fact_price<?php echo $row[id_pc_price]?>').val(); alert(item); //$.cookie('item', item); return false; }); // Конец submit }); // Конец function </script> Но, во-первых, это какая-то порнография, понимаю, что это должно решаться по-другом, а во-вторых, в выборку ничего не заносится. |
Предупреждаю - мультиков смотреть я не буду, не хватало еще ради ответа смотреть сериалы. )
$('#<?php echo $row[id_pc_price]?>') - это конечно порнография, но вы не ответили на главный вопрос - что надо просчитать? Если у вас несколько форм но с одним полем в них, ну просчитали вы сумму этих полей, и что это дает? Отправляться серверу ведь может только одна форма, то есть пользователь может выбрать одно из ... Может все таки одна форма, а в ней несколько полей fact_price сумму которых и надо вычислить? |
Вот, например, есть 3 таких блока.
Пользователь в первом блоке пишет - 450 Во втором - 260 В третье - 500 В базу должно заноситься так: Услуга 1 - 450 Услуга 2 - 260 Услуга 3 - 500 Я думаю, что это все сначала должно заноситься или в сессию, или куки, а после этого заноситься в базу. Или заноситься в отдельное поле input, в отдельную форму, а после этого заноситься в базу. ![]() |
Если:
Пользователь в первом блоке пишет - 450 Во втором - 260 В третье - 500 то это означает выбор нескольких из множества, и значит форма должна быть одна, а не несколько с одним полем в каждой. Разве можно в нескольких формах написать и отправить их одновременно? То есть РНР сценарий совсем не ту html-структуру выдает. Таблица должна быть вложена в форму, ячейки таблицы должны содержать поля формы (а данном случае три), кнопка "Добавить в смету" должна быть одна. Имя поля формы должно отражать принадлежность поля к массиву, то есть: <input type="text" name="fact_price[id_pc_price]"> Атрибут id полям формы совсем не нужен, имя "in_w" у кнопки submit нужно только в том случае, если price.php кроме POST данных этой формы принимает и обрабатывает еще и другие POST данные и их селекция включает и проверку этого имени. Иначе имя совсем не нужно, и кнопку на сервер отправлять не надо. Заносить в сессию или в куки, а только потом в базу... Не знаю, все зависит от задач, может и надо, а может и пустое занятие, мне трудно об этом судить не зная многого. Как бы ни было, сервер получит массив вида: Код:
fact_price ( if($fact = array_diff(array_map('intval', $_POST['fact_price']), array(0))) { //действия с данным, например сумма на сервере, если нужна: $sum = array_sum($fact); //требуется проверка и ключей полученного массива $fact, //если только запись не подготовленными запросами PDO } else { //ничего не выбрано } То есть на серверной стороне все просто и удобно, на клиентской тоже нет сложностей: <html> <head> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script> <script> $(function() { var o = $('#price').find('input[name^="fact"]').keyup(function() { var m = 0; this.value = this.value.replace(/\D/, ''); for(var i=0, k=o.length; i<k; i++) m += o[i].value * 1; $('#total').text(m) }) }); </script> </head> <body> <form id="price"> <input name="fact_price[25]" /> <input name="fact_price[123]" /> <input name="fact_price[46]" /> <input type="submit" /> </form> <span id="total"></span> </body> </html> Примечание: пример подразумевает, что форма присутствует на странице, иначе нужно не так назначать обработчик события полей. |
Спасибо большое! Пошел учить и разбираться! Огромное спасибо!
|
Извините, что опять обращаюсь( Не ругайтесь, я только учусь)
В базу все заносится, все нормально, но javascript не срабатывает <?php $smet = mysql_query("SELECT id_pc_price, name_pc_price, min_pc_price, max_pc_price FROM pc_price") or die(mysql_error()); $table = "<table class='table'><form id='price' method='POST' action='handler/pc_smeta.php'> <thead> <tr> <th>Наименование</th> <th>Рекомендуемая цена</th> <th>Фактическая цена цена</th> </tr> </thead> "; while ($smeta = mysql_fetch_array($smet)) { $table .= "<tr> <td>$smeta[name_pc_price]</td> <td>$smeta[min_pc_price]-$smeta[max_pc_price]</td> <td><input type='text' name='fact_price[$smeta[id_pc_price]]'></td> </tr> "; } $table .="<input type='submit' name='pc_smeta' /></form><span id='total'></span></table>"; echo $table; ?> <script> $(function() { var o = $('#price').find('input[name^="fact"]').keyup(function() { var m = 0; this.value = this.value.replace(/\D/, ''); for(var i=0, k=o.length; i<k; i++) m += o[i].value * 1; $('#total').text(m) }) }); </script> |
Часовой пояс GMT +3, время: 11:13. |