Php и формы проблемы - PullRequest
1 голос
/ 10 июня 2011

Это мой супер-упрощенный index.php:

<?php
    require_once 'DeleteOrAdd.php';  // handles adding/deleting a db record


    doAddDeleteRecord();
    // other functions are called here, left out though for brevity
 ?>

Вот DeleteOrAdd.php (очень упрощенный)

<?php
    function doAddDeleteRecord()
    {
         echo <<<_END
             <form action="index.php" method="post">

                // the other form html not shown here

             <input type="submit" value="ADD RECORD" />
             </form>
_END;        

     // NOT SHOWN -- code to handle the form when it is POST'd

    }
 ?>

Итак, уже поздно 10:30 вечера, я новичок в PHP, хорошо / извините. Не могу понять, как это сделать.

Я хочу изменить form action="index.php" выше на form action="DeleteOrAdd.php" (т.е. я хочу повторно опубликовать в том же файле, в котором находится эта форма, не для index.php, поэтому код чище). но это не сработает, потому что у меня есть вся логика обработки форм для POST - внутри функции doAddDeleteRecord(), поэтому, если я установлю свою форму action="DeleteOrAdd.php" это не сработает.

Можно ли сделать что-то вроде form action="DeleteOrAdd.php:doAddDeleteRecord()?

Я не хочу ставить это на занятиях. Я также хочу сохранить свой index.php таким же, как он есть выше - вызывая функции, а не встроенный код за этим.

Есть идеи?

Первоначально весь код был встроен в index.php (взят из образца книги PHP) и затем я разделил код на логически названные файлы PHP в проекте Netbeans очистить его и поместить в функции, вызываемые из index.php.

Ответы [ 4 ]

2 голосов
/ 10 июня 2011

полностью удаляет значение действия из формы, по умолчанию оно всегда будет публиковаться обратно на URL-адрес, на котором оно отображается.

<form action="" method="POST">
1 голос
/ 10 июня 2011

Я думаю, что проблема, с которой вы здесь столкнулись, заключается в том, чтобы заставить вашу страницу PHP различать, является ли она новой загрузкой или нет или нет ее отправкой формы, и именно поэтому вы включили страницу индекса в свой параметр действия , Однако в этом нет необходимости.

Установите для идентификатора и имени (для допустимой разметки) атрибута вашего элемента submit уникальное имя. Например, "form_submit", вот пример.

<form action="" method="post">

<input type="submit" id="form_submit" name="form_submit" value="ADD RECORD" />

</form>

Итак, что вы вставили в свой PHP-скрипт (doAddorDelete.php), так это ...

 if (array_key_exists('form_submit', $_POST)) {

    //this is the code to execute on form submit
    //use print_r($_POST) to view variables you can use here
    //make sure you validate all data passed here especially if using a database
    //ie if MySQL
    //$validated_userinput = mysql_real_escape_string(strip_tags(htmlentities(trim($_POST['userinput']))), $link_resource); for text
    //(int) $_POST['userinput'];  for numbers


    } else {
         echo <<<_END
                 <form action="" method="post">

                    // the other form html not shown here

                 <input type="submit" id="form_submit" name="form_submit" value="ADD RECORD" />
                 </form>
    _END;
    }

Надеюсь, это поможет! :)

1 голос
/ 10 июня 2011

Ваше приложение плохо структурировано. Я бы рекомендовал следовать шаблону MVC .

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

просто установите действие на <form action="DeleteOrAdd.php" или вы можете оставить действие полностью пустым, чтобы ваши данные помещались в тот же файл, в котором создается форма.

Когда форма будет опубликована, вы можете сделать это ниже в файле DeleteOrAdd.php.

if (isset($_POST['submit']))
{
  doAddDeleteRecord();// this will call your 
}

но в этом случае вам, возможно, придется изменить код вашего index.php

0 голосов
/ 10 июня 2011

Предисловие: Поскольку вы говорите это как учебное упражнение, я пропущу ханжеский манифест о передовой практике и многочисленных и всевозможных достоинствах ООП. ;) Ваша книга, вероятно, подробно описывает каждую страшную / суровую лекцию, которую я в любом случае предпочитаю подобному решению.

Можно ли сделать что-то вроде форма действие = "DeleteOrAdd.php: doAddDeleteRecord ()

Короче говоря, да. Самый простой способ достичь своей цели - просто сослаться на файл в действии формы, как вы это сделали:

<!-- form.php -->
<form action="DeleteOrAdd.php" method="POST">

А затем в DeleteOrAdd.php запустите вашу функцию, протестировав данные $ _POST, которые отправит отправленная вами форма, например:

<?php
// DeleteOrAdd.php

if(isset($_POST['some_form_variable']) && $_POST['some_form_variable'] != null) {
    $data = array();
    foreach($_POST as $post) {
        array_push($data, $post);
    }
    doAddDeleteRecord($data);
}

function doAddDeleteRecord($data) { 
     // ...your processing code, etc.

Результат чисто процедурного подхода, который вы указали, откровенно говоря, вы можете делать подобные вещи. Вы бы не хотели развиваться в реальной жизни (пропуская это глубокое погружение). Я также гарантирую, что ваша книга объясняет почему не в мельчайших подробностях.)

Важное примечание !! Так как я не увидел возвращаемого значения в фрагменте кода, который вы разместили, и вы говорите, что только начинаете, я собираюсь взять минуту и ​​указать на скрытая ловушка здесь на всякий случай:

-> Ваш код может отлично работать с теми шестью строками, которые я добавил над вашей функцией, и вы никогда не узнаете об этом, если вы не

  1. возвращает значение (которое доказывает, что код был запущен, если ничего больше) и
  2. захватывает указанное значение, чтобы вы могли воздействовать на него / отображать его / в противном случае показать себе, что

    а. что-то случилось - и в идеале,
    б. что это было за что-то.

В противном случае все, что у вас есть, - это двусмысленность: нет признаков того, что он работает или ломается (не выдает ошибок, предупреждений и т. Д.). Разочарование в отладке, если не сказать больше.

Итак, сказано: если ваша функция возвращает что-то (истина в случае успеха, строка с сообщением и т. Д.), То это, вероятно, выглядит примерно так:

function doAddDeleteRecord($data) {
    // ... your function code, etc.
    $sql = "INSERT INTO mytable VALUES(".implode(',',$data).")";
    if (mysql_query($sql) == true) { 
        $message = "Record saved";
    } else {
        $message = false;
    }
    return $message;
}

Любое значение, возвращаемое вашей функцией, нуждается в переменной для ее захвата, иначе оно не будет установлено. Захватите его с помощью присваивания переменной при вызове функции doAddDeleteRecord ():

 ... // same 6 little lines of conditional code ...
    }
    $result = doAddDeleteRecord($data);
 }
 // maybe just echo it out or something...
 echo $result;

- или -

  ... // still the same 6 lines ...
     }
     $result = doAddDeleteRecord($data);
  }
  // maybe have a new test based on the outcome of the last one...
  if ($result == false) { 
      // do something about the fail...
  } elseif (is_string($result)) {
      // do something about the success...
  }

Удачи, HTH. :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...