Parece que el operador de PHP ==
distingue entre mayúsculas y minúsculas? Entonces, ¿hay alguna razón para usar strcmp()
? ¿Es seguro hacer algo como:Comparación de cadenas usando == vs strcmp
if ($password == $password2) { ... }
Parece que el operador de PHP ==
distingue entre mayúsculas y minúsculas? Entonces, ¿hay alguna razón para usar strcmp()
? ¿Es seguro hacer algo como:Comparación de cadenas usando == vs strcmp
if ($password == $password2) { ... }
La razón de usar es porque strcmp
vuelve < 0 si cadena1 es menor que cadena2; > 0 si str1 es mayor que str2, y 0 si son iguales.
==
sólo se devuelve true
o false
, que no te dice que es el "mayor" cadena.
icic tho en mi caso actual, no necesito saber qué cadena es mayor :) –
strcmp con cuerdas coincidentes tomó 0.207852 segundos strcmp con cadenas sin coincidencia tomó 0.215276 segundos === con cuerdas coincidentes tomó 0.067122 segundos === con no -las cadenas de emparejamiento tomaron 0.057305 segundos http://snipplr.com/view/758/ –
El otro uso de strcmp muestra la clasificación. Para ser más claro sobre la clasificación. strcmp() devuelve <0 si string1 se ordena antes que string2,> 0 si string2 se ordena antes que string1 o 0 si son iguales. Por ejemplo $ string_first = "aabo"; $ string_second = "aaao"; echo $ n = strcmp ($ string_first, $ string_second); devolverá más que cero, ya que aaao está ordenando antes de aabo. –
Puede utilizar strcmp()
si desea hacer un pedido/lexicographically comparar cadenas. Si solo desea verificar la igualdad, entonces ==
está bien.
Me gusta en [usort] (http://us2.php.net/manual/en/function.usort.php). De hecho, está hecho para clasificar. – Charles
@Charles Gracias. Wikipedia me hizo vidriar los ojos. – cbednarski
La primera parte es correcta, pero == no está bien para la igualdad. – postfuturist
Usar ==
puede ser peligroso.
Tenga en cuenta que la variable se convertiría en otro tipo de datos si los dos difieren.
Ejemplos:
echo (1 == '1') ? 'true' : 'false';
echo (1 == true) ? 'true' : 'false';
Como se puede ver, estos dos son de diferentes tipos, pero el resultado es true
, que podría no ser lo que el código se esperaría .
Sin embargo, se recomienda utilizar ===
, ya que la prueba muestra que es un poco más rápido que strcmp()
y su alternativa a las mayúsculas y las minúsculas strcasecmp()
.
googlear rápida grita esta comparación velocidad: http://snipplr.com/view/758/
Nunca se debe utilizar ==
de comparación de cadenas. ===
está bien.
$something = 0;
echo ('password123' == $something) ? 'true' : 'false';
Simplemente ejecute el código anterior y verá por qué.
$something = 0;
echo ('password123' === $something) ? 'true' : 'false';
Ahora, eso es un poco mejor.
== no es solo un problema para diferentes tipos. A veces dará resultados inesperados incluso si ambos lados son una cadena. Pruebe '1e3' == '1000' – Antimony
¿cómo 0 == 'contraseña123'? –
@AndyLobel PHP coacciona 'password123' a un número usando sus extrañas reglas de comparación sueltas ya que el otro operando es un número, esa cadena, como la mayoría, coerces al número 0, y PHP devuelve verdadero para la comparación. – postfuturist
strcmp devolverá diferentes valores según el entorno en el que se esté ejecutando (Linux/Windows).
La razón es la que tiene un error como el informe de error dice https://bugs.php.net/bug.php?id=53999
Por favor, manejar con cuidado !! Gracias.
Siempre devolverá 0 si las cadenas son iguales. +1 por tener cuidado acerca de preocuparse por cualquier otro valor que no sea 0. –
No utilizar == en PHP. No hará lo que esperas. Incluso si está comparando cadenas con cadenas, PHP las lanzará implícitamente a flotantes y hará una comparación numérica si aparecen numéricas.
Por ejemplo '1e3' == '1000' devuelve verdadero.
Bueno ... de acuerdo con este php bug report, incluso puede obtener 0wned.
<?php
$pass = isset($_GET['pass']) ? $_GET['pass'] : '';
// Query /?pass[]= will authorize user
//strcmp and strcasecmp both are prone to this hack
if (strcasecmp($pass, '123456') == 0){
echo 'You successfully logged in.';
}
?>
Le da una advertencia, pero omita la comparación.
Debería estar haciendo ===
como se sugirió @postfuturist.
Wow +1. Cita del enlace: "Es un comportamiento establecido para la función que recibe el tipo incorrecto de argumento (s) para devolver nulo".Eso es sorprendente teniendo en cuenta que el manual solo dice esto: "Devuelve <0 si str1 es menor que str2;> 0 si str1 es mayor que str2, y 0 si son iguales". Null no se menciona como una posibilidad, sin embargo, en páginas como la página del subprograma se menciona. * suspiro * – Gerry
¿Pero sucede lo mismo cuando el método de formulario se publica ...? – Nikhil
@NikhilGeorge Sí, la función en cuestión aquí es strcmp. No importa contra qué entradas se compara. – r3dsm0k3
Recuerde siempre, al comparar cadenas, se debe utilizar ===
operador (comparación estricta) y no ==
operador (comparación suelta).
En realidad, creo que es seguro decir que debe usar '===' al comparar * cualquier cosa *. –
También La función puede ayudar en la clasificación. Para ser más claro sobre la clasificación. strcmp() devuelve menos de 0 si string1 se ordena antes que string2, mayor que 0 si string2 se ordena antes que string1 o 0 si son iguales. Por ejemplo
$first_string = "aabo";
$second_string = "aaao";
echo $n = strcmp($first_string,$second_string);
La función devolverá más que cero, ya que aaao está ordenando antes de aabo.
strcmp() y "===" son entre mayúsculas y minúsculas, pero "===" es mucho más rápido
código de ejemplo: http://snipplr.com/view/758/
comparación de cadenas usando strcmp
echo strcmp("my name","my name");
Esto no responde la pregunta en absoluto. – Pang
Resumiendo todas las respuestas:
==
es una mala idea para las comparaciones de cadenas.
Le dará resultados "sorprendentes" en muchos casos. No confíes en eso
===
está bien, y le dará el mejor rendimiento.
strcmp()
debe usarse si necesita determinar qué cadena es "mayor", generalmente para operaciones de clasificación.
¿Qué tiene que ver la sensibilidad a mayúsculas y minúsculas con 'strcmp'? – kennytm
@KennyTM: 'strcmp' distingue entre mayúsculas y minúsculas. En algunos idiomas, como VB, la comparación de cadenas puede no serlo, y por lo tanto devolvería un resultado diferente. Este no es el caso en PHP, sin embargo. – cHao
@cHao: '=' en VB distingue entre mayúsculas y minúsculas, también el idioma no. – kennytm