2011-05-15 74 views
3

我正在處理CodeIgniter中的註冊頁面。 問題是,我的發佈數據不通過。下面的代碼總是產生「失敗」:

class Signup extends CI_Controller { 

    function index() 
    {  
     if ($this->input->post()) 
     { 
      echo 'success'; 
     } 
     else 
     { 
      echo 'fail'; 

      echo form_open('signup'); 

      echo form_input('username', 'Username'); 
      echo form_input('email_address', 'Email address'); 
      echo form_submit('submit', 'Create Acccount'); 

      echo form_close(); 
     } 
    } 

} 

可能是什麼問題呢?

爲了使事情更有趣,在我的本地主機上,表單工作得很好。這是在遠程服務器發生故障時。


更新1:按照要求,這是服務器輸出:(我模糊的網址,我不披露下)

<form accept-charset="utf-8" method="post" action="http://www.url.com/signup"> 
<input type="text" value="Username" name="username"> 
<input type="text" value="Email address" name="email_address"> 
<input type="submit" value="Create Account" name="submit"> 
</form> 

更新2:我看到本地主機和遠程服務器之間的另一個行爲差異:在提交表單後刷新(cmd R或F5)頁面時,本地主機上的瀏覽器要求我再次發送表單。遠程服務器上的相同頁面不會從瀏覽器調用該問題,因此看起來像是一些重定向或url問題導致了問題?


更新3:看來,在遠程服務器上,用戶正在被重定向301(永久移動)我仍然不知道在哪裏這個重定向的來源。重定向有效地殺死後數據,所以它解釋了爲什麼post()返回false。

那麼,有誰知道我爲什麼會被301'd?


更新4:我被代替中設置我的BASE_URL爲http://www.url.comhttp://url.com

改變這種後的笨重定向,它解決了這個問題! :)

+0

什麼是$這個 - 定義>輸入 - >後只工作()? – 2011-05-15 10:53:10

+0

@Chris Rasys - 你是什麼意思? – Kriem 2011-05-15 10:54:24

+0

這不能從你展示的片段中回答。安裝Xdebug並逐步完成請求,找出錯誤的位置。在旁註:控制器不應該回聲。 – Gordon 2011-05-15 10:56:39

回答

3

該問題可能是由遠程服務器的301重定向(Location HTTP標頭指令)造成的。如果你使用Firefox,你可以使用插件TamperData檢查。當然,您也可以看看http://www.url.com/signup在請求頁面時是否被重定向。

如果HTTP標頭Locationhttp://url.com/signup(沒有www),那麼最簡單的解決方案是使用http://url.com/signup作爲表單操作。請注意,如果表單位於同一臺服務器上,也可以省略服務器地址。您可以改用/signup

+0

您發現問題了! :D它給了我一個'301 MOVPE永久'。很奇怪。這是爲什麼發生?我有完全相同的代碼,並安裝在本地主機和遠程服務器上運行。 – Kriem 2011-05-15 14:51:26

+0

@Kriem不知道遠程服務器配置,很難說,但我最好的猜測是在httpd.conf或.htaccess文件中重定向。例如,它可以從'http:// www.url.com/signup'到'http:// url.com/signup'。 – AndersTornkvist 2011-05-15 14:54:16

+0

@Kriem你應該看看'Location'標題。將它與請求的URI進行比較。 – AndersTornkvist 2011-05-15 14:56:51

0

我想通過print_r()'$ _POST/$ _ REQUEST superglobals來查看PHP是否看到任何東西。這應該有助於縮小它看看它是一個PHP或CI問題。

+0

$ _REQUEST很好。 $ _POST是空的。 (沒有) – Kriem 2011-05-15 11:33:31

+1

CodeIgniter不會刪除'$ _POST'中的內容嗎? – Jonas 2011-05-15 11:43:16

+0

@Jonas - 我不相信它。 – Kriem 2011-05-15 15:20:17

2

您使用的CI版本是什麼? CI反應器進行了修改$this->input->post()

輸入類方法後()和get() 現在將返回一個完整的數組,如果沒有提供 第一個參數。

我剛剛測試了一個類似的情況;我在本地主機上使用CI反應器,並在我的現場使用預反應器版本,並得到相同的結果。

$ _POST確實包含數據。

$this->input->post()電話_fetch_from_array()

function _fetch_from_array(&$array, $index = '', $xss_clean = FALSE) 
{ 
    if (! isset($array[$index])) 
    { 
     return FALSE; 
    } 

然而,在反應器中,這是不是做:

if ($index === NULL AND ! empty($_POST)) 
    { 
     $post = array(); 

     // Loop through the full _POST array and return it 
     foreach (array_keys($_POST) as $key) 
     { 
      $post[$key] = $this->_fetch_from_array($_POST, $key, $xss_clean); 
     } 
     return $post; 
    } 

所以,你得到預反應器,$this->input->post如果沒有數組傳遞不返回任何東西發佈值,即使您沒有指定索引。

+0

我正在使用Reactor 2.0.2。但要完全誠實,我不確定你想要解釋什麼。:( – Kriem 2011-05-15 11:50:32

+0

在預反應器CI中;'$ this-> input-> post()'如果沒有傳遞給它,返回'false'; Reactor CI返回整個'$ _POST'數組。 CI在你的服務器上,它可能已經解釋了你正在經歷的行爲(因爲它總會是錯誤的)但是當你使用Reactor時,我認爲問題在於其他地方。 >輸出 - > enable_profiler(真);' – Ross 2011-05-15 11:57:55

+0

這件事是一個總的噩夢:S探查打破了一切,我看不到輸出只是一個白色的頁面我看到本地主機和遠程服務器之間的另一個不同的行爲:當。。在提交表單後刷新頁面,在本地主機上,我的瀏覽器要求我再次發送表單數據。遠程服務器上的同一頁面不會從瀏覽器調用該問題,看起來像從發佈被銷燬? – Kriem 2011-05-15 12:11:42

0

我有這個問題它奇怪的修復我不能解釋爲什麼,但這裏是工作。不要使用html來使表單使用codeigniters表單庫。我試圖左右逢源,由於某種原因

$this->input->post('your_variable'); 

使用表單類時看到笨userguide