0

1回の送信で複数の更新を達成しようとしています。多数の行を持つテーブルがあり、次の挿入ボックスにタブ移動するだけで、各行の 1 つのフィールドを更新できるようにしたいと考えています。

したがって、私のコードは次のとおりです。- // テーブルを開始する echo ' ';

//start header of table
echo '<tr>

<td width="60" align="center"><strong>Lab Item ID</strong></td>
<td width="60" align="center"><strong>Test Suite Name</strong></td>
<td width="60" align="center"><strong>Test Name</strong></td>
<td width="50" align="center"><strong>Result</strong></td>
</tr>';

//loop through all results
while ($row=mysql_fetch_object($sql)) {
    //print out table contents and add id into an array and email into an array
    echo '<tr>
    <td align="center"><input name="id[]" value='.$row->lab_item_id.' readonly> </td>
    <td align="center">'.$row->test_suite_name.'</td>
    <td align="center">'.$row->test_name.'</td>
    <td><input name="test_result[]" type="text" value="'.$row->test_result.'"></td>
    </tr>';
}

//submit the form

echo'<tr>
<td colspan="3" align="center"><input type="submit" name="Submit" value="Submit"></td>
</tr>
</table>
</form>';
//if form has been pressed proccess it
if($_POST["Submit"])
{

//get data from form
//$name = $_POST['name'];

//$_POST['check_number'] and $_POST['check_date'] are parallel arrays

foreach( $_POST['id'] as $id ) {
     $tresult = trim($_POST['test_result']);
      $query = "UPDATE tbl_lab_item SET test_result='$tresult' WHERE lab_item_id = '$id'";
      //execute query

}  
 print_r($_POST);
 var_dump($tresult);
//redirect user
$_SESSION['success'] = 'Updated';
//header("location:index.php");
}
?>

$_POST 配列を印刷すると、すべてが正常に読み込まれますが、変数は Null です。複数の配列でforeachを実行できないことはわかっています(少なくともできるとは思いません)ので、見逃している他のトリックはありますか?$_Post プリントには適切なデータが含まれているため、遠く離れることはできません。

ちなみに、すべてがクエリによって生成されるため、更新する必要があるレコードの数はわかりません。

この (および他の) フォーラムを見てきましたが、解決策が得られないようです。配列を理解していると思っていましたが、今では不思議に思っています!

編集 - 機能していないのは $tresult 変数です。

どうもありがとう、ジェイソン

編集 2 月 21 日木曜日 (英国時間 05:41) 皆さん、ご意見をお寄せいただきありがとうございます。私は今これを解決しました、そしてあなたの集合的なアドバイスが役に立ちました。最終的にそれをクラックしたコードは次のとおりです:-

//get data from form
$id1 = $_POST['id'];
$test_result1 = $_POST['test_result'];
foreach ($id1 as $key => $value){
$query = "UPDATE tbl_lab_item SET test_result='$test_result1[$key]' WHERE lab_item_id=$value ";
//execute query

どの変数などに入力され、何に入力されたかを調べることが重要でした。最初の原則に戻りますね。

乾杯。J

4

3 に答える 3

1

実際には、より単純な(基本的な)形式のforループを実行することでそれを実行できます。

//get data from form
//$name = $_POST['name'];

//$_POST['check_number'] and $_POST['check_date'] are parallel arrays

$numberOfData = count($_POST['id']);

for($index = 0; $index < $numberOfData; $index++)
{
     $id = $_POST['id'][$index];
     $tresult = trim($_POST['test_result'][$index]);
      $query = "UPDATE tbl_lab_item SET test_result='$tresult' WHERE lab_item_id = '$id'";
       //execute query

}
 print_r($_POST);

これがお役に立てば幸いです。

乾杯

于 2013-02-19T09:17:58.533 に答える
1

次のようにクエリを変更します。

  $query = "UPDATE tbl_lab_item SET test_result=$tresult WHERE lab_item_id = $id";

一重引用符 ' ' を追加することで、is を文字列として読み取り、var の値を取得しないように指示します。

編集

foreach ループを次のように置き換えて、お知らせください。

$id1 = $_POST['id'];
$test_result1 = $_POST['test_result'];

foreach( $id1 as $key => $value ) {
  $query = "UPDATE tbl_lab_item SET test_result='$test_result1[$key]' WHERE lab_item_id = '$key' ";

}   
于 2013-02-19T01:47:53.907 に答える
0

問題は、入力フィールドを配列として構築するように PHP に指示しているが、後でそれを文字列として扱うことです。

<td><input name="test_result[]" type="text" value="'.$row->test_result.'"></td>
                            ^^--- array

 $tresult = trim($_POST['test_result']);
                 ^^^^^^^^^^^^^^^^^^^^^--- no array key, so you're assigning the entire array

  $query = "UPDATE tbl_lab_item SET test_result='$tresult'
                                                ^^^^^^^^^^--- array in string context

trim() は文字列を想定していますが、配列を渡すため、PHPNULLと警告が返されます。その null が SQL ステートメントに詰め込まれ、問題が発生します。

于 2013-02-19T03:32:24.477 に答える