Pourquoi une fonction vérifiant si une chaîne est vide renvoie toujours vrai? [fermé]

231

J'ai une fonction isNotEmpty qui retourne vrai si la chaîne n'est pas vide et faux si la chaîne est vide. J'ai découvert que cela ne fonctionne pas si je passe une chaîne vide à travers.

function isNotEmpty($input) 
{
    $strTemp = $input;
    $strTemp = trim($strTemp);

    if(strTemp != '') //Also tried this "if(strlen($strTemp) > 0)"
    {
         return true;
    }

    return false;
}

La validation de la chaîne à l'aide de isNotEmpty se fait:

if(isNotEmpty($userinput['phoneNumber']))
{
    //validate the phone number
}
else
{
    echo "Phone number not entered<br/>";
}

Si la chaîne est vide, le reste ne s'exécute pas, je ne comprends pas pourquoi, quelqu'un peut-il faire la lumière sur ce sujet s'il vous plaît.

bgosalci
la source
55
Juste une suggestion: c'est généralement une mauvaise pratique d'utiliser des fonctions avec des noms négatifs. Il est plus lisible d'avoir la fonction isEmpty ($ input), sinon vous pourriez l'appeler comme ceci: if (! IsNotEmpty ($ x)) ... D'un autre côté, isNotEmpty () et (! IsEmpty ()) n'est pas si différent. YMMV.
johndodo
1
Pour avoir la même fonction sans nom inversé, peut-être quelque chose comme hasContent ().
OsakaWebbie
! thatDifferent @johndodo
coderatchet
Ceci est DÉFINITIVEMENT un Hors-sujet: une question typographique .
mickmackusa

Réponses:

320

Problème simple en fait. Changement:

if (strTemp != '')

à

if ($strTemp != '')

On peut aussi vouloir le changer en:

if ($strTemp !== '')

puisque != ''retournera vrai si vous passez est numérique 0 et quelques autres cas en raison de la conversion automatique de type de PHP .

Vous ne devez pas utiliser la fonction empty () intégrée pour cela; voir les commentaires et les tableaux de comparaison de types PHP .

cletus
la source
4
Sans doute, changez le if en: return $ strTemp! == '';
strager
12
vous ne voulez pas utiliser empty (). Considérez une chaîne d'espaces: $ x = ""; var_dump (! vide ($ x)); / * (TRUE) / var_dump (isNotEmpty ($ x)); / (FAUX) * /
nickf
5
L'OP coupe la chaîne. Dans ce cas, c'est approprié.
cletus du
8
@cletus: alors considérons une chaîne $ s = '0'. Si vous appelez empty ($ s), il sera évalué à true (pas à mon humble avis intuitif, mais c'est le cas).
johndodo
28
N'utilisez pas empty ()! empty () renverra true pour des valeurs telles que '0'. Voir php.net/manual/en/types.comparisons.php
Scott Tesler
27

PHP a une fonction intégrée appelée empty() le test se fait en tapant if(empty($string)){...} Reference php.net: php empty

Malak
la source
4
la référence vide est déjà à la fin de la réponse acceptée de cletus. Voyez également que ce fil de questions et réponses date d'avril 2009. Quoi qu'il en soit, merci pour votre contribution. Je vous donne un +1 pour une première réponse.
regilero
64
N'utilisez pas empty ()! empty () renverra true pour des valeurs telles que '0'. Voir php.net/manual/en/types.comparisons.php
Scott Tesler
3
@ScottDavidTesler Si la chaîne est "0", est-ce qu'elle retournera vrai? Ou seulement si c'est l'entier 0?
Tomas Zubiri
5
@TomasZubiri Oui, une chaîne contenant "0" retournera vrai.
Michael Sund
3
S'IL VOUS PLAÎT, personne d'autre n'évalue cette mauvaise réponse - lisez les commentaires ci-dessus!
ToolmakerSteve
24

J'utilise toujours une expression régulière pour vérifier une chaîne vide, remontant aux jours CGI / Perl, et aussi avec Javascript, alors pourquoi pas aussi avec PHP, par exemple (bien que non testé)

return preg_match('/\S/', $input);

Où \ S représente tout caractère non blanc

Dexygen
la source
1
C'est la seule solution ici qui ne suppose pas que zéro est identique à une chaîne vide!
Matthew Lock
1
Solution cool. En remarque, stackoverflow.com/a/4544642/5411817 mentionne: Par défaut, .ne correspond pas aux nouvelles lignes - [\s\S]est un hack autour de ce problème. Ceci est courant en JavaScript, mais en PHP, vous pouvez utiliser le /sdrapeau pour faire correspondre le point à tous les caractères. Et stackoverflow.com/a/4544646/5411817 mentionne: (?s)active le smode et (?-s)le désactive. Une fois désactivée, aucune suite .ne correspondra à une nouvelle ligne. si vous souhaitez activer / désactiver l'interrupteur en ligne (intégré dans l'expression régulière) plutôt que comme indicateur d'expression régulière.
SherylHohman
19

