フォーム内に価格と数量を表示する php ファイルがあります。
3 に答える
id
結果の HTML に、同じ要素が複数含まれていてはなりません。1つの方法はこれです:
$counter = 0;
while($queryresult = mysql_fetch_assoc($query)){
echo '<form method ="post" action="price.php">';
echo '<input type="text" name ="quant" id="quant'.$counter.'" onblur="functionprice('.$counter.')" />';
echo '<input type="text" name ="price" id="price'.$counter.'" onblur="functionprice('.$counter.')" />';
echo '<input type="text" name="unitprice" id="unitprice'.$counter.'" readonly="true" />';
echo "</form>";
$counter++;
}//while
そして、次のように、変更したい行番号を指定して、この更新された JavaScript 関数を呼び出します。functionprice(2);
<script type="text/javascript">
function functionprice(counter)
{
var price = parseFloat(document.getElementById("quant"+counter).value);
var quantity = parseFloat(document.getElementById("price"+counter).value);
if (!(price == Number.NaN && quantity == Number.NaN))
document.getElementById("unitprice"+counter).value = Number(price/quantity).toFixed(2);
}
</script>
まず第一に、W3C に準拠していない複数の要素で同じ ID を持つことは悪いことです。おそらくこれが、他のフォーム要素が更新されない理由です。同様に番号を追加して、JavaScriptコードをより適切に制御できるようid
に"quantity_1"
することもできます"quantity_2"
また、それを database の単一の行として扱いたい場合は、上記のコメントに従って使用します。つまり、 name = 'price[]' です。
まず、<form>
while ループの外に設定します。id="" をスキップし、代わりに class="" を使用します。要素の ID は一意でなければならないからです。
<?php
echo '<form method ="post" action="price.php">';
while($queryresult = mysql_fetch_assoc($query)){
$id = $queryresult['id']; //assumption is that id is an autoincremental integer
echo '<input type="text" name ="quant[' . $id . ']" class="quant" onblur="functionprice(' . $id . ')" />'; //Make quant-array (dynamically)
echo '<input type="text" name ="price[' . $id . ']" class="price" onblur="functionprice(' . $id . ')" />'; //Make price-array (dynamically)
echo '<input type="text" name="unitprice[' . $id . ']" id="unitprice" readonly="true" />';
}//while
echo "</form>"
?>//close php tag
?>
次に、このようなことを行います(概念を理解していただければ幸いです)
<script type="text/javascript">
function functionprice(id)
{
var price = parseFloat(document.getElementById ("quant[" + id + "]").value); //Get value of element in quant-array
var quantity = parseFloat(document.getElementById ("price[" + id + "]").value); //Get value of element in price-array
if (!(price == Number.NaN && quantity == Number.NaN))
document.getElementById ("unitprice[" + id + "]").value = Number(price/quantity).toFixed(2);
}
</script>
このようなコード (上記) を作成すると、サーバー側で値を取得するときに (非常に簡単に) 構築された配列を使用できます。これの唯一の欠点は、私が見ているように、大きな結果セット(100.000行を超えるなど)がある場合、配列がサーバーのメモリを「食い尽くす」可能性があることです。
例:
次のように while ループの後に送信ボタンを配置した場合<form>
: ';
while($queryresult = mysql_fetch_assoc($query)){
$id = $queryresult['id']; //assumption is that id is an autoincremental integer
echo '<input type="text" name ="quant[' . $id . ']" class="quant" onblur="functionprice(' . $id . ')" />'; //Make quant-array (dynamically)
echo '<input type="text" name ="price[' . $id . ']" class="price" onblur="functionprice(' . $id . ')" />'; //Make price-array (dynamically)
echo '<input type="text" name="unitprice[' . $id . ']" id="unitprice" readonly="true" />';
}//while
echo "<input type=\"submit\" value=\"Skicka\" />";
echo "</form>"
?>//close php tag
?>
次に、price.php(送信後)で、次のようなことを行って値を取得します:(もちろん検証も行う必要があるため、必要な期待値/配列を取得できます)
<?php
$quantArr = $_POST['quant'];
$priceArr = $_POST['price'];
//echo out a certain row from db (where id = 27)
echo 'quantity: ' . $quantArr[27];
echo 'price: ' . $pricearr[27];
?>