As an achievement Insert data in relational table PHP and MYSQL

0

Very Good ... I keep trying to learn to ask questions on this prestigious site. I managed to upload an image where three tables are displayed that I hope are well related but so far I can not do INSERT in the second or in the third table, as I could do using PHP with Mysqli?

-- Estructura de tabla para la tabla 'certificado'
--

CREATE TABLE 'certificado' (
  'id_certifica' int(100) NOT NULL,
  'certi_nombre' varchar(120) COLLATE utf8_spanish_ci NOT NULL COMMENT 'Nombre del usuario Certificado',
  'certi_ced' int(100) NOT NULL COMMENT 'Cedula',
  'certi_curso' varchar(120) COLLATE utf8_spanish_ci NOT NULL COMMENT 'Curso Certificado',
  'fecha_desde' date NOT NULL,
  'certi_ciudad' varchar(120) COLLATE utf8_spanish_ci NOT NULL,
  'fecha_hasta' date NOT NULL,
  'certi_nivel' varchar(100) COLLATE utf8_spanish_ci NOT NULL COMMENT 'Nivel de Certificacion',
  'inte_horaria' varchar(20) COLLATE utf8_spanish_ci NOT NULL COMMENT 'Intensidad de horas',
  'dia_firma' varchar(120) COLLATE utf8_spanish_ci NOT NULL COMMENT 'Dia Firmado',
  'mes_firma' varchar(120) COLLATE utf8_spanish_ci NOT NULL COMMENT 'Mes Firmado',
  'factura_numero' int(120) NOT NULL COMMENT 'Codigo de la Fatura',
  'estado' varchar(100) CHARACTER SET utf8 COLLATE utf8_spanish2_ci NOT NULL COMMENT 'Estado del Correo',
  'enviado' int(11) NOT NULL COMMENT 'Reporta envío de Correo',
  'cod_certifica' int(100) NOT NULL COMMENT 'Codigo Unico del Certificado',
  'fecha_registro' timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'Fechas de Modificacion',
  'usuario' varchar(120) CHARACTER SET utf8 COLLATE utf8_slovenian_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci;

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla 'facturacion'
--

CREATE TABLE 'facturacion' (
  'ingreso_cod' int(100) NOT NULL,
  'cliente' varchar(120) COLLATE utf8_spanish2_ci NOT NULL COMMENT 'Factura Generada a:',
  'oingreso' int(50) NOT NULL COMMENT 'Orden de Ingreso',
  'num_fac' int(50) NOT NULL COMMENT 'Numero o Consecutivo de factura',
  'estado_fac' varchar(100) COLLATE utf8_spanish2_ci NOT NULL COMMENT 'Estado de la Factura'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish2_ci COMMENT='Facturacion';

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla 'ingresos'
--

CREATE TABLE 'ingresos' (
  'cod_ingreso' int(100) NOT NULL,
  'cedula' int(100) NOT NULL COMMENT 'Cedula',
  'nombre' varchar(120) COLLATE utf8_spanish2_ci NOT NULL COMMENT 'Primer Nombre',
  'nombres' varchar(120) COLLATE utf8_spanish2_ci NOT NULL COMMENT 'Segundo Nombre',
  'apellido' varchar(120) COLLATE utf8_spanish2_ci NOT NULL COMMENT 'Primer Apellido',
  'apellidos' varchar(120) COLLATE utf8_spanish2_ci NOT NULL COMMENT 'Segundo Apeliido',
  'tipo_ced' varchar(30) COLLATE utf8_spanish2_ci NOT NULL COMMENT 'Tipo de Cedula',
  'genero' varchar(100) COLLATE utf8_spanish2_ci NOT NULL,
  'pais_nac' varchar(100) COLLATE utf8_spanish2_ci NOT NULL,
  'fecha' date NOT NULL,
  'f_nacimiento' date NOT NULL,
  'tipo_sangre' varchar(100) COLLATE utf8_spanish2_ci NOT NULL,
  'formacion' varchar(120) COLLATE utf8_spanish2_ci NOT NULL,
  'g_sangre' varchar(100) COLLATE utf8_spanish2_ci NOT NULL,
  'nivel' varchar(100) COLLATE utf8_spanish2_ci NOT NULL,
  'nivel_edu' varchar(100) COLLATE utf8_spanish2_ci NOT NULL,
  'sector' varchar(100) COLLATE utf8_spanish2_ci NOT NULL,
  'cargo' varchar(100) COLLATE utf8_spanish2_ci NOT NULL,
  'nivel_l_e' varchar(100) COLLATE utf8_spanish2_ci NOT NULL,
  's_social' varchar(100) COLLATE utf8_spanish2_ci NOT NULL,
  'o_servicio_ext' varchar(100) COLLATE utf8_spanish2_ci NOT NULL,
  'empresa' varchar(100) COLLATE utf8_spanish2_ci NOT NULL,
  'empresa_temp' varchar(100) COLLATE utf8_spanish2_ci NOT NULL,
  'alergia' varchar(100) COLLATE utf8_spanish2_ci NOT NULL,
  'enfermedades' varchar(100) COLLATE utf8_spanish2_ci NOT NULL,
  'lesiones' varchar(100) COLLATE utf8_spanish2_ci NOT NULL,
  'medicamentos' varchar(100) COLLATE utf8_spanish2_ci NOT NULL,
  'n_contacto' varchar(100) COLLATE utf8_spanish2_ci NOT NULL,
  'tipo_factura' varchar(100) COLLATE utf8_spanish2_ci NOT NULL COMMENT 'Tipo de Factura',
  'tel_contacto' int(100) NOT NULL,
  'c_contacto' varchar(100) COLLATE utf8_spanish2_ci NOT NULL,
  'doc_cumple' varchar(100) COLLATE utf8_spanish2_ci NOT NULL,
  'text_cumple' varchar(100) COLLATE utf8_spanish2_ci NOT NULL,
  'imagen' varchar(100) COLLATE utf8_spanish2_ci NOT NULL,
  'fecha_modifica' timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish2_ci COMMENT='Table de Ingresos';

-- Indices de la tabla 'certificado'
--
ALTER TABLE 'certificado'
  ADD PRIMARY KEY ('id_certifica'),
  ADD KEY 'factura_numero' ('factura_numero'),
  ADD KEY 'factura_numero_2' ('factura_numero');

--
-- Indices de la tabla 'facturacion'
--
ALTER TABLE 'facturacion'
  ADD PRIMARY KEY ('num_fac'),
  ADD KEY 'ingreso_cod' ('ingreso_cod');

-- Indices de la tabla 'ingresos'
--
ALTER TABLE 'ingresos'
  ADD PRIMARY KEY ('cod_ingreso'),
  ADD UNIQUE KEY 'cod_ingreso' ('cod_ingreso');

-- Filtros para la tabla 'certificado'
--
ALTER TABLE 'certificado'
  ADD CONSTRAINT 'certificado_ibfk_1' FOREIGN KEY ('factura_numero') REFERENCES 'facturacion' ('num_fac') ON DELETE CASCADE ON UPDATE CASCADE;

--
-- Filtros para la tabla 'facturacion'
--
ALTER TABLE 'facturacion'
  ADD CONSTRAINT 'facturacion_ibfk_1' FOREIGN KEY ('ingreso_cod') REFERENCES 'ingresos' ('cod_ingreso') ON DELETE CASCADE ON UPDATE CASCADE;

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; 

This is the PHP code I'm using to make the INSERT

    require("conect.php");

$conexion=mysqli_connect($db_host, $db_usuario, $db_contra);

if(mysqli_connect_errno()){

  echo "No lograste conectarte ! VERIFICA";

  exit(); 
}

mysqli_select_db($conexion, $db_nombre) or die ("No se encontró la Base de Datos");
mysqli_set_charset($conexion, "utf8");


$insertar = "INSERT INTO facturacion (ingreso_cod, cliente, oingreso, num_fac, estado_fac) VALUES (".$_POST['ingreso_cod']. ",'".$_POST['cliente']. "', ".$_POST['oingreso'].",".$_POST['num_fac'].",".$_POST['estado_fac'].")";

echo $insertar . "<br>";

$resultado = $mysqli->query($insertar);

if(!$resultado)
{
      echo "El Ingreso de factura que desea realizar no es permitido";
}
else{

  echo "El Ingreso de factura que realizó fue satisfactorio" ;
    
asked by Rsistemas 11.07.2018 в 23:24
source

1 answer

0

Based on the comments, I leave this answer which consists of the following:

  • Secure the code by applying prepared queries. In the essential parts I comment within the same code how they work.
  • Collect properly the values passed by POST. Here I used ternary to assign NULL when some data does not exist in the POST. You can change NULL to another value, such as an empty string, especially in fields that do not support NULL .
  • Apply a controlled code style that consists simply of collecting the eventualities of the code in an array. When successful, a mensaje key is recorded in the array with an appropriate message. When there is an error, a key error is recorded in the array with the error message. In the end I only print the array, but it can be used differently to determine the status of the code, if it was successful or wrong.

That is the essential. I hope it helps you. If you do not understand something, you can say it in comments.

<?php 
    require("conect.php");
    $conexion = new mysqli($db_host, $db_usuario, $db_contra, $db_nombre);
    $arrResult=array();
    if(!$conexion){
        $arrResult['error'] = "No lograste conectarte ! VERIFICA";
    }else{
        $conexion->set_charset("utf8");
        /*
            Se deben verificar las variables pasadas en el POST
            a mi me gusta esta técnica en la cual se usa un operador ternario
            para hacer la evaluación 
            y asignar NULL (puede ser otro valor como una cadena vacía)
            cuando el dato no esté en el POST
            Si por ejemplo hay una o varias columnas que nunca pueden ser NULL,
            entonces nosotros podemos controlar que el insert no se haga
            poniendo un if ($columnaX && $columnaY) {  ....
        */

        $ingreso_cod=(!empty($_POST['ingreso_cod'])) ?   $_POST['ingreso_cod'] : NULL;
        $cliente    =(!empty($_POST['cliente']))     ?   $_POST['cliente']     : NULL;
        $oingreso   =(!empty($_POST['oingreso']))    ?   $_POST['oingreso']    : NULL;
        $num_fac    =(!empty($_POST['num_fac']))     ?   $_POST['num_fac']     : NULL;
        $estado_fac =(!empty($_POST['estado_fac']))  ?   $_POST['estado_fac']  : NULL;

        /*
            Las consultas preparadas constan de dos partes
            la 1ª es la consulta en sí, a la cual no se le escriben los valores
            pues ese es el peligro de la Inyección.
            En lugar de los valores de ponen marcadores ?
        */
        $strSQL =  "INSERT INTO facturacion (
                                                ingreso_cod, 
                                                cliente, 
                                                oingreso, 
                                                num_fac, 
                                                estado_fac
                                            )
                                    VALUES   (  ?,?,?,?,?  )";


        $stmt = $conexion->prepare($strSQL);

        /*
            Esta es la 2ª parte importante, aquí se pasan los valores
            y el manejador elimina cualquier inyección
            Hay dos grupos de parámetros que se pasan en bind_param
            - el 1º son letras como "isiis", ahí cada inicial indica el tipo
              de dato que es cada columna (i)nteger o (s)tring...
              el orden de letras es el que corresponde a cada columna como están puestas
              más arriba en $strSQL
            - el 2º son los valores correspondientes a cada columna,
              pasados a través de las variables que ya recogimos en el POST
        */
        $stmt->bind_param("isiis",$ingreso_cod,$cliente,$oingreso,$num_fac,$estado_fac);

        if(!$stmt->execute()){
              $arrResult['error'] = "El Ingreso de factura que desea realizar no es permitido. ".$conexion->error;
        }else{
            /*Esto es sólo un gadget :) */
            $totalInsert=$stmt->affected_rows;  
            $mensaje=($totalInsert > 0) ? "Se ha insertado correctamente" : "No fue posible la inserción. Error: ".$stmt->error;  
            $arrResult['mensaje'] = $mensaje;
        }
    }
?>
    
answered by 13.07.2018 / 06:51
source