Dans votre ifclause de la fonction, vous faites référence à une variable strTempqui n'existe pas. $strTempexiste, cependant.

Mais PHP a déjà une empty()fonction disponible; pourquoi faire le vôtre?

if (empty($str))
    /* String is empty */
else
    /* Not empty */

De php.net:

Valeurs de retour

Renvoie FALSE si var a une valeur non vide et non nulle.

Les éléments suivants sont considérés comme vides:

* "" (an empty string)
* 0 (0 as an integer)
* "0" (0 as a string)
* NULL
* FALSE
* array() (an empty array)
* var $var; (a variable declared, but without a value in a class)

http://www.php.net/empty

Björn
la source
11
Toutes les implémentations ne voudraient pas que "0" soit évalué comme vide. Et s'il le voulait, ne pourrait-il pas tout aussi bien utiliser la comparaison if ($ x), c'est-à-dire If (! Trim ($ str))?
Calvin
1
Notez que faire $ tmpStr! = '' Retournera également true si $ tmpStr contient 0 ou false ou une autre valeur vide / false.
Pim Jager
5
Votre version ne fonctionnera pas réellement: les travaux vides sur les variables, pas sur les expressions.
Chien
13

PHP évalue une chaîne vide à false, vous pouvez donc simplement utiliser:

if (trim($userinput['phoneNumber'])) {
  // validate the phone number
} else {
  echo "Phone number not entered<br/>";
}
troelskn
la source
9
Cela fonctionne bien jusqu'à ce que vous ne passiez pas 0. Sinon, l'idée est géniale, je vais la faire sur d'autres endroits. Merci pour votre réponse.
bgosalci
10

Utilisez simplement la fonction strlen ()

if (strlen($s)) {
   // not empty
}
doctorlai
la source
1
cela dépend de la façon dont PHP implémente la fonction strlen (). Par exemple, dans Delphi, la chaîne a en fait stocké sa longueur moins un décalage de 4 octets, donc vérifier sa longueur est trivial.
doctorlai
5
Ne saisissez pas save. Avant que Php 5.3la fonction ne revienne 5si $sest de type array. Php > 5.3soulèvera une exception. Je recommande d'utiliser is_string($s) && str_len($s) > 0. >0juste à des fins de lecture.
magic_al
5

J'écris juste ma propre fonction, is_string pour la vérification de type et strlen pour vérifier la longueur.

function emptyStr($str) {
    return is_string($str) && strlen($str) === 0;
}

print emptyStr('') ? "empty" : "not empty";
// empty

Voici un petit test repl.it

EDIT: Vous pouvez également utiliser la fonction Trim pour tester si la chaîne est également vide.

is_string($str) && strlen(trim($str)) === 0;    
svarog
la source
1

Je devais tester un champ vide en PHP et utilisé

ctype_space($tempVariable)

qui a bien fonctionné pour moi.

TRayman
la source
C'est une bonne réponse à une autre question. Cette réponse NE vérifie PAS si une chaîne est vide.
mickmackusa
0

Eh bien voici la méthode courte pour vérifier si la chaîne est vide ou non.

$input; //Assuming to be the string


if(strlen($input)==0){
return false;//if the string is empty
}
else{
return true; //if the string is not empty
}
abhishek bagul
la source
La vérification du a strlen()été recommandée en 2014 sur cette page. Votre réponse n'ajoute aucune nouvelle valeur.
mickmackusa
0

Vous pouvez simplement lancer à bool, n'oubliez pas de gérer zéro.

function isEmpty(string $string): bool {
    if($string === '0') {
        return false;
    }
    return !(bool)$string;
}

