Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 17.03.2015, 22:03
Аспирант
Отправить личное сообщение для Daniel93 Посмотреть профиль Найти все сообщения от Daniel93
 
Регистрация: 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 поля.

Извините, если коряво описал проблему.
Ответить с цитированием
  #2 (permalink)  
Старый 18.03.2015, 04:43
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 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 тоже полный швах, но сперва наведите порядок в серверной части.
Ответить с цитированием
  #3 (permalink)  
Старый 18.03.2015, 20:16
Аспирант
Отправить личное сообщение для Daniel93 Посмотреть профиль Найти все сообщения от Daniel93
 
Регистрация: 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
			?>
Ответить с цитированием
  #4 (permalink)  
Старый 18.03.2015, 20:46
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 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; //а это после цикла
Ответить с цитированием
  #5 (permalink)  
Старый 18.03.2015, 23:38
Аспирант
Отправить личное сообщение для Daniel93 Посмотреть профиль Найти все сообщения от Daniel93
 
Регистрация: 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>


Но, во-первых, это какая-то порнография, понимаю, что это должно решаться по-другом, а во-вторых, в выборку ничего не заносится.
Ответить с цитированием
  #6 (permalink)  
Старый 19.03.2015, 00:04
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Предупреждаю - мультиков смотреть я не буду, не хватало еще ради ответа смотреть сериалы. )

$('#<?php echo $row[id_pc_price]?>') - это конечно порнография, но вы не ответили на главный вопрос - что надо просчитать? Если у вас несколько форм но с одним полем в них, ну просчитали вы сумму этих полей, и что это дает? Отправляться серверу ведь может только одна форма, то есть пользователь может выбрать одно из ...

Может все таки одна форма, а в ней несколько полей fact_price сумму которых и надо вычислить?
Ответить с цитированием
  #7 (permalink)  
Старый 19.03.2015, 00:24
Аспирант
Отправить личное сообщение для Daniel93 Посмотреть профиль Найти все сообщения от Daniel93
 
Регистрация: 21.02.2015
Сообщений: 37

Вот, например, есть 3 таких блока.

Пользователь в первом блоке пишет - 450
Во втором - 260
В третье - 500

В базу должно заноситься так:
Услуга 1 - 450
Услуга 2 - 260
Услуга 3 - 500

Я думаю, что это все сначала должно заноситься или в сессию, или куки, а после этого заноситься в базу.

Или заноситься в отдельное поле input, в отдельную форму, а после этого заноситься в базу.

Ответить с цитированием
  #8 (permalink)  
Старый 19.03.2015, 01:33
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 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>


Примечание: пример подразумевает, что форма присутствует на странице, иначе нужно не так назначать обработчик события полей.
Ответить с цитированием
  #9 (permalink)  
Старый 19.03.2015, 10:46
Аспирант
Отправить личное сообщение для Daniel93 Посмотреть профиль Найти все сообщения от Daniel93
 
Регистрация: 21.02.2015
Сообщений: 37

Спасибо большое! Пошел учить и разбираться! Огромное спасибо!
Ответить с цитированием
  #10 (permalink)  
Старый 19.03.2015, 15:00
Аспирант
Отправить личное сообщение для Daniel93 Посмотреть профиль Найти все сообщения от Daniel93
 
Регистрация: 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>
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
обработка щелчка по button. тонкие различия с input type=button xtfkpi Events/DOM/Window 2 28.01.2015 23:32
Принятие из input данных и обработка в функции AJAX SunDr AJAX и COMET 0 14.11.2014 14:42
Ширина поля input text в зависимости от количества символов rekon87 (X)HTML/CSS 7 14.06.2013 22:55
При добавлении DOCTYPE "плывут" размеры input type=text Demath (X)HTML/CSS 4 08.07.2012 19:27
Обработка нескольких file input Temlekur Работа 8 21.01.2010 18:30