> Faqs > problema al procesar script PHP en la misma página

problema al procesar script PHP en la misma página

Cordial saludo, agradezco la oportunidad de ayudarme con este tema, estoy realizando un sistema de informacion en php, tengo un inconveniente, esoy intentando enviar unos datos a traves de un formulario de registro en un modal, quiero que el script se procese en la misma pagina, pero cuando envio el formulario muestra una fagina de "not found", como sino encontrara la pagina en la cual se esta procesando el envio de los datos. el codigo que utilizo es el siguiente.

aclaracion: este mismo codigo lo estoy utilizando en otra seccion con otro modal y si me funciona. he cambiado el nombre de algunas variables que se han declarado en el codigo para que no generen conflicto ya que los dos modales estan en el misma pagina principal.

la redirección va hacia un pagina llamada Programa.php a traves de un id que ya ha sido captado previamente ya que los modals se encuentran en la misma pagina y no hay problema con eso.

Este es el codigo: la pagina modal se llama AsignarAsignatura.php ---> mas adelante comparto támbien el codigo del otro modal donde la pagina se llama CrearPensum.php "allí el escript funciona y no muestra el error de not found"

<?php
// Incluimos la conexión existente con la DB.
require('../Conexion/conexion.php');
// Se captan en las variables los datos provenientes de los campos del formulario.  

if(!empty($_POST)){

// Se crea la consulta a la tabla para hacer la validación y comparación de los datos.
$consultaRg2 = $conn->prepare("SELECT * FROM tbpensumcontenido WHERE Pensum = :codPensum && asignatura = :nombreAsig LIMIT 1;");
$consultaRg2->execute([':codPensum'=>$_POST['txtIdPensum'], ':nombreAsig'=>$_POST['txtAsig']]);
$numeroDeFilas2 = $consultaRg2->fetch(PDO::FETCH_ASSOC);

if(!empty($numeroDeFilas2)){ //Si el resultado es la existencia de algún registro con los mismos datos comparados entonces se ejecute el siguiente script.
   ?>.
<script>
    // Creamos la variable "mensaje" e Ingresamos un mensaje a mostrar
    alert("Ya existe una asignatura asociada con ese nombre al pensum actual en la base de datos del sistema.\nSi desea asociar una nueva asignatura al pensum, por favor haga clic en el botón aceptar.");

</script>
	
<?php
} else {
    // Se Procede con la insercion del registro en la DB.
    $sSQLInsert2 = $conn->prepare("INSERT INTO tbpensumcontenido(Pensum, asignatura, nivel, creditos, totalHoras) VALUES(:Pensum, :Asignatura, :Nivel, :Creditos, :THoras)");
    
    //Se asignan valores a los parametros.
    $sSQLInsert2->bindParam(':Pensum',$_POST['txtIdPensum']);
    $sSQLInsert2->bindParam(':Asignatura',$_POST['txtAsig']);
    $sSQLInsert2->bindParam(':Nivel',$_POST['txtNivel']);
    $sSQLInsert2->bindParam(':Creditos',$_POST['txtCreditos']);
    $sSQLInsert2->bindParam(':THoras',$_POST['txtHoras']);
  
    $sSQLInsert2->execute();
    
    if($sSQLInsert2){
        header('location: ../Pages/Programa.php?id='.$_POST['txtIdPrograma']);
      
    }
}
}
?>

