PHP Formulario con lista/menu guardar en MySQL

Realice un formulario en html y quiero guardar la información con php en una base de datos de mysql el problema que tengo es que en el formulario tengo una lista/menu y no se como guardar la opción que elija en la base de datos
Mi formulario es:

<html>
<body>
<form action="../php/agregarusuario.php" method="POST">
<table>
<tr>
<td align="right">
<div align="left"><span class="Estilo2">Usuario</span>:</div>
</td>
<td width="205">
<div align="left"><input type="Text" name="usuario" size="30" maxlength="25"></td>
</tr>
<tr>
<td align="right">
<div align="left"><span class="Estilo2">Contraseña:</span></div>
</td>
<td width="205">
<div align="left"><input type="password" name="password" maxlength="15"></td>
</tr>
<tr>
<td align="right">
<div align="left"><span class="Estilo2">Contraseña:</span></div>
</td>
<td>
<div align="left"><input  width="196" type="password" name="password2" maxlength="15"></div>
</td>
</tr>
<tr>
<td align="right">
<div align="left"><span class="Estilo2" >Perfil</span>:</div>
<td>
<div align="left"><select style="width:205px;"  name="perfil " class="Estilo2" id="perfil ">
            <option value="1" >COORDINADOR</option>
            <option value="2">EJECUTIVO</option></select></div>
</td>
</tr>
<tr>
<td colspan="2" align="right">
<div align="left"><label>
    <input type="submit" name="Submit" value="Enviar"></label></div>
