¿Evitar entradas duplicadas en MySQL al insertar datos?

Tengo un problema grave y no me di cuenta. Tengo un nombre de tabla llamado 'resultados'. Lo que quiero lograr es que cuando inserte un nuevo registro, se inserte correctamente en la base de datos.

En ese nivel, mi script funciona bien. Pero quiero la segunda vez cuando haga clic para agregar un nuevo registro de resultados si los datos se ingresan antes, mostrará mis datos para que, si quiero actualizar mis datos, pueda hacerlo. Si los datos no se ingresaron previamente, los insertaré en la base de datos. Obtuve éxito para restringir al usuario el ingreso de datos duplicados, pero no obtuve éxito para mostrar esos datos en la misma página.

Tengo una página de prueba donde coloco el enlace administrar los resultados cuando hago clic en este enlace se abre una nueva página donde se enumeran todos los estudiantes con class_id particular y después de su nombre hay campos como biología, química, etc. donde ingreso su marcas.

La estructura de mi tabla es así:

Estructura de mesa para mesa results

CREATE TABLE IF NOT EXISTS `results` (
  `result_id` int(11) NOT NULL AUTO_INCREMENT,
  `class_id` int(10) NOT NULL,
  `student_id` int(10) NOT NULL,
  `test_id` int(10) NOT NULL,
  `biology` int(10) NOT NULL,
  `chemistry` int(10) NOT NULL,
  `math` int(10) NOT NULL,
  `english` int(10) NOT NULL,
  `urdu` int(10) NOT NULL,
  `marks_obtained` int(10) NOT NULL,
  `created` datetime NOT NULL,
  `updated` datetime NOT NULL,
  PRIMARY KEY (`result_id`),
  UNIQUE KEY `student_id` (`student_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;

Si tienes alguna pregunta entonces pregúntame. ¡Perdón por la larga explicación!

<?php 
include("includes/config.php"); 

$id=$_GET['class_id'];
$id2 = $_GET['test_id'];

if($_SERVER['REQUEST_METHOD']=='POST'){

foreach($post as $key=>$val){
    $$key   =   $val;
}

$z  =   0;
foreach($post['biology'] as $biology1){
    $biology    =   $biology1;
    $student_id =   $post['student_id'][$z];
    $test_id =   $post['test_id'][$z];


    $chemistry      =   $post['chemistry'][$z];
    $math       =   $post['math'][$z];
    $english        =   $post['english'][$z];
    $urdu       =   $post['urdu'][$z];
    $marks_obtained =   $post['marks_obtained'][$z];
    $marks_obtained .= $biology+$chemistry+$math+$english+$urdu;

        if(isset($get['class_id']) and $get['test_id']){        

        $link = mysql_query("SELECT * from results where student_id='$student_id'");
        $res = mysql_num_rows($link);


        if($res>0) {

            $link2 = mysql_query("SELECT * from results where class_id='$class_id' AND test_id='$test_id'");

        }else {



    mysql_query("INSERT into results values('','$class_id','$student_id','$test_id','$biology','$chemistry','$math','$english','$urdu','$marks_obtained',now(),'')")or die(mysql_error());
    $z++;

            }
        }
    }
}
?>

HTML

<form method="post" action="" enctype="multipart/form-data">
    <table border="1" />


        <tr>
        <th>Student Name</th>

        <th>Biology</th>
        <th>Chemistry</th>
        <th>Math</th>
        <th>Engllish</th>
        <th>Urdu</th>



        </tr>
        <?php 

        $query = mysql_query("SELECT id,class_id,student_name from student where class_id='$id'") or die(mysql_error());
        while($rec =mysql_fetch_array($query)) {

        ?>

        <?php do { ?>

        <tr>
         <input name="class_id" type="hidden" value="<?php echo $rec['class_id'];?>" />
        <input name="student_id[]" type="hidden" value="<?php echo $rec['id'];?>" tabindex="1" />
        <input name="test_id[]" type="hidden"  value="<?php echo $id2;?>" tabindex="1" />

        <td><?php echo $rec['student_name'];?></td>




        <td><input name="biology[]" type="text" tabindex="2" value="<?php echo $rows['biology'];?>" /></td>
        <td><input name="chemistry[]" type="text" tabindex="5"  value="<?php echo $rows['chemistry'];?>" /></td>
        <td><input name="math[]" type="text" tabindex="7" value="<?php echo $rows['math'];?>" /></td>
        <td><input name="english[]" type="text" tabindex="4"  value="<?php echo $rows['english'];?>" /></td>
        <td><input name="urdu[]" type="text" tabindex="6" value="<?php echo $rows['urdu'];?>" /></td>
            <input name="marks_obtained[]" type="hidden" tabindex="9" />

      <?php } while($rows=mysql_fetch_array($link2))?>  <?php } ?>

        </tr> 

        <tr><td><button type="submit">Add Records</button></td></tr>
        </table>



    </form>

preguntado el 12 de junio de 12 a las 17:06

3 Respuestas

Veo que hay un índice único en student_id. Esto significa que su tabla solo tendrá un conjunto de resultados para cada estudiante en cualquier momento. Así que supongo que cuando dice "si se ingresaron datos antes", quiere decir "si se ingresa un segundo conjunto de resultados para el mismo estudiante".

Tienes dos opciones: o

  • atrape la excepción lanzada por la restricción de clave externa al intentar ingresar un ID de estudiante duplicado y luego obtenga los resultados de ese ID de estudiante y complete su formulario
  • o, probablemente mejor, verifique si existe student_id antes de insertar, y si existe, no inserte, busque los resultados de ese student_id y complete su formulario. Entonces necesitarías algo como:

    SELECCIONE CONTEO(*) DESDE los resultados DONDE student_id=12345

(donde 12345 es el id_estudiante que intenta insertar)

Si el resultado es mayor que cero (en este caso, solo puede ser 1), no inserte, busque en su lugar y complete su formulario. Es decir:

SELECT * FROM results WHERE student_id=12345

Edit: También puedes usar

INSERT... ON DUPLICATE KEY UPDATE

...y evita tener que consultar, mostrar resultados y actualizarlos.

Revisa esta pregunta

contestado el 23 de mayo de 17 a las 13:05

HI Dil gracias 4 ur rply. Adjunté class_id&test_id en la URL del enlace de gestión de resultados y no inserté student_id. así que creo que tengo que usar las declaraciones if else para obtener los resultados deseados. Lo intenté pero fallé. - user1313942

No estoy seguro de cuál es tu problema exacto, tal vez estés buscando algo como esto Búsqueda de Google entonces sí, un "si... si no" debería ser suficiente. - Dil

Para esto, debe obtener los datos que actualmente residen en la base de datos y luego compararlos con los datos que está insertando. Si se encuentra una coincidencia, muestre un mensaje de error; de lo contrario, active la consulta de inserción

Respondido el 12 de junio de 12 a las 17:06

Puede evitar la duplicación de datos utilizando este carácter && ejemplo

if($_post['usename'] && $_post['password'] && $_post['items']){
  echo "You fill all items";
} else {
  echo fill all items recommended!!
}

respondido 19 mar '17, 04:03

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.