<head>
<link href="../StyleSheet/Estilos_IncludeModalAsignarAsignatura.css" rel="stylesheet" type="text/css" />
<link href="../StyleSheet/thema.css" rel="stylesheet" type="text/css" />
</script>
</head>
<main class="containerPpal"><br>
      <div id="capafrmRegistrar">
          <div id="tituloAsignarAsignatura" class="ColorTheme">ASIGNAR ASIGNATURA</div>
          <div class="CerrarModalAsignarAsignatura ColorTheme"><a id="btnCerrar" href="javascript:CloseModalAsignarAsignatura();" title="Cerrar" >X</a></div>
          <form id="frmAsignarAsignatura" name="frmAsignarAsignatura" method="post" action="AsignarAsignatura.php" autocomplete="off">
              <input type="text" id="txtIdPensum" name="txtIdPensum" value="<?=$Pensum['idPensum']?>" style="float: right; margin-right: 12px; margin-top:1px;display: block;" readonly>
              <section class="body-form2">
                <div class="campos-BigWidth2"> 
                     <div id="capaetqAsig"> ASIGNATURA *</div>
                      <div id="capatxtAsig">
                          <select name="txtAsig" id="txtAsig" required>
                                <option value="">--- Seleccione ---</option>
                                <?php
                                require('../Conexion/conexion.php');
                                $consultAsig = $conn->prepare("SELECT * FROM tbasignatura");
                                $consultAsig->execute();
                                $resultadoAsig = $consultAsig->fetchAll(PDO::FETCH_ASSOC);
                                foreach($resultadoAsig as $asignatura){
                                    ?>
                                    <option value="<?=$asignatura['codigoAsignatura']?>"><?=$asignatura['nombreAsignatura']?></option>
                                  <?php }; ?> 
                            </select>
                      </div>
                </div>
                <div class="campos2"> 
                      <div id="capaetqHoras"> T. HORAS*</div>
                      <div id="capatxtHoras"><input name="txtHoras" type="text" id="txtHoras" required />
                      </div>
                </div>
                <div class="campos2"> 
                      <div id="capaetqCreditos"> CREDITOS *</div>
                      <div id="capatxtCreditos"><input name="txtCreditos" type="text" id="txtCreditos" required />
                      </div>
                </div>
                <div class="campos-BigWidth2"> 
                      <div id="capaetqNivel"> NIVEL *</div>
                      <div id="capatxtNivel">
                          <select name="txtNivel" id="txtNivel" required>
                          <option value="">--- Seleccione ---</option>
                                <?php
                                require('../Conexion/conexion.php');
                                $consultaNivel = $conn->prepare("SELECT * FROM tbnivelsemestre");
                                $consultaNivel->execute();
                                $resultadoNivel = $consultaNivel->fetchAll(PDO::FETCH_ASSOC);
                                foreach($resultadoNivel as $nivel){
                                    ?>
                                    <option value="<?=$nivel['idNivelSemestre']?>"><?=$nivel['nombreNivelSemestre']?></option>
                                  <?php }; ?>
                          </select>
                      </div>
                </div>
                </section>
               <section class="footer-form2">
                 <div class="div-Buttons2">
                    <div id="capabtnCancelar">
                        <input name="btnCancelar" type="reset" id="btnCancelar" value="Cancelar" class="ButtonTheme" />
                    </div>
                    <div id="capabtnAceptar">
                        <input name="btnAceptar" type="submit" id="btnAceptar" value="Aceptar" class="ButtonTheme ColorTheme" />
                    </div>
                  </div>
                </section>
  </form>  </div>
</main>

otro modal, pagina CrearPensum.php

<?php
// Incluimos la conexión existente con la DB.
require('../Conexion/conexion.php');
// Se captan en las variables los datos provenientes de los campos del formulario.  

if(!empty($_POST)){

// Se crea la consulta a la tabla para hacer la validación y comparación de los datos.
$consultaRg = $conn->prepare("SELECT * FROM tbpensum WHERE nombrePensum = :nombPensum LIMIT 1;");
$consultaRg->execute([':nombPensum'=>$_POST['txtNombre']]);
$numeroDeFilas = $consultaRg->fetch(PDO::FETCH_ASSOC);

if(!empty($numeroDeFilas)){ //Si el resultado es la existencia de algún registro con los mismos datos comparados entonces se ejecute el siguiente script.
   ?>.
<script>
    // Creamos la variable "mensaje" e Ingresamos un mensaje a mostrar
    alert("Ya existe un registro con el mismo nombre en la base de datos del sistema.\nSi desea registrar un nuevo pensum, por favor haga clic en el botón aceptar.");

</script>
	
<?php
} else {
    // Se Procede con la insercion del registro en la DB.
    $sSQLInsert = $conn->prepare("INSERT INTO tbpensum(nombrePensum, programa) VALUES(:nombPensum, :codProg)");
    
    //Se asignan valores a los parametros.
    $sSQLInsert->bindParam(':nombPensum',$_POST['txtNombre']);
    $sSQLInsert->bindParam(':codProg',$_POST['txtIdPrograma']);

    $sSQLInsert->execute();
    
    if($sSQLInsert){
        header('location: ../Pages/Programa.php?id='.$_POST['txtIdPrograma']);
    
    }
}
}
?>


<head>
<link href="../StyleSheet/Estilos_IncludeModalCrearPensum.css" rel="stylesheet" type="text/css" />
<link href="../StyleSheet/thema.css" rel="stylesheet" type="text/css" />
</script>
</head>
<main class="containerPpal"><br>
      <div id="capafrmRegistrar">
		<div id="tituloCrearPensum" class="ColorTheme">CREAR PÉNSUM</div>
	 <div class="CerrarModalCrearPensum ColorTheme"><a id="btnCerrar" href="javascript:CloseModalCrearPensum();" title="Cerrar" >X</a></div>
      <form id="frmCrearPensum" name="frmCrearPensum" method="post" action="CrearPensum.php" autocomplete="off">
		
     <input type="text" id="txtIdPrograma" name="txtIdPrograma" value="<?=$Programa['codigoPrograma']?>" style="float: right; margin-right: 12px; margin-top:1px;display: none;" readonly>
          
      <div id="capaetqNombre"> NOMBRE *</div>
        <div id="capatxtNombre"><input name="txtNombre" type="text" id="txtNombre"/>
        </div>
	             
		<div id="containerButtons">
	    <div id="capabtnCancelar"> <input name="btnCancelar" type="reset" id="btnCancelar" value="Cancelar" class="ButtonTheme" /></div><div id="capabtnAceptar"><input name="btnAceptar" type="submit" id="btnAceptar" value="Aceptar" class="ButtonTheme ColorTheme" /></div>
          </div>

  </form>  </div>
