2010-04-09 8 views
5

Puede sonar extraño, pero en mi aplicación PHP necesito comprobar si el mismo nombre de variable ha sido declarado más de una vez en la cadena de consulta o variables POST y devuelve un valor de error si este es el caso. Si mi aplicación no devuelve un error en este caso, falla una verificación de cumplimiento.PHP: Cómo comprobar si la cadena de consulta o los valores POST contienen la misma var dos veces

Al acceder a vars utilizando $ _GET, $ _POST, etc., PHP solo devuelve el último valor dado para cada nombre de variable. No puedo encontrar una manera de saber si alguna variable apareció más de una vez.

Simplemente necesito averiguar si la cadena de consulta o las variables en el cuerpo POST contenían el mismo nombre de variable más de una vez, cualesquiera que sean los valores.

Ejemplo

Mi aplicación se supone que devuelve un error para esta cadena de consulta:

verb=ListIdentifiers&metadataPrefix=oai_dc&metadataPrefix=oai_dc 

Tenga en cuenta que "metadataPrefix" se define en dos ocasiones.

Mi solicitud no debe devolver un error para esta cadena de consulta:

verb=ListIdentifiers&metadataPrefix=oai_dc 
+0

estoy empezando a pensar "expresión regular". Hmm no sé cómo lo haría sin embargo. – thomasrutter

+0

¿Se puede publicar el código de muestra? –

Respuesta

10

peticiones POST

$input = file_get_contents('php://input'); 

(O $HTTP_RAW_POST_DATA (docs))

peticiones GET

$input = $_SERVER['QUERY_STRING']; 

Procesamiento
explode('&', $input) y mantener una matriz - $foundKeys - de claves (la parte de cada elemento desde explode() antes del carácter =). Si presionas una tecla ya definida en $foundKeys, lanza el error.

+0

Acerca de la parte "Procesamiento": si conoció el argumento posiblemente duplicado por adelantado, digamos "metadataPrefix", puede buscar varias coincidencias en "metadataPrefix =" al comienzo de cada elemento 'explde()''ed. – jensgram

+0

... o use 'substr_count()' como se propone en la respuesta de @Christopher Nadeau, eliminando la necesidad de 'explotar()' en primer lugar :) – jensgram

+0

thx - explode ('&', $ input) es agradable y fácil – thomasrutter

-1

Si esperas múltiples valores con nombre de la variable con corchetes en el final. De esta forma obtienes una matriz para esa variable. Si se establecen múltiples valores, la matriz tendrá múltiples entradas.

<input type="checkbox" name="my_var[]" value="a"> 
<input type="checkbox" name="my_var[]" value="b"> 

$ _POST [ 'my_var'] será una matriz, ya sea con 'a' o 'b', ambas, o ninguna, dependiendo de las casillas de verificación utiliza.

2

Para obtener datos GET, consulte $_SERVER['QUERY_STRING']. Pero para los datos de POST, deberá leer los datos de POST sin procesar de la secuencia php://input.

Así que algo como esto:

// GET data: 
$raw = $_SERVER['QUERY_STRING']; 

// Or for POST data: 
$raw = file_get_contents("php://input"); 

if (substr_count('&'.$raw, '&metadataPrefix=') > 1) 
    die('Error'); 
print_r($raw); //post vars 
0

PHP $ _POST siempre establece un único valor por variable a menos que la solicitud de nombre de variable termina con [].

Si no tiene control sobre las variables que se envían, puede intentar usar $ _SERVER ['RAW_HTTP_POST_DATA'] para obtener los datos originales de solicitud POST antes de analizarlos, luego puede usar la función parse_str() para analizar esa cadena .

Solo tenga cuidado de que la configuración de PHP se haya deshabilitado configurando el valor RAW_HTTP_POST_DATA. En ese caso, no puede hacer nada para resolver su problema.

0

No completamente a prueba de tontos, pero esto podría funcionar

$occurrences = substr_count($_SERVER['QUERY_STRING'], 'metadataPrefix='); 
Cuestiones relacionadas