как передать mysql_insert_id () в $ _POST или в действие формы? - PullRequest
0 голосов
/ 29 сентября 2011

У меня есть страница формы, на которой отправляется запрос INSERT или UPDATE, в зависимости от наличия / отсутствия идентификатора (и когда есть идентификатор, он используется для извлечения записи и предварительного заполнения формы).В любом случае обработка выполняется в form.php, поэтому действие формы выполняется само по себе (action="/form.php">).Моя проблема в том, что когда form.php перезагружает post-submit, URL-адрес имеет пустой идентификатор, поэтому страница переходит в режим «INSERT», а не «UPDATE».Как лучше всего решить эту проблему?

  1. Какой оператор / условие я должен добавить к этому «если» ...

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

... для включения пустого идентификатора URL после отправки (т. Е. form.php?ID=)

ИЛИ

  1. Как передать `$ newID = mysql_insert_id (); 1 к действию формы?(Я попробовал несколько вариантов здесь без успеха)

    $newID = mysql_insert_id(); ... [snip] ... <form method="post" action="/html/form.php?ID=<?php echo $newID; ?>">

I 'Я читаю о скрытых входах и сеансах, но мне пока не ясно, как использовать любой из них для решения этой проблемы.Наконец, поскольку я не обязательно перезагружаю страницу формы, я все чаще испытываю желание переместить запросы обработки формы / db на другую страницу (например, process.php), чтобы, надеюсь, упростить ее;какие-либо мнения по этому поводу?Какова лучшая / распространенная практика?

Заранее большое спасибо,

svs

Ответы [ 2 ]

1 голос
/ 29 сентября 2011

вот пример такого кода с использованием шаблонов.
работающее приложение CRUD, основанное на идее передачи идентификатора

Не знаю, зачем вам передавать только что сгенерированный идентификатор.

<?  
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 ?>
1 голос
/ 29 сентября 2011

Обычной практикой должно быть размещение данных отдельно от отображения данных. Это предотвращает случайные добавления при первом входе пользователя на страницу, а также случайные двойные сообщения, если пользователь нажимает кнопку обновления.

Кроме того, разделение логики делает код более читабельным и поддерживаемым в будущем.

Подход, который вы, вероятно, должны искать:

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.

РЕДАКТИРОВАТЬ : Хотя у меня есть аргументы GET для process_add.php, они только там, чтобы продемонстрировать, что они передаются. Они должны быть отправлены как аргументы POST в фактической реализации.

...