Есть форма (например такая как показана ниже) через которую я добавляю данные в файл и так же через нее я решил редактировать (index.php?edit) эти же данные из файла, но если включить все сообщения об ошибках (error_reporting(E_ALL)), то когда я вызываю форму для добавления (index.php?add), то само собой показывает, что переменные "field1, field2 и id" не определенны, это паранойя или же надо что-то предпринимать ? Например раскинуть в отдельные файлы форму добавления и форму редактирование или еще чего-то можете посоветовать HTML: <table width="678" cellpadding="0" cellspacing="3"> <form action="index.php" method="post"> <tr> <td>Поле 1: </td><td><input type="text" name="field_1" value="'.$field1.'"></td> </tr> <tr> <td>Поле 2: </td><td><input type="text" name="field_2" value="'.$field2.'"></td> </tr> <tr> <td align="right"> <input type="hidden" name="fid" value="'.$id.'"> <input type="image" src="img/apply.png" name="do" value="Сделай это !"></td> </tr> </form> </table>
PHP: <? foreach (array('field1', 'field2', 'id') as $key) { $$key = isset($_POST[$key]) ? htmlspecialchars($_POST[$key]) : ''; }
Так, я походу что-то не так обьяснил или я не понял, что делает выше написанный код ) мои данные для редактирование достаются из файла, я не передаю их методом POST в форму, чтобы редактировать, я например счелкаю по ссылке "index.php?edit&fid=1" , и уже дальше выполняется (внутри) PHP: if(isset($_GET['edit']) && (isset($_GET['fid']) && !empty($_GET['fid']))) { До этого сработала функция, которая открывает файл и считывания все строчки в массив (строчки в файле выглядят field|field|field| и т.д.) сравниваю "fid" с номером ключа массива (т.е. строкой в файле) и делаю действия для разделения строчки и определения переменных И вот эти переменные как раз выступают в value [html]<input type="text" name="field_2" value="'.$field2.'">[/html] } В файле index.php сделан include на другой файл (main.php), где определены функции и действия на _GET и _POST. После редактирование или добавления данные обрабатываются и записываются разными функциями, взамисимости от дейстивия. В файла main.php (примерно) PHP: if(isset($_POST['do'])) { if(isset($_POST['field']) && !empty($_POST['field'])) { $field = trim(htmlspecialchars(stripslashes($_POST['field']))); $filed2 = (empty($_POST['field2']) ? "-" : trim(htmlspecialchars(stripslashes($_POST['field'])))); ... if(isset($_POST['fid']) && !empty($_POST['fid'])) { $fid = intval($_POST['fid']); editFunc($fid, $str); } else addFunc($str); } } Понятно, что если я смотрю форму, не для редактирования, а для добавления, то переменные не определенны. И при максимально включенном уровне вывода ошибок показывает ошибки (Notice: Undefined variable: field in), я понимаю что этот уровень ошибок обычно отключен, но в этом и есть вопрос стоит ли беспокоиться или это обычная дело в такой ситуации.
Чтобы было более наглядно как это есть, я сделал сокращенный вариант index.php HTML: <?php include('main.php'); ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=cp1251"> <title></title> </head> <body> <div><p> <a href="index.php">Главная страница</a> / <a href="index.php?showall">Показать всё</a> / <a href="index.php?add">Добавить</a> / <a href="index.php?edit&fid=1">Редактировать 1</a> / <a href="index.php?edit&fid=2">Редактировать 2</a> / <a href="index.php?edit&fid=3">Редактировать 3</a> </p></div> <?php if(isset($_GET['add']) || isset($_GET['edit'])) { $HTML = '<table width="300" cellpadding="0" cellspacing="3" border="0"> <form action="index.php" method="post"> <tr><td><b>Поле 1: </b></td><td><input type="text" name="field_1" value="'.$field1.'"></td></tr> <tr><td><b>Поле 2: </b></td><td><select name="field_2">'; foreach($fld as $k => $v) { $selected = (($k == $field2) ? ' selected ' : NULL); $HTML.= '<option value="'.$k.'"'.$selected.'>'.$v.'</option>'."\n"; } $HTML.= '</select></td> </tr> <tr><td><b>Поле 3: </b></td><td><input type="text" name="field_3" value="'.$field3.'"></td></tr> <tr><td colspan="2"><input type="hidden" name="fid" value="'.$id.'"> <input type="submit" name="do" value="Подтвердить" style="margin-right: 30px;"></td></tr> </form></table>'; print $HTML; } elseif(isset($_GET['showall'])) { ?> <p>Показать всё</p> <?php } else { ?> <p>Еще что-то</p> <?php } ?> </body> </html> main.php PHP: <?php error_reporting(E_ALL); //Список возможных языков $fld = array("RU" => "Русский", "EN" => "Английский", "LV" => "Латышский", "OT" => "Другой"); //Открытие в файл function openFunc() { global $line; $hdl = file("db.dat"); //Файл нужно создать руками $size = sizeof($hdl); if($size != NULL) { for($i=0; $i<$size; $i++) $line[$i+1] = $hdl[$i]; } } //Добавление в файл function addFunc($input) { global $line; if(!empty($line)) { /* по дальнейшим моим планам, мне удобнее считывать новые данные с начала файла, поэтому новые данные подставляются в начало массива и затем массив записывается в файл */ array_unshift($line, $input."\n"); $input = $line; } if(is_writable("db.dat")) file_put_contents("db.dat", $input, LOCK_EX); } function editFunc($id, $input) { echo 'Что-то меняется в файле'; //эту функцию не описывал, она сдесь и не требуется } //Подключение файла openFunc(); if(isset($_POST['do'])) { if(isset($_POST['field_1']) && !empty($_POST['field_1'])) { $pole1 = trim(htmlspecialchars(stripslashes($_POST['field_1']))); $pole2 = htmlspecialchars($_POST['field_2']); $pole3 = (empty($_POST['field_3']) ? "-" : trim(htmlspecialchars(stripslashes($_POST['field_3'])))); //Сбор всех данных в одну строку, так они будут выглядить в файле $str = str_replace("\r\n", "", $pole1."|".$pole2."|".$pole3); if(isset($_POST['fid']) && !empty($_POST['fid'])) { $fid = intval($_POST['fid']); editFunc($fid, $str); } else addFunc($str); } } if(isset($_GET['edit']) && (isset($_GET['fid']) && !empty($_GET['fid']))) { $id = $_GET['fid']; //$var = explode("|", $line[$id]); //1 вариант list($field1, $field2, $field3) = explode("|", $line[$id]); //2 вариант } ?> Ну и сразу по ходу дела, задам еще один вопрос 1. На сколько приемлимо использовать функцию list при работе с файлами или лучше обходится просто массивами ? (1 вариант - var[0] - field1 , var[1] - field2, var[2] - field3)
Я всегда разделяю скрипты вывода и скрипты редактирования (отправки/приема данных). Как минимум нет костылей с обновлением страницы после отправки и повторной отправки полей.
я наоборот н еразделяю после успешной обработки делаю header("location... что исключает повторную отправку. а в случае ошибочного ввода - позволяю пользователю изменить введенные данные и не потерять то что он уже набрал...