[英]Variable to another php file
我有一個帶有public function register($data)
的 php 文件 (register.php),其中驗證了錯誤。然后計算錯誤,如果沒有發現錯誤,則驗證通過。
注冊.php:
class ARegister {
public function register($data) {
$user = $data['userData'];
//validate provided data
$errors = $this->validateUser($data);
if(count($errors) == 0) {
//first validation
}
}
public function validateUser($data, $botProtection = true) {
$id = $data['fieldId'];
$user = $data['userData'];
$errors = array();
$validator = new AValidator();
if( $validator->isEmpty($user['password']) )
$errors[] = array(
"id" => $id['password'],
"msg" => Lang::get('password_required')
);
return $errors;
}
問題是,我需要將已驗證數據的確認發送到我的其他 php 文件 (othervalidation.php),在那里我進行了另一次驗證:
其他驗證.php:
<?php
require 'register.php';
if ( !empty($action) ) {
switch ( $action ) {
case 'process_payment':
try {
$instance = new ARegister();
if($instance->validateUser($data, $errors)) {
throw new Exception('Validation error');
}
} catch (Exception $e) {
$status = false;
$message = $e->getMessage();
}
}
如何將 $errors 變量的結果發送到我的其他驗證 (othervalidation.php)?
你可以嘗試這樣的事情:
class ARegister {
private $error = 0;
public function register($data) {
if (!$this->validateUser($data)){
$this->error++;
}
}
public function getErrorCount(){
return $this->error;
}
public resetErrorCount(){
$this->error = 0;
}
或者通過引用傳遞錯誤:
public function register(&$error, $data) {
if (!$this->validateUser($data)){
$error++;
}
}
就我個人而言,我會在同一個方法中進行所有驗證(在用於封裝的類中),使用錯誤消息參數(通過引用傳遞)返回驗證失敗的原因,並使用 return 語句返回 true 或 false。
class MyClass{
public function validation(&$errorMessage, $firstParameter, $secondParameter){
$success = false;
if (!$this->firstValidation($firstParameter)){
$errorMessage = "this is not working pal.";
}
elseif (!this->secondeValidation($firstParameter)){
$errorMessage = "Still not working buddy...";
}
else{
$success = true;
}
return $success;
}
private function firstValidation($firstParameter){
$success = false;
return $success;
}
private function secondeValidation($secondParameter){
$success = false;
return $success;
}
}
在你的另一個文件中:
<?php
$instance = new MyClass();
$errorMessage = "";
if ($instance->validation($errorMessage, $firstParameter, $secondParameter)){
echo "Woot, it's working!!!";
}
else{
echo $errorMessage;
}
?>
這些代碼解決方案之一是否符合您的需求?
來自蒙特利爾的 Jonathan Parent-Lévesque
我查看了您的新代碼設計,這是我發現的新問題。
首先,在您的 register 函數中,您將 errors 變量用作整數,而您的 validate 函數返回一個數組。 你在這里有兩種可能性。
您可以更改 register 方法以檢查錯誤數組是否為空,如下所示:
if(empty($errors)) {
//first validation
}
Count 也是有效的,但我仍然更喜歡空的,因為它在語法上更清晰。 此外,如果參數不是數組或可數對象,count 函數返回 1,如果參數為 NULL,則返回 0。 正如我所說,它在您當前的情況下是一個功能性解決方案,但在其他一些情況下,它可能會給您帶來意想不到的結果。
在你的方法聲明中,我看到你期待一個布爾值(botProtection)。
public function validateUser($data, $botProtection = true) {
但是您提供了一個錯誤參數
if($instance->validateUser($data, $errors)) {
您沒有向我提供錯誤變量的聲明,但它可能與您的函數期望的機器人保護參數不匹配。 PHP 正在使用丟失類型,它很有用,但是,您必須再次小心難以發現的錯誤。 對於公共函數,您應該始終確保提供的參數不會導致代碼崩潰。
在您的代碼中, data 參數似乎是一個數組。 您可以使用參數提示來強制使用數組,如下所示:
public function register(array $data) {
public function validateUser(array $data, $botProtection = true) {
甚至特定的類(就像您在條件中使用“實例”一樣)
public function register(MyDataClass $data) {
public function validateUser(MyDataClass $data, $botProtection = true) {
此外,您甚至沒有在 validateUser 方法中使用 botProtection 參數。
在同一個函數調用中:
if($instance->validateUser($data, $errors)) {
您需要一個布爾值(真或假),但該方法返回一個數組。 如果你想按照當前設計的方式使用代碼,你必須像這樣使用它
if(!empty($instance->validateUser($data, $errors)) {
在這里,我不太確定是否有必要使用異常。 像這樣設計代碼不是更容易嗎?
if(!empty($instance->validateUser($data, $errors)) {
$message = 'Validation error';
}
在您的驗證函數中,“isEmpty”函數是否也在驗證客戶端是否提供了密碼?
如果是這種情況,您可以像這樣驗證它:
if(!in_array($user['password']) or empty($user['password']))
通過這些更正,您的代碼應該可以正常運行。
這是我如何設計您的代碼的示例(考慮提供的代碼示例):
class ARegister {
public function register($data) {
$user = $data['userData']; //don't declare it here, all the user validations must be done in validateUser($data, &$errors)
$errors = array();
if($this->validateUser($data, $errors)) {
//first validation
}
}
/**
* Note: If you are not returing more than one error at the time, $errors should be a string instead of an array.
*/
public function validateUser($data, array &$errors) {
$isValid = false;
if (in_array($data['fieldId']) and in_array($data['fieldId']['password']) and in_array($data['userData'])){
if(!in_array($data['userData']['password']) or empty($data['userData']['password'])){
$errors[$data['fieldId']['password']] = Lang::get('password_required');
}
else{
$isValid = true;
}
}
else{
//an invalid data array had been provided
}
return $isValid;
}
對於下一部分,如果代碼直接在視圖中執行,並且您是初學者,請創建一個過程外部控制器文件(所有功能都將公開......)。 如果您是專業人士,則必須創建一個類來封裝處理。
您不得直接在視圖中進行處理。 視圖是用於數據呈現和收集客戶輸入的愚蠢占位符。 它必須執行的唯一操作是顯示控制器發送的數據並將客戶端的輸入發送回控制器。
數據處理是控制者的責任。
if (!empty($action) ) {
$errors =array();
switch ( $action ) {
case 'process_payment':
$instance = new ARegister();
if($instance->validateUser($data, $errors)) {
//the user is valid, do the treatment
}
else
PageManager::dispayError($errors);
}
unset($instance);
}
}
這是一個如何集中錯誤顯示的示例
/**
* Can be more complexe than that, but I'm at my father's home at four hundred kms away from Montreal right now..
*/
public static function dispayError($errors, $size = 4){
if (is_numeric($size)){
if ($size < 0){
$size = 1;
}
elseif($size > 5){
$size = 5;
}
}
else{
$size = 4;
}
if (is_scalar($errors)){
echo '<h' . $size . 'class="ERROR_MESSAGE">' . $errors . '</h' . $size . '><br>';
}
elseif (is_array($errors)){
foreach ($errors as $error){
if (is_scalar($error)){
echo '<h' . $size . 'class="ERROR_MESSAGE">' . $error . '</h' . $size . '><br>';
}
}
}
}
當然,您也可以支持多種消息:
public static function dispayError($errors, $size = 4){
self::displayMessage("ERROR_MESSAGE", $errors, $size=4);
}
private static displayMessage($class, $messages, $size=4)
嗯,花了我兩個小時寫的。 我希望您現在有足夠的材料來構建高效、可重用且同樣重要的安全代碼設計。
好成功,
來自蒙特利爾的 Jonathan Parent-Lévesque
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.