0

IDの有無に応じてINSERTまたはUPDATEクエリが送信されるフォームページがあります(IDがある場合は、レコードを取得してフォームに事前入力するために使用されます)。いずれの場合も、処理はform.phpで行われるため、フォームのアクション自体は(action="/form.php">)です。私の問題は、form.phpが送信後にリロードすると、URLのIDが空になるため、ページが「UPDATE」モードではなく「INSERT」モードになることです。これを解決するためのベストプラクティスの方法は何ですか?

  1. これにどの演算子/条件を追加する必要がありますか'if'..。

    if (isset($_GET['ID']) && is_numeric($_GET['ID'])) {

...送信後の空のIDURLを含める(つまりform.php?ID=

また、

  1. `$ newID = mysql_insert_id(); 1をフォームのアクションに渡すにはどうすればよいですか?(私はここで成功せずにいくつかのバリエーションを試しました)

    $newID = mysql_insert_id(); ... [ をちょきちょきと切る ] ... <form method="post" action="/html/form.php?ID=<?php echo $newID; ?>">

私は隠された入力とセッションについて読んでいますが、この問題を解決するためにどちらを使用するかはまだはっきりしていません。最後に、フォームページをリロードする必要は絶対にないので、フォーム処理/データベースクエリを別のページ(たとえば、process.php)に移動して、単純化することをお勧めします。これについて何か意見はありますか?ベスト/一般的な方法は何ですか?

よろしくお願いします。

svs

4

2 に答える 2

1

一般的な方法は、データの投稿とデータの表示を分離しておくことです。これにより、ユーザーがページに最初に到着したときに誤って追加したり、ユーザーが更新を押した場合に誤って二重投稿したりするのを防ぐことができます。

さらに、ロジックを分離しておくと、コードが読みやすくなり、将来的に保守しやすくなります。

おそらく探すべきアプローチは次のとおりです。

view.php?ID=<record to view> // Only displays a record already in the DB
add.php                      // The add record form with action="process_add.php"
process_add.php?Field1=<>&Field2=<>... // Receives data from add.php, puts it in
                                       // the database and then forwards back to
                                       // view.php or add.php as you see fit.

編集:私はprocess_add.phpにGET引数を持っていますが、それらは渡されていることを示すためだけにあります。それらは、実際の実装でPOST引数として送信する必要があります。

于 2011-09-29T17:47:45.137 に答える
1

テンプレートを使用したコードの例を次に示します。
IDを渡すという考えに基づいた動作中のCRUDアプリケーション

しかし、なぜ新しく生成されたIDを渡す必要があるのでしょうか。

<?  
mysql_connect(); 
mysql_select_db("new"); 
$table = "test"; 
if($_SERVER['REQUEST_METHOD']=='POST') { //form handler part: 
  $name = mysql_real_escape_string($_POST['name']); 
  if ($id = intval($_POST['id'])) { 
    $query="UPDATE $table SET name='$name' WHERE id=$id"; 
  } else { 
    $query="INSERT INTO $table SET name='$name'"; 
  } 
  mysql_query($query) or trigger_error(mysql_error()." in ".$query); 
  header("Location: http://".$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']);  
  exit;  
}  
if (!isset($_GET['id'])) { //listing part: 
  $LIST=array(); 
  $query="SELECT * FROM $table";  
  $res=mysql_query($query); 
  while($row=mysql_fetch_assoc($res)) $LIST[]=$row; 
  include 'list.php'; 
} else { // form displaying part: 
  if ($id=intval($_GET['id'])) { 
    $query="SELECT * FROM $table WHERE id=$id";  
    $res=mysql_query($query); 
    $row=mysql_fetch_assoc($res); 
    foreach ($row as $k => $v) $row[$k]=htmlspecialchars($v); 
  } else { 
    $row['name']=''; 
    $row['id']=0; 
  } 
  include 'form.php'; 
}  
?>

テンプレート:
form.php

<? include TPL_TOP ?>
<form method="POST">
<input type="text" name="name" value="<?=$row['name']?>"><br>
<input type="hidden" name="id" value="<?=$row['id']?>">
<input type="submit"><br>
<a href="?">Return to the list</a>
</form>
<? include TPL_BOTTOM ?>

および list.php:

<? include TPL_TOP ?>
<a href="?id=0">Add item</a>
<? foreach ($LIST as $row): ?>
<li><a href="?id=<?=$row['id']?>"><?=$row['name']?></a>
<? endforeach ?>
<? include TPL_BOTTOM ?>
于 2011-09-29T18:28:17.997 に答える