2015-02-11 36 views
0

這是驗證請求提交中的表單數據的單個函數的示例。變量true已被設置,每個函數檢查驗證要求,然後繼續而不返回任何內容或返回false並更改$check值。底部的函數然後檢查$check值是否已更改爲false,如果它具有SQL語句將不會運行。我在將錯誤值返回給PHP中的函數時遇到問題

$check = true; 

function productNameValidation(){ 

    if(isset($_REQUEST['product_name']) && !empty($_REQUEST['product_name']) && preg_match("/^[A-Za-z0-9 :]*[A-Za-z0-9][A-Za-z0-9 :]{0,50}$/",($_REQUEST['product_name']))){ 

     //then $valid['ID'] = "string: " . $_REQUEST['ID'] 
     $valid['product_name'] = $_REQUEST['product_name']; 
     $err['product_name'] = "No errors"; 
     //if not  
    } else { 
     if(empty($_REQUEST['product_name'])){ 
      $valid['product_name'] = "No data entered!"; 
     } else {  
      $valid['product_name'] = $_REQUEST['product_name']; 
     } //$err['ID'] = "error message" 

     $err['product_name'] = "Product Name must only contain letters, numbers and ':'!"; 
     $check = false; 
    } 
} 

function checkProduct() 
{ 
    productNameValidation(); 
    productGenreValidation(); 
    productPriceValidation(); 
    productEsrbValidation(); 
    productThumbnailValidation(); 
    releaseDateValidation(); 

    return $check; 
} 
if($check == true) 
{ 
    //Insert into database 
} 
+2

您的函數對一組共享變量進行操作,所以這些函數在每個函數中都必須聲明爲「全局」。更好的是,從它們開始創建一個類並使用對象成員(比如'$ this-> err')。 – georg 2015-02-11 09:01:21

+0

我建議幾個人在這裏閱讀這個http://php.net/manual/en/language.variables.scope.php這篇文章的一些答案可能會導致未來的混亂。 – Edward 2015-02-11 09:58:38

回答

1

你需要做的是在不同的功能上添加不同的變量。如果您正在使用此代碼,它開始作爲true並要求進行檢查,如果檢查失敗就變成假的方法,試試這個方法:

// $check = true; 

    function productNameValidation(){ 
     $nameValidation = TRUE; 
     if(isset($_REQUEST['product_name']) && !empty($_REQUEST['product_name']) && preg_match("/^[A-Za-z0-9 :]*[A-Za-z0-9][A-Za-z0-9 :]{0,50}$/",($_REQUEST['product_name']))){ 

      //then $valid['ID'] = "string: " . $_REQUEST['ID'] 
      $valid['product_name'] = $_REQUEST['product_name']; 
      $err['product_name'] = "No errors"; 
      //if not  
     } else { 
      if(empty($_REQUEST['product_name'])){ 
       $valid['product_name'] = "No data entered!"; 
      } else {  
       $valid['product_name'] = $_REQUEST['product_name']; 
      } //$err['ID'] = "error message" 

      $err['product_name'] = "Product Name must only contain letters, numbers and ':'!"; 
      $nameValidation = false; 
     } 
    return $nameValidation; 
    } 

    function checkProduct() 
    { 
    $checkProduct = true; ///true until proven false. 

     $checkProduct = productNameValidation(); 
     //This code gives $checkProduct the boolean value returned 
    //from the function 

     $checkProduct = productGenreValidation(); 
     $checkProduct = productPriceValidation(); 
     $checkProduct = productEsrbValidation(); 
     $checkProduct = productThumbnailValidation(); 
     $checkProduct = releaseDateValidation(); 

     return $checkProduct; 
    } 
    if($checkProduct == true) 
    { 
     //Insert into database 
    } 

我在這裏所做的是每個函數返回一個TRue/False flag可以用if(){語句檢查的布爾變量,你可以通過這種方式運行多種函數來檢查你需要的每個方面。重要的一點是,您需要從每個函數中返回一個值,並且您可以使用初始設置手動設置布爾值,然後根據條件進行更新 - 例如設置$checkProduct = TRUE,直到它從任何子函數都爲FALSE。

在這種情況下,全局變量並不是一個好主意。

編輯:感謝@Edward對布爾返回碼的一些澄清。

+1

你甚至可以將'$ checkProduct'設置爲驗證函數的值,這樣你就可以在不加載if/else if子句的情況下檢查多個函數。 – Edward 2015-02-11 09:54:12

+0

Ahhhh當然!這很有道理。謝謝你們的快速響應! – 2015-02-11 10:29:12

+0

@ daniel-schofield93如果這能解決您的問題,請在我的回答旁邊打勾,歡呼:) – Martin 2015-02-11 10:44:42

-2

您可以使用檢查像局部變量不是全局的,所以在函數中。 相反,如果你想把它當作一個全球性的,在函數的開始,你必須指定你指的是

global $check; 
+2

在這種情況下使用全局變量作爲頂部的一點。考慮返回變量。 – Edward 2015-02-11 09:43:40

+2

這個值不需要是全局的,值可以更好地分解爲每個範圍的變量。 – Martin 2015-02-11 09:48:40

1

你可以做這樣的事情:在

function productNameValidation(){ 
    $check = true; 
    if(isset($_REQUEST['product_name']) && !empty($_REQUEST['product_name']) && preg_match("/^[A-Za-z0-9 :]*[A-Za-z0-9][A-Za-z0-9 :]{0,50}$/",($_REQUEST['product_name']))){ 

     //then $valid['ID'] = "string: " . $_REQUEST['ID'] 
     $valid['product_name'] = $_REQUEST['product_name']; 
     $err['product_name'] = "No errors"; 
     //if not  
    } else { 
     if(empty($_REQUEST['product_name'])){ 
      $valid['product_name'] = "No data entered!"; 
     } else {  
      $valid['product_name'] = $_REQUEST['product_name']; 
     } //$err['ID'] = "error message" 

     $err['product_name'] = "Product Name must only contain letters, numbers and ':'!"; 
     $check = false; 
    } 
    return $check; 
} 

if(productNameValidation()) { 
.... 
} 
+0

設置任何變量的值對其範圍沒有影響。您需要更改範圍或返回變量。 – Edward 2015-02-11 09:41:03

+1

是的,我認爲這很清楚。要編輯答案 – Phate01 2015-02-11 09:51:50

+0

永遠不要假設!哈哈 – Edward 2015-02-11 09:59:31

0

您可以return $check您的驗證功能將允許您使用以下功能範圍外的$check的值:$check = productNameValidation()。我在上面看到的另一個重要提示:您應該儘可能避免全球範圍。