1

Stackoverflow, escribo esta pregunta ya que tengo un sistema para registrar proyectos y sus correspondientes planillas.

Tengo:

  1. un formulario de registro

  2. un código php (contenido en el archivo de conexion.php como una función)que se encarga de guardar el proyecto

  3. un código php que guarda cada planilla o requisito usando como guía el ID del proyecto, esto lo guarda en una tabla anidada que contiene proyecto_id y requisito_id.

El problema esta en que el código para guardar las planillas en la tabla anidada.

al tu pulsar guardar el proyecto en el formulario de registro el guarda basándose en el código del proyecto que se generara en el campo Proyecto ID.

1) quisiera que ese valor fuera auto incremental, pero que se basara en el ultimo ID que exista en la base de datos, para el orden de 1 2 3 4, como podría hacerlo?, ya que debo escribir cada valor, me dijeron que usara el Mysql_LastinsertId, algo así, y creo que ya lo tengo en el código, pero no se como pasar ese valor al formulario de registro.

2) actualmente el sistema genera el ID autoincremental, pero guarda ese ID con un proyecto vació cada vez que se carga el formulario, por lo tanto aparece ID 6, y de una vez la base de datos se llena con un proyecto sin datos con ID 6, incapacitando guardar ese proyecto porque ya existe.

3) como se colocaría ese valor en el formulario en el campo valué?

4) según la función de obtener el last insert la tengo en la función de agregar

Muchas gracias de antemano por toda la ayuda

Códigos:

1) Función para agregar los proyectos a la base de datos (incluido en conexion.php)

function bd_proyecto_agregar($d){
$sql = sprintf("INSERT INTO proyecto(proy_id, plan_proy, proy_deno,, objg_proy, obje_proy, fech_insc, nomb_comu, resp_comu, telf_inst, telf_resp, parr_id, esta_proy_id, deta,obsv_proy)
VALUES ('%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s')",
$d['proy_id'],
    $d['plan_proy'],
    $d['proy_deno'],
    $d['objg_proy'],
    $d['obje_proy'],
    $d['fech_insc'],
    $d['nomb_comu'],
    $d['resp_comu'],
    $d['telf_inst'],
    $d['telf_resp'],
    $d['parr_id'],
    $d['esta_proy_id'],
    $d['deta'],
    $d['obsv_proy']);
$res = sql($sql);
$id  = sql2value("SELECT LAST_INSERT_ID()");
return $id;

}

2) Función de agregar los requisitos en la tabla anidada al guardar el proyecto (proc_inscripcion2.php):

<?php 
include 'conexion.php'; 
bd_proyecto_agregar($_REQUEST); 
foreach ($_REQUEST['requ'] as $requisito_id){
$requisito = array('proy_requ_id' => NULL, 'proy_id' =>   $_REQUEST['proy_id'], 'requ_id' => $requisito_id);
bd_proyecto_requisito_agregar($requisito);
} 
header("Location: listado2.php"); 
exit; 
?>

3) Código incluido en el POST del formulario de registro:

<form id="frmAgregar" class="form-horizontal" method="POST" action="proc_inscripcion2.php" role="form">

4) Código para mostrar el valor del ID autoincremental y función que se supone trae el ID de la función:

$valor= bd_proyecto_agregar($id);

<input type="text" maxlength="5" class="form-control" name="proy_id" id="proy_id" value="<?=$valor?>" placeholder="Código del Proyecto" >
  • Te recomiendo que leas sobre [inyección SQL y cómo evitarla](http://es.stackoverflow.com/q/10518/250). Tal y como está el código de arriba, es inseguro y vulnerable a ese tipo de ataques. – Alvaro Montoro Sep 07 '16 at 14:22
  • seria algo asi? https://norfipc.com/inf/como-proteger-formularios-web-evitar-inyeccion-codigo-sql.php#form2 el codigo aun esta en desarrollo quisiera corregir los errores que tiene – Victor Alejandro Alvarado Vilo Sep 07 '16 at 14:25
  • No sería exactamente como dice esa página, que parece centrarse más en ataques XSS que de inyección SQL. La idea sería que usases sentencias preparadas/parametrizadas en lugar de sentencias dinámicas. – Alvaro Montoro Sep 07 '16 at 14:36
  • algo asi? http://www.arquitecturajava.com/sql-injection-14/ – Victor Alejandro Alvarado Vilo Sep 07 '16 at 14:45

1 Answers1

1

Ya solucione este problema, hice lo siguiente:

En el formulario de registro agregue lo siguiente:

$respuestaBD= bd_id();

donde bd_id(); correspondia a:

function bd_id()
{
$sql = "SELECT MAX(proy_id) FROM proyecto";
$id=1+ sql2value($sql);
return $id;
}

Con el fin de obtener el ultimo ID registrado, le sumo 1 para vaya agregando uno nuevo, de esta manera no se afecta la base de datos.

y coloco en el value:

value="<?=$respuestaBD?>"