2013-12-12 47 views
0

我正在爲非政府組織(志願者工作)製作表格,以便他們可以讓他們的成員訂購一些植物和其他東西。顯然這涉及到輸入一些個人數據。我試圖做的是收到表單中的數據以遍歷$_POST數組,並將所有個人數據分配給一個名爲$klantinfo(clientinfo)的關聯數組。我第一次嘗試(只有其他部分很重要):我嘗試在關聯數組中輸入值,但它不起作用

foreach ($_POST as $key => $value){ 
    if (is_numeric($key) && is_numeric($value) && $value != 0){ 
     $aantalItems++; 
     $items[$key] = $value; 
    } else if(!is_numeric($key)){ 
     $klantinfo[$key] = $value; 
}   

工作正常。所以我試圖添加一些檢查什麼是輸入(已經做了客戶端驗證),並認爲我會開始簡單。所以我做了這樣的開關:

switch($key){ 
    case 'lidnr': lidnr($value); break; 
    case 'voornaam': voornaam($value); break; 
    case 'naam': naam($value); break; 
    case 'straat': straat($value); break; 
    case 'gemeente': gemeente($value); break; 
    case 'tel': tel($value); break; 
    case 'email': email($value); break; 
    case 'reedslid': lid($value); break; 
    case 'afhaalpunt': afhaalpunt($value); break; 
    default: break; 
} 

一個簡單的功能我呼籲那些之一的例子:

function lidnr($nr){ 
    if(mb_strlen($nr) == 6){ 
     $klantinfo['lidnr'] = (int) $nr; 
     echo $nr; 
    } 
} 

,由於某種原因不工作,雖然它是超越我爲什麼。本來我只是宣佈變量$klantinfo在我的腳本頂部,如$klantinfo;。我估計它可能與我的聲明有關,所以我嘗試這樣:$klantinfo = array('lidnr' => 0, 'voornaam' => "", 'naam' => "", 'straat' => "", 'gemeente' => "", 'tel' => "", 'email' => "", 'reedslid' => 0, 'afhaalpunt' => "");,也不起作用。即使更加狡猾:如果我回到我的初始代碼中使用該變量聲明並僅使用$klantinfo[$key] = $value,那麼數組$ klantinfo中未由客戶端填寫的所有項都消失了。即使我初始化那些默認值。

我在這裏錯過了什麼嗎?我搜索並閱讀了幾個主題。在php中爲關聯數組賦值應該是$array['key'] = 'desired_value'。那爲什麼它不工作?我應該注意順便說一句,你在我所調用的示例函數中看到的回顯確實有效。

+1

「不起作用」?它有什麼作用?什麼?空陣列? PHP錯誤?需要關於你的代碼和問題的更多信息(而不是項目背景細節;)) – James

+0

如果我嘗試print_r $ klantinfo使用最初的「簡單」技術,那麼我有一個很好的列表像這樣:Array([lidnr] => 654456 [voornaam] => Koen [naam] => Cornelis [straat] => Teirlinckstraat 50 [tel] => 0493635780 [mail] => [email protected]) 如果我嘗試用新技術,全部,只是空白。 –

+0

你確定這個條件得到滿足嗎? 'if(mb_strlen($ nr)== 6)',如何添加一個'else'語句來調試? –

回答

2

您的問題在於variable scope:從lidnr(),voornaam()等功能中看不到數組$klantinfo

有處理這兩種方式:

  1. 馬克$klantinfo全球的每個功能:

    function lidnr($nr){ 
        global $klantinfo; 
    
        if(mb_strlen($nr) == 6){ 
         $klantinfo['lidnr'] = (int) $nr; 
         echo $nr; 
        } 
    } 
    
  2. 地帶的功能和使用它的機構,直接在交換機模塊:

    switch($key){ 
        case 'lidnr': 
        if(mb_strlen($value) == 6){ 
         $klantinfo['lidnr'] = (int) $value; 
         echo $value; 
        } 
        break; 
    } 
    
+0

也可以[通過引用]傳遞'$ klantinfo'(http://php.net/manual/en/language.references.pass.php)並在函數中對其進行處理。然而這可能不太方便,因爲OP具有多種功能;) – kero

1

這是抓取發佈數據的一個很不好的方法。遍歷帖子,檢查它是否爲數字,重新分配給另一個數組,迭代該數組,併爲每個迭代執行切換,然後將單個值傳遞給另一個函數。

從$ _POST數組中顯式獲取您的發佈數據,進行驗證並保存。爲什麼這麼難?我會添加一條評論,但我沒有足夠的業力。

+0

你現在做... :) – Shomz

+0

我不直接抓住它,因爲有128個項目可以訂購,大多數人只會訂購1-5 。 Items'll有一個數字鍵,其他的都不會。所以我正在過濾,以擺脫$ _Post中我不需要的所有信息。 我同意這是一個可憐的方法。但就像我說的,我是PHP的新手,我這樣做是爲了一個好處,而且我老實說很短的時間,所以我只是爲了快速工作。我真正研究的唯一元素是如何保護數據庫以防止SQL注入。我可以在2月份優化代碼並學習PHP。 –

相關問題