TransWikia.com

¿Por que al querer insertar una variable a mi BD me da parse error?

Stack Overflow en español Asked by Diego Goncalves on August 26, 2021

estoy teniendo un problema, Intento pasarle los datos de el formulario a mi a base de datos y me sale un parse error, como ven en el codigo, para tomar los datos del select utilizo un array y un for para recorrer todas las opciones y que me indican hacia que tabla deberian enviarse cada uno de los datos ingresados en el formulario, el parse error es este:
Parse error: syntax error, unexpected ‘$nombre’ (T_VARIABLE)

si tienen alguna sugerencia tambien sientanse libres de indicarmela para mejorar el codigo

<div class="formulario-registro">
        
        <form action="registro-obreros.php" method="POST">
            
            <label for="nombre">Nombre</label>
            <input type='text' name="nombre" placeholder="Nombre del obrero" size="25" maxlength="20" minlength="3" required>

            <br />

            <label for="apellido">Apellido</label>
            <input type='text' name="apellido" placeholder="Apellido del obrero" size="25" maxlength="20" minlength="3" required>

            <br />

            <label for="cedula">Cedula</label>
            <input type='text' name="cedula" placeholder="Cedula del obrero" size="25" maxlength="12" minlength="3" required>

            <br />

            <label for="direccion">Direccion</label>
            <input type='text' name="direccion" placeholder="Direccion del obrero" size="25" maxlength="30" minlength="3" >

            <br />

            <label for="telefono">Telefono</label>
            <input type='text' name="telefono" placeholder="Telefono del obrero" size="25" maxlength="12" minlength="3" >

            <br />
            <br />

            <label for="cargo">Cargo</label>
            <select name="cargo[]">
                  <option value="administracion"> Administracion </option>
                  <option value="docente"> Docente </option>
                  <option value="limpieza"> Limpieza </option>
                  <option value="vigilante"> Vigilante </option>
            </select>

            <br />

             <input class="boton-registro" type="submit" name="registrar" placeholder="Registrar" value="Registrar" required>

        </form>

        </div>
<?php 

        $servidor="localhost";
        $usuario="root";
        $password="17122001";
        $db="sistema";

        $conexion= new mysqli($servidor,$usuario,$password,$db);


        $nombre=$_POST["nombre"];
        $apellido=$_POST["apellido"];
        $cedula=$_POST["cedula"];
        $direccion=$_POST["direccion"];
        $telefono=$_POST["telefono"];
        $cargo=$_POST["cargo"];
        
        for ($i=0;$i<count($cargo);$i++)    
        {     
            if($cargo[i] == administracion) {
                $sql="INSERT INTO administracion (nombre,apellido,cedula,direccion,telefono)
                VALUES ("$nombre","$apellido","$cedula","$direccion","$telefono")";
            } 

            elseif ($cargo[i] == docente) {
                $sql="INSERT INTO docente (nombre,apellido,cedula,direccion,telefono)
                VALUES ("$nombre","$apellido","$cedula","$direccion","$telefono")";
            }

            elseif ($cargo[i] == limpieza) {
                $sql="INSERT INTO limpieza (nombre,apellido,cedula,direccion,telefono)
                VALUES ("$nombre","$apellido","$cedula","$direccion","$telefono")";
            }

            else {
                $sql="INSERT INTO vigilante (nombre,apellido,cedula,direccion,telefono)
                VALUES ("$nombre","$apellido","$cedula","$direccion","$telefono")";
            }

        } 

?>

One Answer

Prueba escapar las dobles comillas de la consulta.

//...
if($cargo[i] == administracion) {
    $sql="INSERT INTO administracion (nombre,apellido,cedula,direccion,telefono)
    VALUES ("$nombre","$apellido","$cedula","$direccion","$telefono")";
}
//...

PHP trata todo lo que está entre comillas dobles como texto, también el contenido de las variables.

Cuando usas las comillas dobles para que la consulta trate como un texto las variables que le añades, interpreta que estas abriendo y cerrando distintos bloques de texto.

Ejemplo de texto literal:

echo 'Esto es un "bloque" de texto';
     ^                            ^
     1                            2
  1. Abre el bloque de texto.
  2. Cierra el bloque de texto.

Pero cuando usas las comillas dobles con variables...

$var = 'bloque';
echo "Esto es un "$var" de texto";
     ^           ^    ^         ^
     1           2    3         4
  1. Abre el bloque de texto.
  2. Cierra el bloque de texto.
  3. Abre el bloque de texto.
  4. Cierra el bloque de texto.

Lo que hay entre los puntos 2 y 3 es la variable que debe ser interpretada, que está fuera de los bloques y ahí es donde lanza el error.

En este caso para evitar el error se puede concatenar la variable a los bloques de texto.

echo "Esto es un " . $var . " de texto";
                   ^      ^
                   a      b

Existen varias opciones para solucionarlo, puedes escapar las comillas, usar las comillas simples o concatenar las variables entre otras. A gusto del consumidor.

Ejemplo 1 escapando comillas

//...
if($cargo[i] == administracion) {
    $sql="INSERT INTO administracion (nombre,apellido,cedula,direccion,telefono)
    VALUES ("$nombre","$apellido","$cedula","$direccion","$telefono")";
}
//...

Ejemplo 2 usando comillas simples para las variables dentro de la consulta

//...
if($cargo[i] == administracion) {
    $sql="INSERT INTO administracion (nombre,apellido,cedula,direccion,telefono)
    VALUES ('$nombre','$apellido','$cedula','$direccion','$telefono');
}
//...

Ejemplo 3, desaconsejado por ser muy confuso, pero me los he encontrado.
Concatenando los bloques de texto

//...
if($cargo[i] == administracion) {
    $sql='INSERT INTO administracion (nombre,apellido,cedula,direccion,telefono)
    VALUES ("'.$nombre.'","'.$apellido.'","'.$cedula.'","'.$direccion.'","'.$telefono.'")';
}
//...

Por último y es solo informativo, no se recomienda introducir las variables en las consultas sin antes validar y/o filtrar su contenido.

Creo que no me he dejado nada. Si ven algún error comenten o editen.

Correct answer by OscarR on August 26, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP