2017-08-15 10 views
1

私は多くの行を持つフォームを持っています。私は、更新したい各行のチェックボックスをチェックすることで、ユーザーが選択した行を更新できるようにします。フォームから選択した行をチェックボックスで更新 - 間違った行のデータが追加されました

このコードは1行の更新で確実に動作しますが、複数の行が選択された場合、更新されるデータは関連する行からのものではありません。つまり、チェックボックスがチェックされている行だけが更新されますが、チェックされた行が複数ある場合は、正しい行からの値ではありません。ここで

は、関連するフォーム要素です:

<tr class='job-row recent<?php echo $editRecent; ?>'> 
         <td class="jobnr-cell table-tooltip"><input type="checkbox" value="<?php echo $row['jobnr']; ?>" name="editCheck[]"/><input id='hiddenCheck' type='hidden' value='0' name='editCheck[]'> <a href='editOpg.php?jobnr=<?php echo $row['jobnr']; ?>&month=<?php echo $monthno; ?>&plx=<?php echo urlencode($plx); ?>'><?php echo $row['jobnr']; ?></a><span class="table-tooltiptext"><?php echo $projekt; ?></span></td> 
         <input type="hidden" name="jobnr[]" value="<?php echo $row['jobnr']; ?>"> 
         <td class="job-cell name-cell"><?php echo $knshort; ?></td> 
         <!-- <td><?php echo $projekt; ?></td> --> 
         <td class="job-cell name-cell"><?php echo $kundeansvarlig; ?></td> 
         <!-- <td class="job-cell name-cell"><a href='editJobs.php?plx=<?php echo urlencode($row['projektleder']); ?>'><?php echo $projektleder; ?></a></td> --> 
         <td class="job-cell"><div class="UI_cell"><input type="text" class="UI_input" name="tilbudspris" id="tilbudspris<?php echo $row['jobnr']; ?>" value="<?php echo $row['tilbudspris']; ?>" readonly> kr.</div></td> 
         <input type="hidden" class="UI_input" name="via0" id="via0<?php echo $row['jobnr']; ?>" value="<?php echo $row['via0']; ?>" readonly> 
         <td class="job-cell via-tooltip UI_cell"> 
         <input type="text" class="UI_input border-top" name="bookedMonth" id="bookedMonth<?php echo $row['jobnr']; ?>" value="<?php echo $bookedMonth; ?>" readonly> kr. 
         <span class="via-tooltiptext"><?php echo $row['viadd']; ?> kr. - <?php echo $row['viadd']; ?> kr.</span></td> 
         <td class="job-cell UI_edit"><div class="UI_cell"><input type="text" class="UI_input UI_edit" name="forbrug[]" id="forbrug<?php echo $row['jobnr']; ?>" value="<?php echo $row['UI_forbrug']; ?>"> kr.</div></td> 
         <td class="job-cell UI_edit"><div class="UI_cell"><input type="text" class="UI_input UI_edit" name="rekvisitioner[]" id="rekvisitioner<?php echo $row['jobnr']; ?>" value="<?php echo $row['UI_rekvisitioner']; ?>"> kr.</div></td> 
         <td class="job-cell via-tooltip UI_cell"><input type="text" class="UI_input" name="forvEXreg" id="forvEXreg<?php echo $row['jobnr']; ?>" value="<?php echo $forvEXreg; ?>" readonly> kr. 
         <span class="forv-tooltiptext"><input type="text" class="UI_input" name="restValTilbud" id="restValTilbud<?php echo $row['jobnr']; ?>" value="<?php echo $restValTilbud; ?>" readonly> kr.</span></td> 
         <td class="job-cell"><div class="UI_cell"><?php echo $row['reguleringer']; ?> kr.</div></td> 
         <td class="job-cell UI_edit"><div class="UI_cell"><input type="text" class="UI_input UI_edit" name="reguleringer[]" id="reguleringer<?php echo $row['jobnr']; ?>" value="<?php echo $row['UI_reguleringer']; ?>"> kr.</div></td> 
         <td class="job-cell"><div class="UI_cell"><input type="text" class="UI_input" name="forvINCreg" id="forvINCreg<?php echo $row['jobnr']; ?>" value="<?php echo $forvINCreg; ?>" readonly> kr.</div></td> 
         <td class="job-cell"><div class="UI_cell"><input type="text" class="UI_input" name="forecast" id="forecast<?php echo $row['jobnr']; ?>" value="<?php echo $forecast; ?>" readonly> kr.</div></td> 
         <td class="job-cell"><div class="UI_cell"><input type="text" class="UI_input" name="restValNextMonths" id="restValNextMonths<?php echo $row['jobnr']; ?>" value="<?php echo $restValNextMonths; ?>" readonly> kr.</div></td> 
         <td class="job-cell UI_edit"><div class="UI_cell"><input type="text" class="UI_input UI_edit" name="forecast2[]" id="forecast2<?php echo $row['jobnr']; ?>" value="<?php echo $row['UI_forecast2']; ?>"> kr.</div></td> 
        </tr> 

