17.03.2015, 22:03
|
Аспирант
|
|
Регистрация: 21.02.2015
Сообщений: 37
|
|
Обработка неизвестного количества 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 поля.
Извините, если коряво описал проблему.
|
|
18.03.2015, 04:43
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
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 тоже полный швах, но сперва наведите порядок в серверной части.
|
|
18.03.2015, 20:16
|
Аспирант
|
|
Регистрация: 21.02.2015
Сообщений: 37
|
|
Решил переделать код, вот так получилось. Только все равно не пойму, как 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
?>
|
|
18.03.2015, 20:46
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
Не волнуйтесь за способности клиента, сможет он просчитать, вот только что?
Сначала у вас была ошибка в том, что серверный скрипт формировал некорректный 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; //а это после цикла
|
|
18.03.2015, 23:38
|
Аспирант
|
|
Регистрация: 21.02.2015
Сообщений: 37
|
|
Я просто пытаюсь сделать что-то наподобие корзины. Из базы выводится название работы, диапазон цены (минимальная и максимальная) и фактическая цена. Пользователь сам вводит фактическую цену. В итоге в базу заносится название работы и цена, которую указал пользователь.
Пытаюсь сделать так, нашел в одном из видео( 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>
Но, во-первых, это какая-то порнография, понимаю, что это должно решаться по-другом, а во-вторых, в выборку ничего не заносится.
|
|
19.03.2015, 00:04
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
Предупреждаю - мультиков смотреть я не буду, не хватало еще ради ответа смотреть сериалы. )
$('#<?php echo $row[id_pc_price]?>') - это конечно порнография, но вы не ответили на главный вопрос - что надо просчитать? Если у вас несколько форм но с одним полем в них, ну просчитали вы сумму этих полей, и что это дает? Отправляться серверу ведь может только одна форма, то есть пользователь может выбрать одно из ...
Может все таки одна форма, а в ней несколько полей fact_price сумму которых и надо вычислить?
|
|
19.03.2015, 00:24
|
Аспирант
|
|
Регистрация: 21.02.2015
Сообщений: 37
|
|
Вот, например, есть 3 таких блока.
Пользователь в первом блоке пишет - 450
Во втором - 260
В третье - 500
В базу должно заноситься так:
Услуга 1 - 450
Услуга 2 - 260
Услуга 3 - 500
Я думаю, что это все сначала должно заноситься или в сессию, или куки, а после этого заноситься в базу.
Или заноситься в отдельное поле input, в отдельную форму, а после этого заноситься в базу.
|
|
19.03.2015, 01:33
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
Если:
Пользователь в первом блоке пишет - 450
Во втором - 260
В третье - 500
то это означает выбор нескольких из множества, и значит форма должна быть одна, а не несколько с одним полем в каждой. Разве можно в нескольких формах написать и отправить их одновременно?
То есть РНР сценарий совсем не ту html-структуру выдает. Таблица должна быть вложена в форму, ячейки таблицы должны содержать поля формы (а данном случае три), кнопка "Добавить в смету" должна быть одна.
Имя поля формы должно отражать принадлежность поля к массиву, то есть:
<input type="text" name="fact_price[id_pc_price]">
Атрибут id полям формы совсем не нужен, имя "in_w" у кнопки submit нужно только в том случае, если price.php кроме POST данных этой формы принимает и обрабатывает еще и другие POST данные и их селекция включает и проверку этого имени. Иначе имя совсем не нужно, и кнопку на сервер отправлять не надо.
Заносить в сессию или в куки, а только потом в базу... Не знаю, все зависит от задач, может и надо, а может и пустое занятие, мне трудно об этом судить не зная многого.
Как бы ни было, сервер получит массив вида:
Код:
|
fact_price (
[25] => 450
[123] => 260
[46] => 500
) |
То есть не 1, 2, 3, а идентификаторы услуг будут его ключами. Остается проверить и выбрать те услуги, которые заполнены:
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>
Примечание: пример подразумевает, что форма присутствует на странице, иначе нужно не так назначать обработчик события полей.
|
|
19.03.2015, 10:46
|
Аспирант
|
|
Регистрация: 21.02.2015
Сообщений: 37
|
|
Спасибо большое! Пошел учить и разбираться! Огромное спасибо!
|
|
19.03.2015, 15:00
|
Аспирант
|
|
Регистрация: 21.02.2015
Сообщений: 37
|
|
Извините, что опять обращаюсь( Не ругайтесь, я только учусь)
В базу все заносится, все нормально, но 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>
|
|
|
|