2013-04-12 4 views
2

J'ai une expérience très limitée avec PHP et j'espère vraiment que quelqu'un pourra m'aider.Modifier le formulaire pour désinfecter/valider le numéro de téléphone

Ce que je veux faire est d'assainir/valider l'entrée du numéro de téléphone afin que seuls les numéros sont autorisés.

Je pense que je dois utiliser FILTER_SANITIZE_NUMBER_INT mais je ne sais pas où et comment l'utiliser.

Voici mon code:

<?php 

// Replace the email address with the one that should receive the contact form inquiries. 
define('TO_EMAIL', '########'); 

$aErrors = array(); 
$aResults = array(); 

/* Functions */ 

function stripslashes_if_required($sContent) { 

    if(get_magic_quotes_gpc()) { 
     return stripslashes($sContent); 
    } else { 
     return $sContent; 
    } 
} 

function get_current_url_path() { 

    $sPageUrl = "http://".$_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"]; 
    $count = strlen(basename($sPageUrl)); 
    $sPagePath = substr($sPageUrl,0, -$count); 
    return $sPagePath; 
} 

function output($aErrors = array(), $aResults = array()){ // Output JSON 

    $bFormSent = empty($aErrors) ? true : false; 
    $aCombinedData = array(
     'bFormSent' => $bFormSent, 
     'aErrors' => $aErrors, 
     'aResults' => $aResults 
     ); 

    header('Content-type: application/json'); 
    echo json_encode($aCombinedData); 
    exit; 
} 

// Check supported version of PHP 
if (version_compare(PHP_VERSION, '5.2.0', '<')) { // PHP 5.2 is required for the safety filters used in this script 

    $aErrors[] = 'Unsupported PHP version. <br /><em>Minimum requirement is 5.2.<br />Your version is '. PHP_VERSION .'.</em>'; 
    output($aErrors); 
} 


if (!empty($_POST)) { // Form posted? 

    // Get a safe-sanitized version of the posted data 
    $sFromEmail = filter_input(INPUT_POST, 'email', FILTER_SANITIZE_EMAIL); 
    $sFromName = filter_input(INPUT_POST, 'name', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW); 

    $sMessage = "Name: ".stripslashes_if_required($_POST['name']); 
    $sMessage .= "\r\nEmail: ".stripslashes_if_required($_POST['email']); 
    $sMessage .= "\r\nBusiness: ".stripslashes_if_required($_POST['business']); 
    $sMessage .= "\r\nAddress: ".stripslashes_if_required($_POST['address']); 
    $sMessage .= "\r\nPhone: ".stripslashes_if_required($_POST['phone']); 
    $sMessage .= "\r\nMessage: ".stripslashes_if_required($_POST['message']); 
    $sMessage .= "\r\n--\r\nEmail sent from ". get_current_url_path(); 

    $sHeaders = "From: '$sFromName' <$sFromEmail>"."\r\n"; 
    $sHeaders .= "Reply-To: '$sFromName' <$sFromEmail>"; 

    if (filter_var($sFromEmail, FILTER_VALIDATE_EMAIL)) { // Valid email format? 

     $bMailSent = mail(TO_EMAIL, "New inquiry from $sFromName", $sMessage, $sHeaders); 
     if ($bMailSent) { 
      $aResults[] = "Message sent, thank you!"; 
     } else { 
      $aErrors[] = "Message not sent, please try again later."; 
     } 

    } else { 
     $aErrors[] = 'Invalid email address.'; 
    } 
} else { // Nothing posted 
    $aErrors[] = 'Empty data submited.'; 
} 


output($aErrors, $aResults); 
+0

Voir cet article précédent: http://stackoverflow.com/questions/3090862/how-to-validate-phone-number-using-php, et celui-ci pour différents formats: http://stackoverflow.com/questions/123559/a-complete-regex-for-phone-number-validation/ – Revent

Répondre

11

Avez-vous regardé en fonction de PHP preg_replace? Vous pouvez supprimer tout caractère non numérique en utilisant preg_replace('/[^0-9]/', '', $_POST['phone']).

Une fois que vous filtrez les données de caractères, vous pouvez toujours vérifier pour voir si elle est d'une longueur souhaitée:

$phone = preg_replace('/[^0-9]/', '', $_POST['phone']); 
if(strlen($phone) === 10) { 
    //Phone is 10 characters in length (###) ###-#### 
} 

Vous pouvez également utiliser la fonction de PHP preg_match comme indiqué dans this other SO question.

+0

J'ai changé '$ sMessage. =" \ R \ nPhone: ".stripslashes_if_required ($ _ POST ['phone']);' '' '$ sMessage. =" \ R \ nPhone: ".preg_replace ('/ [^ 0-9 + -]/',' ', $ _POST [' phone ']); '. Est-ce une bonne façon de faire cela? Cela semble fonctionner très bien. – user2275638

+0

@ user2275638 Si votre but est d'autoriser seulement 0-9 et le symbole +/-, alors oui. Il supprimera tout ce qui est '$ _POST ['phone']' qui n'est pas un nombre ou le symbole +/-. – Kyle

+0

Merci pour votre aide. – user2275638

0

Vous pouvez essayer d'utiliser preg_replace pour filtrer tous les caractères non numériques, vous pouvez vérifier la longueur de ce qui est reste à voir si son numéro de téléphone (doit être soit 7,9 ou peut-être 10 chiffres)

// remove anything thats not a number from the string 
function only_numbers($number) { return preg_replace('/[^0-9]/', '', $number) }; 
// test that the string is only 9 numbers long 
function isPhone($number) { return strlen(only_numbers($number)) == 9; } 

assurez-vous d'utiliser la valeur only_numbers lors de l'utilisation de la valeur après sa validation.

-Ken

+0

Vous n'avez pas besoin de faire une fonction pour vérifier qu'une chaîne est un nombre; utiliser PHP intégré 'is_numeric()'. Cela fonctionne avec les flottants et les ints (y compris les nombres signés). Cependant, il permet un 'e'/'E' dans les flotteurs. 'filter_var()' avec un paramètre 'FILTER_SANITIZE_INT' fonctionnerait. –

5

Il y a deux façons de le faire ... Exemples:

// If you want to clean the variable so that only + - . and 0-9 can be in it you can: 
$number = filter_var($number, FILTER_SANITIZE_NUMBER_INT); 

// If you want to clean it up manually you can: 
$phone = preg_replace('/[^0-9+-]/', '', $_POST['phone']); 

// If you want to check the length of the phone number and that it's valid you can: 
if(strlen($_POST['phone']) === 10) { 
    if (!preg_match('/^[0-9-+]$/',$var)) { // error } else { // good } 
} 

certaines modifications peuvent évidemment besoin d'être fait en fonction du pays et d'autres facteurs divers.

Questions connexes