За последние 24 часа нас посетили 51896 программистов и 1715 роботов. Сейчас ищут 820 программистов ...

Не разделять или разделять в отдельные файлы

Тема в разделе "PHP для новичков", создана пользователем uvlad, 5 июл 2009.

  1. uvlad

    uvlad Активный пользователь

    С нами с:
    5 июл 2009
    Сообщения:
    4
    Симпатии:
    0
    Адрес:
    Латвия
    Есть форма (например такая как показана ниже) через которую я добавляю данные в файл и так же через нее я решил редактировать (index.php?edit) эти же данные из файла, но если включить все сообщения об ошибках (error_reporting(E_ALL)), то когда я вызываю форму для добавления (index.php?add), то само собой показывает, что переменные "field1, field2 и id" не определенны, это паранойя или же надо что-то предпринимать ?

    Например раскинуть в отдельные файлы форму добавления и форму редактирование или еще чего-то можете посоветовать


    HTML:
    1. <table width="678" cellpadding="0" cellspacing="3">
    2. <form action="index.php" method="post">
    3. <tr>
    4. <td>Поле 1: </td><td><input type="text" name="field_1" value="'.$field1.'"></td>
    5. </tr>
    6. <tr>
    7. <td>Поле 2: </td><td><input type="text" name="field_2" value="'.$field2.'"></td>
    8. </tr>
    9. <tr>
    10. <td align="right">
    11. <input type="hidden" name="fid" value="'.$id.'">
    12. <input type="image" src="img/apply.png" name="do" value="Сделай это !"></td>
    13. </tr>
    14. </form>
     
  2. Ti

    Ti Активный пользователь

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    PHP:
    1. <?
    2. foreach (array('field1', 'field2', 'id') as $key) {
    3.     $$key = isset($_POST[$key]) ? htmlspecialchars($_POST[$key]) : '';
    4. }
     
  3. uvlad

    uvlad Активный пользователь

    С нами с:
    5 июл 2009
    Сообщения:
    4
    Симпатии:
    0
    Адрес:
    Латвия
    Так, я походу что-то не так обьяснил или я не понял, что делает выше написанный код ) мои данные для редактирование достаются из файла, я не передаю их методом POST в форму, чтобы редактировать, я например счелкаю по ссылке "index.php?edit&fid=1" , и уже дальше выполняется (внутри)

    PHP:
    1. if(isset($_GET['edit']) && (isset($_GET['fid']) && !empty($_GET['fid'])))
    2. {
    3.  
    4. До этого сработала функция, которая открывает файл и считывания все строчки в массив (строчки в файле выглядят field|field|field| и т.д.)
    5.  
    6. сравниваю "fid" с номером ключа массива (т.е. строкой в файле) и делаю действия для разделения строчки и определения переменных И вот эти переменные как раз выступают в value [html]<input type="text" name="field_2" value="'.$field2.'">[/html]
    7.  
    8. }
    В файле index.php сделан include на другой файл (main.php), где определены функции и действия на _GET и _POST. После редактирование или добавления данные обрабатываются и записываются разными функциями, взамисимости от дейстивия.

    В файла main.php (примерно)

    PHP:
    1. if(isset($_POST['do']))
    2. {
    3.     if(isset($_POST['field']) && !empty($_POST['field']))
    4.     {
    5.         $field = trim(htmlspecialchars(stripslashes($_POST['field'])));
    6.         $filed2 = (empty($_POST['field2']) ? "-" : trim(htmlspecialchars(stripslashes($_POST['field']))));
    7.  
    8.         ...
    9.  
    10.         if(isset($_POST['fid']) && !empty($_POST['fid']))
    11.         {
    12.             $fid = intval($_POST['fid']);
    13.             editFunc($fid, $str);
    14.         }
    15.         else
    16.             addFunc($str);
    17.  
    18.     }
    19. }
    Понятно, что если я смотрю форму, не для редактирования, а для добавления, то переменные не определенны. И при максимально включенном уровне вывода ошибок показывает ошибки (Notice: Undefined variable: field in), я понимаю что этот уровень ошибок обычно отключен, но в этом и есть вопрос стоит ли беспокоиться или это обычная дело в такой ситуации.
     
  4. uvlad

    uvlad Активный пользователь

    С нами с:
    5 июл 2009
    Сообщения:
    4
    Симпатии:
    0
    Адрес:
    Латвия
    Чтобы было более наглядно как это есть, я сделал сокращенный вариант

    index.php
    HTML:
    1. <?php
    2. include('main.php');
    3. ?>
    4. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
    5. <meta http-equiv="Content-Type" content="text/html; charset=cp1251">
    6. </head>
    7. <div><p>
    8. <a href="index.php">Главная страница</a> /
    9. <a href="index.php?showall">Показать всё</a> /
    10. <a href="index.php?add">Добавить</a> /
    11. <a href="index.php?edit&fid=1">Редактировать 1</a> /
    12. <a href="index.php?edit&fid=2">Редактировать 2</a> /
    13. <a href="index.php?edit&fid=3">Редактировать 3</a>
    14. </p></div>
    15. <?php
    16. if(isset($_GET['add']) || isset($_GET['edit']))
    17. {
    18.  
    19. $HTML = '<table width="300" cellpadding="0" cellspacing="3" border="0">
    20. <form action="index.php" method="post">
    21. <tr><td><b>Поле 1: </b></td><td><input type="text" name="field_1" value="'.$field1.'"></td></tr>
    22. <tr><td><b>Поле 2: </b></td><td><select name="field_2">';
    23.  
    24. foreach($fld as $k => $v)
    25. {
    26.     $selected = (($k == $field2) ? ' selected ' : NULL);
    27.     $HTML.= '<option value="'.$k.'"'.$selected.'>'.$v.'</option>'."\n";
    28. }
    29.  
    30. $HTML.= '</select></td>
    31. </tr>
    32. <tr><td><b>Поле 3: </b></td><td><input type="text" name="field_3" value="'.$field3.'"></td></tr>
    33.  
    34. <tr><td colspan="2"><input type="hidden" name="fid" value="'.$id.'">
    35. <input type="submit" name="do" value="Подтвердить" style="margin-right: 30px;"></td></tr>
    36. </form></table>';
    37.  
    38. print $HTML;
    39.  
    40. } elseif(isset($_GET['showall'])) { ?>
    41. <p>Показать всё</p>
    42. <?php } else { ?>
    43. <p>Еще что-то</p>
    44. <?php } ?>
    45. </body>
    46. </html>
    main.php
    PHP:
    1. <?php
    2.  
    3. //Список возможных языков
    4. $fld = array("RU" => "Русский", "EN" => "Английский", "LV" => "Латышский", "OT" => "Другой");
    5.  
    6. //Открытие в файл
    7. function openFunc()
    8. {
    9.     global $line;
    10.  
    11.     $hdl = file("db.dat"); //Файл нужно создать руками
    12.     $size = sizeof($hdl);
    13.  
    14.     if($size != NULL)
    15.     {      
    16.         for($i=0; $i<$size; $i++)
    17.             $line[$i+1] = $hdl[$i];
    18.     }
    19. }
    20.  
    21. //Добавление в файл
    22. function addFunc($input)
    23. {
    24.     global $line;
    25.  
    26.     if(!empty($line))
    27.     {
    28.         /* по дальнейшим моим планам, мне удобнее считывать новые данные с начала файла,
    29.         поэтому новые данные подставляются в начало массива и затем массив записывается в файл */
    30.         array_unshift($line, $input."\n");
    31.         $input = $line;
    32.     }
    33.  
    34.     if(is_writable("db.dat"))
    35.         file_put_contents("db.dat", $input, LOCK_EX);
    36. }
    37.  
    38. function editFunc($id, $input)
    39. {
    40.     echo 'Что-то меняется в файле'; //эту функцию не описывал, она сдесь и не требуется
    41. }
    42.  
    43. //Подключение файла
    44. openFunc();
    45.  
    46. if(isset($_POST['do']))
    47. {
    48.     if(isset($_POST['field_1']) && !empty($_POST['field_1']))
    49.     {
    50.         $pole1 = trim(htmlspecialchars(stripslashes($_POST['field_1'])));
    51.         $pole2 = htmlspecialchars($_POST['field_2']);
    52.         $pole3 = (empty($_POST['field_3']) ? "-" : trim(htmlspecialchars(stripslashes($_POST['field_3']))));
    53.  
    54.         //Сбор всех данных в одну строку, так они будут выглядить в файле
    55.         $str = str_replace("\r\n", "", $pole1."|".$pole2."|".$pole3);
    56.  
    57.         if(isset($_POST['fid']) && !empty($_POST['fid']))
    58.         {
    59.             $fid = intval($_POST['fid']);
    60.             editFunc($fid, $str);
    61.         }
    62.         else
    63.             addFunc($str);
    64.     }
    65. }
    66.  
    67. if(isset($_GET['edit']) && (isset($_GET['fid']) && !empty($_GET['fid'])))
    68. {
    69.     $id = $_GET['fid'];
    70.    
    71.     //$var = explode("|", $line[$id]); //1 вариант
    72.     list($field1, $field2, $field3) = explode("|", $line[$id]); //2 вариант
    73. }
    74.  
    75. ?>
    Ну и сразу по ходу дела, задам еще один вопрос

    1. На сколько приемлимо использовать функцию list при работе с файлами или лучше обходится просто массивами ? (1 вариант - var[0] - field1 , var[1] - field2, var[2] - field3)
     
  5. antonn

    antonn Активный пользователь

    С нами с:
    10 июн 2007
    Сообщения:
    2.996
    Симпатии:
    0
    Я всегда разделяю скрипты вывода и скрипты редактирования (отправки/приема данных).
    Как минимум нет костылей с обновлением страницы после отправки и повторной отправки полей.
     
  6. Fduch

    Fduch Активный пользователь

    С нами с:
    1 июл 2009
    Сообщения:
    140
    Симпатии:
    0
    я наоборот н еразделяю :)
    после успешной обработки делаю header("location... что исключает повторную отправку.
    а в случае ошибочного ввода - позволяю пользователю изменить введенные данные и не потерять то что он уже набрал...
     
  7. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    Fduch
    ыч, я тоже так делаю. Одна точка входа: index.php (+ admin.php для админки;))