</td>
</tr>
</table>
</form>
</body>
</html>
Mi archivo php es:<?php
mysql_connect('localhost','root','root')or die ('Ha fallado la conexión: '.mysql_error());
mysql_select_db('web')or die ('Error al seleccionar la Base de Datos: '.mysql_error());
if (isset($_POST["usuario"])) {
 $usuario = $_POST["usuario"];
 $password = $_POST["password"];
 $password2 = $_POST["password2"];
 $perfil = $_POST["perfil"];
 if($usuario==NULL|$password==NULL|$password2==NULL|$perfil==NULL) {
  echo "un campo está vacio.";
 }else{
   if($password!=$password2) {
   echo "Las contraseñas no coinciden";
   }else{
   $checkuser = mysql_query("SELECT usuario FROM perfiles WHERE usuario='$usuario'");
   $username_exist = mysql_num_rows($checkuser);
   if ($username_exist>0) {
    echo "El nombre de usuario o la cuenta de correo estan ya en uso";
   }else{
    $query = 'INSERT INTO perfiles (usuario, password, perfil)
    VALUES (\''.$usuario.'\',\''.$password.'\',\''.$perfil.'\')';
    mysql_query($query) or die(mysql_error());
   }}}
}else{
 formRegistro();
}
?>

1 Respuesta

Respuesta
2
Por lo que he entendido es que no sabes si guardarlo con el valor que recibe del VALUE (numérico) o si guardarlo como una cadena de texto(Coordinador o ejecutivo), en cuyo caso tendrías que hacer una condición para saber que opción ha seleccionado y guardarlo en otra variable como texto.
En el primer caso, el campo en la base de datos tendrá que ser del tipo INT(1) y siempre que recojas ese dato tendrás que tener en cuenta el valor que adquiere, 1=coordinador y 2=ejecutivo.
En el otro caso tendrías que preguntarle un par de condiciones antes de guardarlo como texto, por ejemplo:
//Si el valor que toma es 1
if($perfil == 1){
     $perfilTexto = "coordinador";
elseif($perfil == 2){ //Si el valor que toma es 2
     $perfilTexto = "ejecutivo";
}
En este caso en la base de datos tendrías que tener un tipo char(12) o text(12) y así cuando recuperes el dato lo puedes imprimir por pantalla directamente como texto.
Gracias por responder
Lo que hice fue lo siguiente pero me regresa el mensaje de campo vacío
<?php
session_start();
mysql_connect('localhost','root','root')or die ('Ha fallado la conexión: '.mysql_error());
mysql_select_db('web')or die ('Error al seleccionar la Base de Datos: '.mysql_error());
if (isset($_POST["usuario"])) {
 $nombre = $_POST["nombre"];
 $apellidos = $_POST["apellidos"];
 $usuario = $_POST["usuario"];
 $password = $_POST["password"];
 $perfil = $_POST["perfil"];
 if($nombre==NULL|$apellidos==NULL|$usuario==NULL|$password==NULL|$perfil==NULL) {
  echo "un campo está vacio.";
 }else{
  // ¿Coinciden las contraseñas?
   if($password!=$password2) {
   echo "Las contraseñas no coinciden";
   }else{
   // Comprobamos si el nombre de usuario o la cuenta de correo ya existían
   $checkuser = mysql_query("SELECT usuario FROM perfiles WHERE usuario='$usuario'");
   $username_exist = mysql_num_rows($checkuser);
   if ($username_exist>0) {
    echo "El nombre de usuario o la cuenta de correo estan ya en uso";
   }else{
   if($perfil == 1){
        $perfilTexto = "COORDINADOR REGIONAL";
   }else if($perfil == 2){ 
        $perfilTexto = "COORDINADOR CAP";
   }else if($perfil == 3){
        $perfilTexto = "EJECUTIVO CAP";
   } 
    $query = 'INSERT INTO perfiles (nombre,apellidos,usuario, password, perfil)
    VALUES (\''.$nombre.'\',\''.$apellidos.'\',\''.$usuario.'\',\''.$password.'\',\''.$perfilTexto.'\')';
    mysql_query($query) or die(mysql_error());
    echo 'El usuario '.$usuario.' ha sido registrado de manera satisfactoria.<br />';
    echo 'Ahora puede entrar ingresando su usuario y su password <br />';
   }
  }
 }
}else{
 formRegistro();
}
?>
¿El mensaje de campo vacío te lo devuelve de la base de datos? Muchas veces viene bien imprimir los datos antes de insertarlos en la BD, para ver exactamente lo que se va a guardar.
Y en lo único que te puedo poner alga pega es en esta condición:
if($nombre==NULL|$apellidos==NULL|$usuario==NULL|$password==NULL|$perfil==NULL) {}
De la que das por hecho que los campos cuando están vacios valen NULL, eso no es del todo cierto, porque pueden contener un espacio en blanco, por lo que tendrías que ampliar la condición a algo así: if(($nombre==NULL || $nombre=='') || ($apellidos==NULL || $apellidos=='') || ($usuario==NULL || $usuario=='') || ($password==NULL || $password=='') || ($perfil==NULL || $perfil==''))
La consulta del INSERT, es más fácil si lo haces de esta forma y así se evita líos con las comillas y las barras de escape, prueba por si tuviese algo que ver
$query = "INSERT INTO perfiles (nombre,apellidos,usuario, password, perfil)
    VALUES ('$nombre','$apellidos','$usuario','$password','$perfilTexto')";
Hola ! Que cree que sigue igual ya le hice los cambios que me sugirió y me sigue mandando el mismo mensaje.
También le quite la validación del null y al momento de guardar los datos si me los almacena todos excepto el perfil que es la lista de formulario.
<?php
session_start();
//datos para establecer la conexion con la base de mysql.
mysql_connect('localhost','root','root')or die ('Ha fallado la conexión: '.mysql_error());
mysql_select_db('web')or die ('Error al seleccionar la Base de Datos: '.mysql_error());
// verificamos si se han enviado ya las variables necesarias.
if (isset($_POST["usuario"])) {
 $nombre = $_POST["nombre"];
 $apellidos = $_POST["apellidos"];
 $usuario = $_POST["usuario"];
 $password = $_POST["password"];
 $perfilTexto = $_POST["perfil"];
// Hay campos en blanco
 if(($nombre==NULL || $nombre=='') || ($apellidos==NULL || $apellidos=='') || ($usuario==NULL || $usuario=='') || ($password==NULL || $password=='') || ($perfilTexto==NULL || $perfilTexto=='')) {
  echo "un campo está vacio.";
 }else{
  if($password!=$password2) {
   echo "Las contraseñas no coinciden";
   }else{
   $checkuser = mysql_query("SELECT usuario FROM perfiles WHERE usuario='$usuario'");
   $username_exist = mysql_num_rows($checkuser);
   if ($username_exist>0) {
    echo "El nombre de usuario o la cuenta de correo estan ya en uso";
   }else{
   if($perfil == 1){
        $perfilTexto = "COORDINADOR REGIONAL";
   }else if($perfil == 2){
        $perfilTexto = "COORDINADOR CAP";
   }else if($perfil == 3){
        $perfilTexto = "EJECUTIVO CAP";
   } 
    $query = "INSERT INTO perfiles (nombre,apellidos,usuario, password, perfil)
    VALUES ('$nombre','$apellidos','$usuario','$password','$perfilTexto')";
    mysql_query($query) or die(mysql_error());
    echo 'El usuario '.$usuario.' ha sido registrado de manera satisfactoria.<br />';
    echo 'Ahora puede entrar ingresando su usuario y su password <br />';
   }
  }
 }
}else{
 formRegistro();
}
?>
Prueba a cambiar el nombre de la variable que recoje el dato, actualmente tiene: $perfilTexto = $_POST["perfil"];
Donde tendría que tener: $perfil = $_POST["perfil"];
Porque de esa forma en las condiciones está preguntando por una variable que no tiene nada almacenado.
Hola ! Que cree que no sigue igual me muestra el mismo mensaje "hay un campo vacío" ya le cambie una variable por otra y todo pero sigue igual.
Me surgieron algunas dudas
1. El formulario debe ser con extensión .php igual que el archivo de control
2. Se tiene que hace alguna otra configuración en el formulario
haaa se me olvidaba esta es mi tabla que cree
CREATE TABLE `perfiles` (
  `nombre` varchar(25) NOT NULL,
  `apellidos` varchar(40) NOT NULL,
  `usuario` varchar(20) NOT NULL,
  `password` varchar(10) NOT NULL,
  `perfil` varchar(20) NOT NULL,
  PRIMARY KEY  (`usuario`)
)
Gracias de nuevo!
Me he tomado la libertad de hacer algunas modificaciones para optimizar el código y para que quede más 'limpio'
A la base de datos le he incluido un campo que se auto incrementa y lo he hecho clave única, por la que te podrás guiar más fácilmente a la hora de utilizar los datos
CREATE TABLE IF NOT EXISTS `perfiles` (
  `Id_usuario` int(6) NOT NULL AUTO_INCREMENT,
`nombre` varchar(25) NOT NULL,
`apellidos` varchar(40) NOT NULL,
`usuario` varchar(20) NOT NULL,
`password` varchar(10) NOT NULL,
`perfil` varchar(25) NOT NULL,
  UNIQUE KEY `id_usuario` (`id_usuario`)
)
Por otro lado te copio el html:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<title>Formulario de registro</title>
</head>
<body>
<table>
<form action="agregarusuario.php" method="post">
<tr>
<td align="right">
<div align="left"><span class="Estilo2">Usuario</span>:</div>
</td>
<td width="205">
<div align="left"><input type="Text" name="usuario" size="30" maxlength="25"></div>
</td>
</tr>
<tr>
<td align="right">
<div align="left"><span class="Estilo2">Contrase&ntilde;a:</span></div>
</td>
<td width="205">
<div align="left"><input type="password" name="password" maxlength="15"></td>
</tr>
<tr>
<td align="right">
<div align="left"><span class="Estilo2">Contrase&ntilde;a:</span></div>
</td>
<td>
<div align="left"><input  width="196" type="password" name="password2" maxlength="15"></div>
</td>
</tr>
<tr>
<td align="right">
<div align="left"><span class="Estilo2" >Perfil</span>:</div>
</td>
<td>
<div align="left">
        <select name="perfil" style="width:205px;">
            <option value="1">COORDINADOR REGIONAL</option>
            <option value="2">COORDINADOR CAP</option>
            <option value="3">EJECUTIVO CAP</option>
        </select>
    </div>
</td>
</tr>
<tr>
<td colspan="2" align="right">
<div align="left"><label><input type="submit" name="Submit" value="Enviar" /></label></div>
</td>
</tr>
</form>
</table>
</body>
</html>
Te lo he organizado un poco y ten en cuenta que es mejor meter un formulario dentro de una tabla que al revés, ya que esto hacía que la variable perfil llegase con un guion bajo detrás y era por eso que siempre lo recibías vacío, porque la variable llegaba así: $_POST['perfil_']; Un truco para ver todas las variables que llegan por POST => print_r($_POST); Con esto te muestra todo el array, incluyendo el nombre de la variable, que es lo que me ha dado la pista del fallo.
Y por último el código que recibe los datos y los guarda:
<?php
//Recogemos las variables y les damos un valor según si existen y no estan vacias
$usuario = isset($_POST['password']) && $_POST['usuario']!='' ? $_POST['usuario'] : NULL;
$password = isset($_POST['password']) && $_POST['password']!='' ? $_POST['password'] : NULL;
$password2 = isset($_POST['password2']) && $_POST['password2']!='' ? $_POST['password2'] : NULL;
$perfil = isset($_POST['perfil']) && $_POST['perfil']!='' ? $_POST['perfil'] : NULL;
//Si algún campo está vacio
if($usuario==NULL || $password==NULL || $password2==NULL || $perfil==NULL) {
  echo "un campo está vacio.";
}else{
    if($password!=$password2) {
        echo "Las contraseñas no coinciden";
    }else{
        //datos para establecer la conexion con la base de mysql.
        mysql_connect('localhost','root','root')or die ('Ha fallado la conexión: '.mysql_error());
        mysql_select_db('web')or die ('Error al seleccionar la Base de Datos: '.mysql_error());
        $checkuser = mysql_query("SELECT usuario FROM perfiles WHERE usuario='$usuario'");
        $username_exist = mysql_num_rows($checkuser);
        if ($username_exist>0) {
            echo "El nombre de usuario o la cuenta de correo estan ya en uso";
        }else{
            if($perfil == 1){
                $perfilTexto = "COORDINADOR REGIONAL";
               } elseif($perfil == 2){
                $perfilTexto = "COORDINADOR CAP";
               } elseif($perfil == 3){
                $perfilTexto = "EJECUTIVO CAP";
               }
            $query = "INSERT INTO perfiles (usuario, password, perfil)
                        VALUES ('$usuario','$password','$perfilTexto')";
            mysql_query($query) or die(mysql_error());
            echo 'El usuario '.$usuario.' ha sido registrado de manera satisfactoria.<br />';
            echo 'Ahora puede entrar ingresando su usuario y su password <br />';
       }
    }//fin if($password!=$password2
}//Fin if($usuario==NULL || $password==NULL || $password2==NULL)
?>
He quitado los datos de nombre y apellidos ya que el formulario no pedía esos datos, si los quisieras incluir es bastante sencillo.
Al principio del código he utilizado los ternarios para preguntar si las variables que quiero recoger existen y no están vacías, en el caso de que no se cumpla les doy el valor NULL, para más tarde comprobar que todas las variables tienen algún dato. Para controlar que el usuario rellena todos los datos del formulario lo podrías hacer con javascript.
Por cierto te faltaba por recoger la variable 'password2' del formulario para comparar, por lo que antes siempre comparaba con una variable vacía.
No sé si me he dejado algo por el camino...

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas