2013-04-17 94 views
0

我正在使用函數來驗證表單的每個部分。對於此特定表單,電話號碼是可選條目。於是我想出了以下功能:沒有正確返回PHP函數的值?

if(isset($_POST['phone'])) { $phone = $_POST['phone']; } 

//Call phone validation function 
$phone = validPhone($phone); 
if (strlen($phone) == 0) { 
    $mistakes[] = 'Your phone number must contain only NUMERIC characters.'; 
} 

    function validPhone($phone) { 
     if ($phone != '') { 
      $phone = trim($phone); 
      if (!ctype_digit(str_replace(' ', '', $phone))) { 
       $phone = ''; 
      } else { 
       //accept phone entry and sanitize it 
       $phone = mysql_real_escape_string(stripslashes($phone)); 
      } 
     } else { 
      $phone = 'not specified'; 
     } 
     return $phone; 
    } 

我的問題是,當你沒有爲$手機輸入內容時,該位:

else { 
    $phone = 'not specified'; 
} 

似乎被跳過,因爲沒有什麼進入數據庫。

下面是相應的數據庫PHP:

//Insert Into Database 
$sql="INSERT INTO signups (phone) 
VALUES 
(''".$phone."')"; 

if (!mysql_query($sql)) { 
    die('Error: ' . mysql_error()); 
} 

我的本意是,只要沒有被用戶輸入,進入到數據庫將是「未指定」。我做錯了什麼嗎?

+2

你應該在你傳遞給你的函數之前修剪($)'$ phone'的值* –

+0

@ Simo389第一次嘗試廣告將缺省值設置爲validPhone函數中的參數,因爲在當前狀態下,如果它們沒有電話號碼輸入,validPhone函數將在沒有參數的情況下執行,並且不帶有空參數,因此您需要將函數的$ phone參數設置爲默認值值,所以如果沒有值傳遞給函數作爲參數,它將使用您預定義的默認值作爲值 需要解釋我在這裏:) –

+0

我應該在哪裏指定此默認值?當然,如果我在提交表格後這樣做,如果有人進入表格,它會'覆蓋'表格中提交的值。 – Simo389

回答

0

問題出現是因爲比較寬鬆的==

如果$phone = null(如果該值未公佈),$phone == ''評估爲真。因爲''鬆散地等於null。您需要使用嚴格比較===,或更好地使用empty()。我親自處理所有的這些東西了前初始化變量(包括消毒的輸入值時,如存在進一步通過不安全的數據到應用程序中沒有任何意義這是我可能會建議:

$phone = ''; 
if (!empty($_POST['phone'])) { 
    $phone = mysql_real_escape_string(stripslashes(trim($_POST['phone']))); 
} 

$phone = validPhone($phone); 
if ($phone === '') { 
    $mistakes[] = 'Your phone number must contain only NUMERIC characters.'; 
} 

function validPhone($phone) { 
    if ($phone === '') { 
     return 'not specified'; 
    } else if (!ctype_digit(str_replace(' ', '', $phone))) { 
     return ''; 
    } else { 
     return $phone; 
    } 
} 

另外,應真正考慮用你的代碼替換已棄用的mysql_*函數,使用mysqli或者PDO等價物。注意,你也需要改變你的代碼來填充$mistake,如$phone的返回值'not specified',你不會觸發那個條件。

+0

感謝您的建議! @Mike Brant我認爲唯一的問題是電話號碼在表單上是可選的,而你的方法需要它或者會觸發錯誤信息? – Simo389

+0

@ Simo389 OH好的。如果是可選的,則說明「未指定」的用法。我已更新代碼以刪除該條件。 –

+0

@ Simo389我個人發現,幾乎總是在PHP中使用精確比較的好習慣,因爲使用寬鬆比較可能會導致意外的結果。 –

0

變化if ($phone != '') {if (trim($phone) != '') {

+0

剛剛添加這個,仍然沒有運氣。我已經離開'$ phone = trim($ phone);'在下一行以及這個,這是否需要刪除? – Simo389

+0

其實你不需要這個:else {phone ='not specified'; } – raidenace

+0

好吧,我想我會幫你。 :-) – Simo389

2
if (!empty(trim($phone)) 

將匹配爲$電話= 0,「」,空,假的所以這將是一個包羅萬象的

更重要的是,你應該考慮在做測試驅動開發,因爲它會提高你的開發速度並減少錯誤。結帳PHPUnit - https://github.com/sebastianbergmann/phpunit/