Formularios y entrada del usuario
procesamiento de formularios
Al procesar formularios HTML, PHP puede hacer que los elementos del formulario de la página HTML estén disponibles automáticamente para los scripts PHP.
# form.html 文件代码
<html>
<head>
<meta charset="utf-8">
<title>菜鸟教程(runoob.com)</title>
</head>
<body>
<form action="welcome.php" method="post">
名字: <input type="text" name="fname">
年龄: <input type="text" name="age">
<input type="submit" value="提交">
</form>
</body>
</html>
# welcome.php 文件代码
欢迎<?php echo $_POST["fname"]; ?>!<br>
你的年龄是 <?php echo $_POST["age"]; ?> 岁。
Obtener datos del menú desplegable
Selección de radio del menú desplegable
Utilice la etiqueta de selección para configurar las tres opciones del menú desplegable. El formulario utiliza el método GET para obtener datos. Si el valor del atributo de acción está vacío, significa que se envía al script actual. Podemos obtener el valor de el menú desplegable a través del atributo de nombre de seleccionar:
<?php
$q = isset($_GET['q'])? htmlspecialchars($_GET['q']) : '';
if($q) {
if($q =='RUNOOB') {
echo '菜鸟教程<br>http://www.runoob.com';
} else if($q =='GOOGLE') {
echo 'Google 搜索<br>http://www.google.com';
} else if($q =='TAOBAO') {
echo '淘宝<br>http://www.taobao.com';
}
} else {
?>
<form action="" method="get">
<select name="q">
<option value="">选择一个站点:</option>
<option value="RUNOOB">Runoob</option>
<option value="GOOGLE">Google</option>
<option value="TAOBAO">Taobao</option>
</select>
<input type="submit" value="提交">
</form>
<?php
}
?>
Menú desplegable selección múltiple
Si el menú desplegable es de selección múltiple (multiple="multiple"), podemos obtenerlo como una matriz configurando select name="q[]"
<?php
$q = isset($_POST['q'])? $_POST['q'] : '';
if(is_array($q)) {
$sites = array(
'RUNOOB' => '菜鸟教程: http://www.runoob.com',
'GOOGLE' => 'Google 搜索: http://www.google.com',
'TAOBAO' => '淘宝: http://www.taobao.com',
);
foreach($q as $val) {
// PHP_EOL 为常量,用于换行
echo $sites[$val] . PHP_EOL;
}
} else {
?>
<form action="" method="post">
<select multiple="multiple" name="q[]">
<option value="">选择一个站点:</option>
<option value="RUNOOB">Runoob</option>
<option value="GOOGLE">Google</option>
<option value="TAOBAO">Taobao</option>
</select>
<input type="submit" value="提交">
</form>
<?php
}
?>
formulario de botón de opción
Los valores del atributo de nombre en el formulario del botón de opción son consistentes, pero los valores de los valores son diferentes.
<?php
$q = isset($_GET['q'])? htmlspecialchars($_GET['q']) : '';
if($q) {
if($q =='RUNOOB') {
echo '菜鸟教程<br>http://www.runoob.com';
} else if($q =='GOOGLE') {
echo 'Google 搜索<br>http://www.google.com';
} else if($q =='TAOBAO') {
echo '淘宝<br>http://www.taobao.com';
}
} else {
?><form action="" method="get">
<input type="radio" name="q" value="RUNOOB" />Runoob
<input type="radio" name="q" value="GOOGLE" />Google
<input type="radio" name="q" value="TAOBAO" />Taobao
<input type="submit" value="提交">
</form>
<?php
}
?>
casilla de verificación
casilla de verificación Una casilla de verificación puede seleccionar múltiples valores, algo similar a un menú desplegable con múltiples selecciones.
<?php
$q = isset($_POST['q'])? $_POST['q'] : '';
if(is_array($q)) {
$sites = array(
'RUNOOB' => '菜鸟教程: http://www.runoob.com',
'GOOGLE' => 'Google 搜索: http://www.google.com',
'TAOBAO' => '淘宝: http://www.taobao.com',
);
foreach($q as $val) {
// PHP_EOL 为常量,用于换行
echo $sites[$val] . PHP_EOL;
}
} else {
?><form action="" method="post">
<input type="checkbox" name="q[]" value="RUNOOB"> Runoob<br>
<input type="checkbox" name="q[]" value="GOOGLE"> Google<br>
<input type="checkbox" name="q[]" value="TAOBAO"> Taobao<br>
<input type="submit" value="提交">
</form>
<?php
}
?>
validación de formulario
Debemos tener en cuenta la seguridad al procesar formularios PHP. Para evitar piratas informáticos y spam, debemos realizar una verificación de seguridad de los datos en el formulario.
Ejemplo de validación de formulario
Campo | Reglas de validación |
---|---|
nombre | debe. +solo puede contener letras y espacios |
Correo electrónico | debe. + debe ser una dirección de correo electrónico válida (contiene '@' y '.') |
URL | Opcional. Si está presente, debe contener una URL válida. |
Observación | Opcional. Campos de entrada de varias líneas (campos de texto) |
género | debe. debe elegir uno |
- campo de texto
名字: <input type="text" name="name" value="<?php echo $name;?>">
<span class="error">* <?php echo $nameErr;?></span>
<br><br>
E-mail: <input type="text" name="email" value="<?php echo $email;?>">
<span class="error">* <?php echo $emailErr;?></span>
<br><br>
网址: <input type="text" name="website" value="<?php echo $website;?>">
<span class="error"><?php echo $websiteErr;?></span>
- un solo botón
性别:
<input type="radio" name="gender" <?php if (isset($gender) && $gender=="female") echo "checked";?> value="female">女
<input type="radio" name="gender" <?php if (isset($gender) && $gender=="male") echo "checked";?> value="male">男
<span class="error">* <?php echo $genderErr;?></span>
Prevención de ataques XSS: Evite que $_SERVER["PHP_SELF"] sea explotado]
¡Los piratas informáticos pueden utilizar la variable $_SERVER["PHP_SELF"]!
Si la parte del formulario del código está escrita así:
# test_form.php为当前php脚本名,也可以写成 action="<?php echo $_SERVER["PHP_SELF"]
<form method="post" action="test_form.php">
El usuario ingresará la siguiente dirección en la barra de direcciones del navegador:
http://www.runoob.com/test_form.php/%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E
La URL anterior se analizará en el siguiente código y se ejecutará:
<form method="post" action="test_form.php/"><script>alert('hacked')</script>
Se agregó una etiqueta de secuencia de comandos al código y se agregó un comando de alerta. Este código Javascript se ejecutará cuando se cargue la página (el usuario verá un cuadro emergente)
¿Cómo evitar que $_SERVER["PHP_SELF"] sea explotado?
$_SERVER["PHP_SELF"] se puede evitar utilizando la función htmlspecialchars().
Mostrar directorio de mensajes de error
Se han agregado scripts a cada campo que mostrarán mensajes de error si se ingresa información incorrecta. (Si el usuario envía el formulario sin completar la información, se generará un mensaje de error):
<form method="post" action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']);?>">
名字: <input type="text" name="name">
<span class="error">* <?php echo $nameErr;?></span>
.
.
.
Coincidencia regular: correo electrónico de verificación y directorio URL
preg_match — realiza coincidencia de expresiones regulares
gramática:
int preg_match ( string $pattern , string $subject [, array $matches [, int $flags ]] )
# 1. 验证名称,检测 name 字段是否包含字母和空格
$name = test_input($_POST["name"]);
if (!preg_match("/^[a-zA-Z ]*$/",$name)) {
$nameErr = "只允许字母和空格";
}
# 2. 验证邮件,检测 e-mail 地址是否合法
$email = test_input($_POST["email"]);
if (!preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/",$email)) {
$emailErr = "非法邮箱格式";
}
# 3. 验证 URL
$website = test_input($_POST["website"]);
if (!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i",$website)) {
$websiteErr = "非法的 URL 的地址";
}
Recopilar datos del formulario: directorios $_GET y $_POST
- variable $_GET
La información enviada desde un formulario con el método GET es visible para todos (se mostrará en la barra de direcciones del navegador) y existen límites en la cantidad de información enviada.
- Por lo tanto, este método no debe utilizarse al enviar contraseñas u otra información confidencial.
Debido a que las variables aparecen en la URL, puede marcar la página como favorita. En algunos casos esto es útil.
- El método HTTP GET no es adecuado para valores de variables grandes. Su valor no puede exceder los 2000 caracteres.
- variable $_POST
La información enviada desde un formulario con el método POST es invisible para cualquier persona (no se mostrará en la barra de direcciones del navegador) y no hay límite en la cantidad de información enviada.
- variable $_REQUEST
La variable $_REQUEST predefinida incluye GET, _GET,GRAMOET , _POST y el contenido de $_COOKIE.
La variable $_REQUEST se puede utilizar para recopilar datos de formularios enviados mediante los métodos GET y POST.