</main>

Respuestas

A ver si esto te sirve:

El problema que estás experimentando parece estar relacionado con la forma en que se está enviando el formulario y el procesamiento de los datos. Aquí hay algunos puntos que podrías revisar y ajustar para solucionar el problema:

  1. Revisar la URL de acción del formulario: Asegúrate de que la URL especificada en el atributo action del formulario es correcta y accesible. En este caso, asegúrate de que AsignarAsignatura.php está en la ubicación correcta relativa al archivo que contiene el formulario.

  2. Errores en la conexión a la base de datos: Asegúrate de que el archivo conexion.php se incluye correctamente y no tiene errores que puedan interrumpir el procesamiento.

  3. Permisos y rutas de archivos: Asegúrate de que todos los archivos tienen los permisos adecuados y que las rutas especificadas son correctas.

  4. Redirección después de la inserción: Verifica si la redirección está funcionando correctamente después de la inserción de datos. Asegúrate de que la página Programa.php existe y está en la ubicación correcta.

  5. Errores de PHP: Habilita la visualización de errores en PHP para detectar posibles problemas que puedan estar ocurriendo durante el procesamiento del formulario. Puedes agregar lo siguiente al principio de tus archivos PHP para mostrar errores:

    ini_set('display_errors', 1);
    ini_set('display_startup_errors', 1);
    error_reporting(E_ALL);
    

Aquí hay un ejemplo de cómo podrías ajustar y probar el archivo AsignarAsignatura.php:

<?php
// Mostrar errores de PHP
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

// Incluimos la conexión existente con la DB.
require('../Conexion/conexion.php');

if (!empty($_POST)) {
    // Se captan en las variables los datos provenientes de los campos del formulario.
    $codPensum = $_POST['txtIdPensum'];
    $nombreAsig = $_POST['txtAsig'];
    $nivel = $_POST['txtNivel'];
    $creditos = $_POST['txtCreditos'];
    $horas = $_POST['txtHoras'];
    $idPrograma = $_POST['txtIdPrograma'];

    // Se crea la consulta a la tabla para hacer la validación y comparación de los datos.
    $consultaRg2 = $conn->prepare("SELECT * FROM tbpensumcontenido WHERE Pensum = :codPensum AND asignatura = :nombreAsig LIMIT 1;");
    $consultaRg2->execute([':codPensum' => $codPensum, ':nombreAsig' => $nombreAsig]);
    $numeroDeFilas2 = $consultaRg2->fetch(PDO::FETCH_ASSOC);

    if (!empty($numeroDeFilas2)) {
        // Si el resultado es la existencia de algún registro con los mismos datos comparados entonces se ejecute el siguiente script.
        echo '<script>alert("Ya existe una asignatura asociada con ese nombre al pensum actual en la base de datos del sistema.\nSi desea asociar una nueva asignatura al pensum, por favor haga clic en el botón aceptar.");</script>';
    } else {
        // Se Procede con la inserción del registro en la DB.
        $sSQLInsert2 = $conn->prepare("INSERT INTO tbpensumcontenido(Pensum, asignatura, nivel, creditos, totalHoras) VALUES(:Pensum, :Asignatura, :Nivel, :Creditos, :THoras)");

        // Se asignan valores a los parámetros.
        $sSQLInsert2->bindParam(':Pensum', $codPensum);
        $sSQLInsert2->bindParam(':Asignatura', $nombreAsig);
        $sSQLInsert2->bindParam(':Nivel', $nivel);
        $sSQLInsert2->bindParam(':Creditos', $creditos);
        $sSQLInsert2->bindParam(':THoras', $horas);

        if ($sSQLInsert2->execute()) {
            header('Location: ../Pages/Programa.php?id=' . $idPrograma);
            exit();
        } else {
            echo '<script>alert("Error al insertar los datos en la base de datos.");</script>';
        }
    }
}
?>

También, revisa el HTML del formulario para asegurarte de que la URL de acción y los nombres de los campos coinciden con los que se están procesando en PHP:

<form id="frmAsignarAsignatura" name="frmAsignarAsignatura" method="post" action="AsignarAsignatura.php" autocomplete="off">
    <input type="text" id="txtIdPensum" name="txtIdPensum" value="<?=$Pensum['idPensum']?>" style="display: none;" readonly>
    <!-- Resto de los campos del formulario -->
</form>

Siguiendo estos pasos, deberías poder identificar y corregir el problema de "not found" al enviar el formulario.

Victor
300 8 21 16