2011-06-10 50 views
1

這是我的超級簡化的index.php: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,所以代碼更乾淨)。 ,但它不會工作,因爲我有doAddDeleteRecord()函數中的POST - 的所有表單處理邏輯,所以如果我設置我的表格action="DeleteOrAdd.php" 它將不起作用。

是否有可能做類似form action="DeleteOrAdd.php:doAddDeleteRecord()

我不想把它放在課堂上。 我也想保持我的index.php正如上面 - 調用函數,並沒有主要的 以上的內聯代碼。

任何想法?

最初,所有的代碼是在線內的index.php (從PHP書的樣品得到了它),然後我分了代碼到NetBeans項目 邏輯命名PHP文件把它清理乾淨,並把在從index.php調用的函數中的東西。

回答

0

前言:既然你說這是一個學習練習,那麼我將跳過關於最佳實踐和OOP的許多和各種各樣美德的宣言。 ;)您的書可能會詳細介紹每一個可怕的警告/嚴厲的講座,我通常會預先解決這樣的解決方案。

是否有可能像做 形式 行動=「DeleteOrAdd.php:?doAddDeleteRecord()

總之,是爲了達成目的的最簡單方法是隻需在您的表單操作中引用您的文件即可:

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

然後在DeleteOrAdd.php中,通過testin觸發您的函數摹表單提交$ _ 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. 捕獲所述值,以便您可以對其執行/顯示它/否則顯示您自己,

    a。發生了一些事情 - 理想情況下,
    b。那是什麼東西。

否則,你所得到的只是含糊不清:沒有任何跡象表明它正在工作或打破(不拋出錯誤,警告等)。沮喪地調試,至少可以說。

所以,這表示 - 假設你有你的函數返回的東西(成功返回真,字符串的消息,等等),它可能是這樣的:

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。 :)

2

從表單中完整地刪除動作值,默認情況下它會始終回到它所顯示的網址。

<form action="" method="POST"> 
+0

但不會得到處理表單處理的函數調用 - 表單處理代碼在函數doAddDeleteRecord()中 - 這就是問題所在。我知道如何重新發布到同一個文件 - 它只是處理POST'd表單的代碼在一個函數內,如果我只是將表單發佈到文件中,該函數將不會被調用。 – wantTheBest 2011-06-10 05:52:38

+0

你不能直接發佈到一個函數。如Shakti Singh所示,您必須對錶單數據做出反應。 – Rufinus 2011-06-10 05:57:45

+0

恩,所以你推薦他使用無效標記?它回帖的唯一原因是因爲瀏覽器識別出無效標記並進行補償。 action屬性是REQUIRED,因此他的標記不會在未使用的情況下進行驗證。這是我見過的最差的答案,不知道爲什麼有人投票贊成。 – 2011-06-10 06:22:15

1

您的應用程序結構不好。我會建議遵循MVC模式。

但對於當前的問題,你可以做這樣的事情

只是動作設置爲您<form action="DeleteOrAdd.php"或者你可以離開的動作完全空白,其張貼在其中創建形式相同的文件數據。

表格發佈後,您可以在DeleteOrAdd.php文件中執行以下操作。

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

但在這種情況下,你可能需要更改的代碼的index.php

+0

謝謝 - 我會試試。我討厭這個結構,最終會轉向MVC,但我是一個初學者,我很少從小挑戰 - 寶寶步驟就是我如何描述它。我仍然在嘗試習慣'鬆散類型'和一大類其他的東西 - 謝謝。 – wantTheBest 2011-06-10 06:04:06

1

我認爲你有問題就在這裏是能夠讓無論是否其新的負載或在你的PHP頁面辨別無論它是否提交表單,這就是爲什麼將索引頁面合併到您的操作參數中的原因。但是,這不是必需的。

將提交元素的id和名稱(用於有效標記)屬性設置爲唯一名稱。比如「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; 
    } 

希望這有助於! :)