天天看點

【php】用filter_var實作的簡單參數驗證

filter_var是在php5.2.0中開始提供的。詳細說明見:

<a href="http://www.php.net/manual/zh/book.filter.php" target="_blank">http://www.php.net/manual/zh/book.filter.php</a>

先看看代碼:

<code>&lt;?php</code>

<code>class</code> <code>Utils {</code>

<code>    </code><code>/**</code>

<code>     </code><code>* 主要是調用filter_var_array驗證,再擴充一個required字段來表示必填項。</code>

<code>     </code><code>* http://www.php.net/manual/zh/book.filter.php</code>

<code>     </code><code>* 注意: (可以不傳,但不能傳錯)</code>

<code>     </code><code>*  1.先驗證格式,有失敗的抛異常。</code>

<code>     </code><code>*  2.未傳的參數,有default的(不管是否required=1),則設定為default值。</code>

<code>     </code><code>* 示例:</code>

<code>     </code><code>*      $filterArr = array(</code>

<code>     </code><code>*          "pn" =&gt;array(</code>

<code>     </code><code>*              "required"  =&gt; 1,</code>

<code>     </code><code>*              "filter"    =&gt; FILTER_VALIDATE_INT,</code>

<code>     </code><code>*              "options"   =&gt; array(</code>

<code>     </code><code>*                  "default"   =&gt;1,</code>

<code>     </code><code>*                  "min_range" =&gt;1,</code>

<code>     </code><code>*              )</code>

<code>     </code><code>*          )</code>

<code>     </code><code>*      )</code>

<code>     </code><code>*/</code>

<code>public</code> <code>static</code> <code>function</code> <code>filter_param(</code><code>$paramArr</code><code>, </code><code>$filterArr</code><code>){</code>

<code>        </code><code>$res</code> <code>= filter_var_array(</code><code>$paramArr</code><code>, </code><code>$filterArr</code><code>);     </code><code>//參數不合法-flase, 沒傳參數-null</code>

<code>        </code><code>foreach</code><code>(</code><code>$res</code> <code>as</code> <code>$key</code><code>=&gt;</code><code>$val</code><code>){</code>

<code>            </code><code>//如果有驗證失敗的,抛出異常。</code>

<code>            </code><code>if</code><code>(false === </code><code>$val</code><code>){</code>

<code>                </code><code>throw</code> <code>new</code> <code>Exception( </code><code>"Utils::filter_param: failed, key=$key "</code><code>);</code>

<code>            </code><code>}</code>

<code>            </code><code>//再判斷未傳的參數。</code>

<code>            </code><code>if</code><code>( </code><code>is_null</code><code>(</code><code>$val</code><code>)){</code>

<code>                </code><code>//1.如果是必填項</code>

<code>                </code><code>if</code><code>(</code><code>$filterArr</code><code>[</code><code>$key</code><code>][</code><code>'required'</code><code>] ){</code>

<code>                    </code><code>if</code><code>(isset(</code><code>$filterArr</code><code>[</code><code>$key</code><code>][</code><code>'options'</code><code>][</code><code>'default'</code><code>])){</code>

<code>                        </code><code>//1.1如果有default值,則設定為default值。</code>

<code>                        </code><code>$res</code><code>[</code><code>$key</code><code>] = </code><code>$filterArr</code><code>[</code><code>$key</code><code>][</code><code>'options'</code><code>][</code><code>'default'</code><code>];</code>

<code>                    </code><code>}</code><code>else</code><code>{</code>

<code>                        </code><code>//1.2如果沒有default值,抛出異常。</code>

<code>                        </code><code>throw</code> <code>new</code> <code>Exception( </code><code>"Utils::filter_param: Do not have required param, key=$key"</code> <code>);</code>

<code>                    </code><code>}</code>

<code>                </code><code>}</code><code>else</code><code>{</code>

<code>                    </code><code>//$res[$key]='';      //這裡是預設把null值改為空值。是否有必要?</code>

<code>                </code><code>}</code>

<code>        </code><code>}</code>

<code>        </code><code>return</code> <code>$res</code><code>;</code>

<code>}</code>

<code>};</code>

<code>        </code><code>//每個model裡,都寫個checkParam函數,用來配置驗證的規則。</code>

<code>    </code><code>function</code> <code>checkParam(</code><code>$arrInput</code><code>){</code>

<code>        </code><code>//1.先檢查catId</code>

<code>        </code><code>$filter</code> <code>= </code><code>array</code><code>(</code>

<code>                </code><code>//數字類型的,必填。隻允許 0-1。</code>

<code>            </code><code>"catId"</code> <code>=&gt; </code><code>array</code><code>(</code>

<code>                </code><code>"required"</code><code>=&gt;1,</code>

<code>                </code><code>"filter"</code><code>=&gt;FILTER_VALIDATE_INT,</code>

<code>                </code><code>"options"</code><code>=&gt;</code><code>array</code><code>(</code>

<code>                    </code><code>"min_range"</code> <code>=&gt;0,</code>

<code>                    </code><code>"max_range"</code> <code>=&gt;1,</code>

<code>                </code><code>)</code>

<code>            </code><code>),</code>

<code>                </code><code>//字元串類型的,必填。長度大于1。</code>

<code>            </code><code>"title"</code> <code>=&gt; </code><code>array</code><code>(</code>

<code>                </code><code>"filter"</code><code>=&gt;FILTER_VALIDATE_REGEXP,</code>

<code>                    </code><code>"regexp"</code> <code>=&gt;</code><code>"/^.+/"</code><code>,</code>

<code>                </code><code>//字元串類型的,非必填。但要是填了的話,則格式必須為email。</code>

<code>            </code><code>"email"</code> <code>=&gt; </code><code>array</code><code>(</code>

<code>                </code><code>"filter"</code><code>=&gt;FILTER_VALIDATE_EMAIL,</code>

<code>        </code><code>);</code>

<code>        </code><code>$_res</code> <code>= Utils::filter_param(</code><code>$arrInput</code><code>, </code><code>$filter</code><code>) ;</code>

<code>    </code><code>}</code>

<code>    </code> 

<code>        </code><code>//比如這個是輸入的參數。可以試着修改這裡看看效果。</code>

<code>    </code><code>$arrInput</code><code>=</code><code>array</code><code>(</code>

<code>        </code><code>'catId'</code><code>=&gt;1,</code>

<code>        </code><code>'title'</code><code>=&gt;</code><code>'xx'</code><code>,</code>

<code>        </code><code>'email'</code><code>=&gt;</code><code>'xxxxxx.com'</code><code>,</code>

<code>    </code><code>);</code>

<code>    </code><code>try</code><code>{</code>

<code>        </code><code>$res</code><code>=checkParam(</code><code>$arrInput</code><code>);</code>

<code>        </code><code>echo</code> <code>"驗證通過,繼續其它代碼...\n"</code><code>;</code>

<code>    </code><code>}</code><code>catch</code><code>(Exception </code><code>$e</code><code>){</code>

<code>        </code><code>echo</code> <code>'Caught exception: '</code><code>,  </code><code>$e</code><code>-&gt;getMessage(), </code><code>"\n"</code><code>;</code>

<code>?&gt;</code>

上面的代碼,可直接運作。

使用方法:

建議把filter_param放到公共函數庫中。

建議在每個model裡都有個checkParam函數,專門配置驗證規則。

本文轉自 xjtuhit 51CTO部落格,原文連結:http://blog.51cto.com/51reboot/1427065