var_dump(isEmpty('')); // bool(true)
var_dump(isEmpty('foo')); // bool(false)
var_dump(isEmpty('0')); // bool(false)
Fabian Picone
la source
(bool)$strest la même chose que faire !empty($str)et a le même problème avec '0'. Lisez PHP Booleans , la section "Conversion en booléen". En outre, vous l'avez fait à l'envers - devrait l'être !(bool)$string'. Ou votre fonction doit être nommée "isNotEmpty". Quoi qu'il en soit, vous êtes coincé avec une gestion incorrecte de «0».
ToolmakerSteve
@ToolmakerSteve Pour le 0problème, il suffit de gérer cela avant de retourner la chaîne castée. Et merci beaucoup, j'ai oublié la négation !(les noms de fonction niés sont une mauvaise pratique). Modifié mon message.
Fabian Picone
-1

Je sais que ce fil est assez ancien mais je voulais juste partager une de mes fonctions. Cette fonction ci-dessous peut rechercher des chaînes vides, des chaînes avec des longueurs maximales, minimales ou exactes. Si vous voulez vérifier les chaînes vides, mettez simplement $ min_len et $ max_len à 0.

function chk_str( $input, $min_len = null, $max_len = null ){

    if ( !is_int($min_len) && $min_len !== null ) throw new Exception('chk_str(): $min_len must be an integer or a null value.');
    if ( !is_int($max_len) && $max_len !== null ) throw new Exception('chk_str(): $max_len must be an integer or a null value.'); 

    if ( $min_len !== null && $max_len !== null ){
         if ( $min_len > $max_len ) throw new Exception('chk_str(): $min_len can\'t be larger than $max_len.');
    }

    if ( !is_string( $input ) ) {
        return false;
    } else {
        $output = true;
    }

    if ( $min_len !== null ){
        if ( strlen($input) < $min_len ) $output = false;
    }

    if ( $max_len !== null ){
        if ( strlen($input) > $max_len ) $output = false;
    }

    return $output;
}
Kevin Ng
la source
-2

vous pouvez peut-être essayer ceci

if(isNotEmpty($userinput['phoneNumber']) == true)

c'est à cause de la configuration php dans php.ini

0xFF
la source
-2

si vous avez un champ à savoir serial_number et que vous voulez vérifier vide alors

$serial_number = trim($_POST[serial_number]);
$q="select * from product where user_id='$_SESSION[id]'";
$rs=mysql_query($q);
while($row=mysql_fetch_assoc($rs)){
if(empty($_POST['irons'])){
$irons=$row['product1'];
}

de cette façon, vous pouvez contrôler tous les fichiers dans la boucle avec une autre fonction vide

user2042007
la source
empty()a déjà été recommandé sur cette page en 2009.
mickmackusa
-2

c'est la solution courte et efficace, exactement ce que vous recherchez:

return $input > null ? 'not empty' : 'empty' ;
Moti Winkler
la source
Je n'ai pas testé si cela fonctionne, mais si c'est le cas, ce serait en convertissant nullen chaîne vide pour comparaison. Dans ce cas, il serait beaucoup plus clair de dire ce que vous entendez: $input > ''. C'est-à-dire "effectuer une comparaison lexicale entre la chaîne d'entrée et une chaîne vide". Ou pour ignorer les espaces aux extrémités: trim($input) > ''.
ToolmakerSteve
... Il faut aussi tester ce qui se passe quand $inputest '0'. Pas clair si php fait une comparaison numericou lexical, lorsque le premier argument est une chaîne numérique.
ToolmakerSteve
-3

Vous avez une réponse mais dans votre cas, vous pouvez utiliser

return empty($input);

ou

return is_string($input);
geekido
la source
5
cela ne fonctionne pas pourempty("0")
activatedgeek
2
@geekido - la rétrogradation des mauvaises réponses fait partie de StackOverflow - elle déplace ces réponses vers le bas et encourage les répondeurs à corriger leur réponse, ou à la supprimer. Comprenez-vous ce qui ne va pas dans votre réponse? 1. empty- cette réponse a déjà été donnée, donc la répéter ne contribue à rien. Pire, comme cela a été discuté dans les commentaires, c'est faux - toute valeur équivalente à 0sera considérée comme "vide". 2. is_stringest erroné d'une manière différente - une chaîne vide ''est une chaîne, donc retournera vrai dans ce cas - ne fait pas ce que la question demande.
ToolmakerSteve