そして、ここでは、私はそれを処理する方法である:隠された入力を有するない点はありません

$monthno = $_GET['month']; 
$weekno = $_GET['week']; 
$yearno = $_GET['year']; 
$editCheck = $_POST['editCheck']; 
$jobnr = $_POST['jobnr']; 
$forbrug = $_POST['forbrug']; 
$rekvisitioner = $_POST['rekvisitioner']; 
$reguleringer = $_POST['reguleringer']; 
$forecast2 = $_POST['forecast2']; 

$chkcount = count($jobnr); 
for($i=0; $i<$chkcount; $i++) 
{ 
$con->query("UPDATE jobs SET UI_forbrug='$forbrug[$i]', UI_rekvisitioner='$rekvisitioner[$i]', UI_reguleringer='$reguleringer[$i]', UI_forecast2='$forecast2[$i]', edate = NOW() WHERE monthno = $monthno AND jobnr=".$editCheck[$i]); 
} 
+0

こんにちは。まず、SQLインジェクションとそれを防ぐためのhwoについて学んでください。あなたのコードは本当に脆弱で、安全ではありません!あなたのデータベースは、深い知識を必要とせずに数秒でハッキングされる可能性があります。 SQLインジェクションとそれらのプリペアドステートメントによる防止方法の詳細については、http://bobby-tables.comを参照してください。 – Twinfriends

+0

また、HTMLコードを掲載してください。 – Twinfriends

+0

投稿されたHTMLコードです。 –

答えて

0

、ちょうどチェックボックス入力要素は以下のようになり良い。ここでは、入力のテキストの行に対応するのチェックボックスの入力が関連付けられていないため、正しい行(チェックされたチェックボックスに対応)が正しく更新されません。

を変更し、以下の方法でごテキスト input要素のname属性、

  • name="forbrug[]"name="forbrug[<?php echo $row['jobnr']; ?>]"
  • name="rekvisitioner[]"name="reguleringer[<?php echo $row['jobnr']; ?>]"から
  • name="reguleringer[]"name="rekvisitioner[<?php echo $row['jobnr']; ?>]"へと
  • name="forecast2[]"name="forecast2[<?php echo $row['jobnr']; ?>]"

そして、フォームの送信後、次の方法で確認された行を更新し、あなたの参考のために

// your code 
$chkcount = count($editCheck); 
for($i=0; $i < $chkcount; $i++){  
    $con->query("UPDATE jobs SET UI_forbrug='".$forbrug[$editCheck[$i]]."', UI_rekvisitioner='".$rekvisitioner[$editCheck[$i]]."', UI_reguleringer='".$reguleringer[$editCheck[$i]]."', UI_forecast2='".$forecast2[$editCheck[$i]]."', edate = NOW() WHERE monthno = $monthno AND jobnr = ".$editCheck[$i]); 
} 

、これは更新クエリです:

"UPDATE jobs 
SET UI_forbrug='".$forbrug[$editCheck[$i]]."', 
UI_rekvisitioner='".$rekvisitioner[$editCheck[$i]]."', 
UI_reguleringer='".$reguleringer[$editCheck[$i]]."', 
UI_forecast2='".$forecast2[$editCheck[$i]]."', 
edate = NOW() 
WHERE monthno = $monthno AND jobnr = ".$editCheck[$i] 

追記:はこちら約prepared statementあなたのクエリはSQLインジェクション攻撃を受ける可能性があるためです。また、how you can prevent SQL injection in PHPを参照してください。

+0

Rajdeepに感謝します。しかし、これは、選択したすべての行(選択範囲外の行の値)で同じ値で更新する効果がありました。 –

+0

@MadsStenbjerreここにはいくつかの未知のものがあります。ループ全体の中で ' ... '全体がありますか?この隠された入力要素の目的は何ですか? ''?更新するときに同じ値を表示する列はどれですか? –

+0

はい、全体がループ内です:while($ row = $ query-> fetch_assoc()){ ...}です。 hiddenの目的は、editCheck要素が確実に投稿されるようにすることです(ただし、コードを試したときに削除しました)。更新される列は、予期された列と正しい行です。選択された列のみです。 –

関連する問題