Pregunta:
Fecha: 10-07-2017 13:28:34
(En Español)
Hasta ahora el código que tengo es este:
Votos: 0 - Respuestas: 10 - Vistas: 12 Compartir en: Google Facebook Twitter LinkedIn Link
Validar registros duplicados al subir CSV[No resuelta]
Hola amigos, en este caso requiero de ayuda para lo siguiente: necesito poder subir un archivo .CSV, y si en la base de datos ya existe uno o más registros con un número de PLANILLA y PROCESO duplicado quiero que me salga un mensaje que diga que ya existe un registro con ese número de planilla y proceso.Hasta ahora el código que tengo es este:
extract($_POST);
if ($action == "upload") {
$archivo = $_FILES['file']['tmp_name'];
$row = 1 - 1;
$fp = fopen ($archivo,"r");
$PLANILLA = $_POST['PLANILLA'];
$PROCESO = $_POST['PROCESO'];
mysql_select_db($database_conexion, $conexion);
$query_valida_planilla = "SELECT PLANILLA, PROCESO FROM acta_entrega_huawei
WHERE PLANILLA = '$PLANILLA' AND PROCESO = '$PROCESO'";
$valida_planilla = mysql_query($query_valida_planilla, $conexion) or
die(mysql_error());
$row_valida_planilla = mysql_fetch_assoc($valida_planilla);
if(mysql_num_rows($valida_planilla)>0){
echo '<script>alert("Ya existe un numero de planilla y proceso duplicado en
la base de datos, Por favor revise el archivo");</script>';
}else{
while ($data = fgetcsv ($fp, 1000, ";")){
$num = count ($data);
print "";
$row++;
$insertar="INSERT INTO acta_entrega_huawei (IDE, PLANILLA, N_PEDIDO,
PROCESO, FECHA_E_FAC, HORA, FECHA_E_CON, FECHA_OPE, OBSERVACIONES) VALUES
('$data[0]', '$data[1]', '$data[2]', '$data[3]', '$data[4]', '$data[5]',
'$data[6]', '$data[7]', '$data[8]')";
mysql_query($insertar);
}
fclose ($fp);
echo "<td><center><font face=\"arial\" color=\"green\"><b>Registros
Insertados ".$row."</b></font></center></td>";
}
}
Votos: 0 - Respuestas: 10 - Vistas: 12 Compartir en: Google Facebook Twitter LinkedIn Link
Respuestas:
-
Fecha: 10-07-2017 15:49:06 Prueba así, claro esta que debes realizar varios cambios, el primero es dejar de usar la libreria mysql y pasar a mysqli, porque la primera ya esta deprecada y luego vas a tener problemas, lo otro es que bueno, yo trabajo con clases para estas tareas y organizar mejor el código, por otro lado tampoco explicas como realizar la carga si asíncrona con ajax o directa por formulario, pero prueba asi a ver:
//Funcion que valida la informacion function valida($X){ $a = $db->query("SELECT PLANILLA, PROCESO FROM acta_entrega_huawei WHERE PLANILLA = '$X[0]' AND PROCESO = '$X[1]'"); $t = mysqli_num_rows($a); return ($t>=1) ? true : false; } extract($_POST); if ($action == "upload") { $archivo = $_FILES['file']['tmp_name']; $row = 1 - 1; $fp = fopen ($archivo,"r"); $PLANILLA = $_POST['PLANILLA']; $PROCESO = $_POST['PROCESO']; $valida = valida(array($PLANILLA, $PROCESO)); if($valida){ echo "El Archivo se encuentra Registrado, poor favor, verifique"; }else{ while ($data = fgetcsv ($fp, 1000, ";")){ $num = count ($data); $row++; $a = $this->con->query("INSERT INTO acta_entrega_huawei (IDE, PLANILLA, N_PEDIDO, PROCESO, FECHA_E_FAC, HORA, FECHA_E_CON, FECHA_OPE, OBSERVACIONES) VALUES ('$data[0]', '$data[1]', '$data[2]', '$data[3]', '$data[4]', '$data[5]', '$data[6]', '$data[7]', '$data[8]')"); } fclose ($fp); echo "<td><center><font face=\"arial\" color=\"green\"><b>Registros Insertados ".$row."</b></font></center></td>"; } }Votos: 2 - Link respuesta -
Fecha: 11-07-2017 05:21:45 Agradezco tus sugerencias pero el problema respecto a la librearía mysql es que es la única que me acepta el server, es decir si utilizo mysqli y mi código no funciona. No utilizo AJAX , la subida del archivo se realizar por medio del INSERT que esta en el codigo desde un FORM , en cuanto a tu respuesta , la probe, hice el cambio de librería, pero tampoco funciona, me deja subir el archivo CSV igualmente y no salta la alerta si lo subo de nuevo, osea que se siguen permitiendo registros repetifos. Votos: -1 - Link respuesta
-
Fecha: 11-07-2017 05:47:42 Andersson, considera actualizar tu servidor.
La extensión mysql es obsoleta desde hace años. Utilizarla, además de mala práctica, representa un riesgo de seguridad.
Por otro lado es muy simple evitar registros repetidos. Tienes que hacer lo siguiente:
1. En tu base de datos crea un índice único sobre esos dos campos.
2. En tu código, antes de insertar, haz un select que te traiga el conteo de registros que contengan la combinación de los campos. Si el conteo es mayor a cero entonces sabes que ya existe el registro y puedes arrojar el mensaje que desees.
Saludos Votos: 0 - Link respuesta -
Fecha: 11-07-2017 06:41:23 Me encanta ayudar, pero se nota que no entendiste el código que te coloque y es probable que tampoco lo adaptaras correctamente, en cuanto al server, debes cambiar como te recomiendan ya que tu sistema estar'a en riesgo alto, te aclaro que si realizas todo el sistema con dicha librería obsoleta, para cuando hagan un cambio de server o para cuando tu server le de por actualizarse tendrás el problemon del a;o al intentar hacer las actualizaciones de TOOOOODAAAAS las querys a la nueva librería.
A mi me toco en su momento y fue bastante tedioso, y eso que el desarrollo estaba prácticamente iniciando.
MORALEJA: Toma consejo y llegarás a viejo con un sistema robusto. jajajaja Saludos Votos: 2 - Link respuesta -
Fecha: 11-07-2017 07:02:35 Comprendo lo que dices Ernesto, y estoy gestionando ese cambio, pero por ahora no es posible, así que tengo trabajar de esta forma, respecto a lo de colocar el campo como UNICO, ya había pensado en eso, pero no aplica, ya que el sistema puede contener PLANILLAS repetidas con diferente proceso, y la segunda opción, capto tu idea pero no sabría como plasmarla cuando son muchos registros en un solo archivo, así que si me muestras el código te agradecería. Votos: 0 - Link respuesta
-
Fecha: 11-07-2017 08:01:06 Carlos claro que tomo consejos y aprendo de cada persona que me ayuda, pero son cosas como la de la versión de la librería que se me sale de las manos, soy nuevo en esto pero creo que entendí tu código y la adaptación que hice fue esta, si puedes ayudar para saber cual es el problema te lo agradecería mucho.
<?php function valida($X){ mysql_select_db($database_conexion, $conexion); $a = mysql_query("SELECT PLANILLA, PROCESO FROM huawei_acta_entrega WHERE PLANILLA = '$X[0]' AND PROCESO = '$X[1]'"); $t = mysql_num_rows($a); return ($t>=1) ? true : false; } extract($_POST); if ($action == "upload") { $archivo = $_FILES['file']['tmp_name']; $row = 1 - 1; $fp = fopen ($archivo,"r"); $PLANILLA = $_POST['PLANILLA']; $PROCESO = $_POST['PROCESO']; $valida = valida(array($PLANILLA, $PROCESO)); if($valida){ echo "El Archivo se encuentra Registrado, poor favor, verifique"; }else{ while ($data = fgetcsv ($fp, 1000, ";")){ $num = count ($data); $row++; $a = mysql_query("INSERT INTO huawei_acta_entrega (IDE, PLANILLA, N_PEDIDO, PROCESO, FECHA_E_FAC, HORA, FECHA_E_CON, FECHA_OPE, OBSERVACIONES) VALUES ('$data[0]', '$data[1]', '$data[2]', '$data[3]', '$data[4]', '$data[5]', '$data[6]', '$data[7]', '$data[8]')"); } fclose ($fp); echo "<center>"; echo "<table width=\"400\" border=\"0\">"; echo "<tr>"; echo "<td><center><font face=\"arial\" color=\"green\"><b>Registros Insertados ".$row."</b></font></center></td>"; echo "</tr>"; echo "<tr>"; echo "<td><center><img src=\"../IMAGENES/OK.png\" width=\"100\" height=\"100\" /></center></td>"; echo "</tr>"; echo "</table>"; echo "</center>"; } } ?>Votos: 0 - Link respuesta -
Fecha: 11-07-2017 09:52:35 Vas a tener muchos problemas y se te está complicando el trabajo porque parece que tu base de datos no está normalizada.
Antes de darte la consulta te recomiendo enormemente que levantes la mano y expongas los problemas de la base de datos y la extensión. El desarrollo ya se está complicando con algo tan sencillo y parece que apenas van empezando. Como ingeniero es tu responsabilidad informar y, si es necesario, detener el desarrollo si ves que las cosas se van saliendo de rumbo.
Ahora sí, a lo que vamos.
El primer detalle está en la función valida()
Estás llamando a unas variables ($database_conexion y $conexion) que están fuera del scope de la función, pásalo como parámetro para que las puedas utilizar.
También veo que la consulta consume menos recursos y es más eficiente si la haces así:
SELECT COUNT(*) FROM huawei_acta_entrega WHERE PLANILLA = '$X[0]' AND PROCESO = '$X[1]'
Solo cambia un poco la lógica pero el resultado debe ser el mismo y un poco más eficiente.
Por favor, no utilices la función extract vas a generar un hueco de seguridad enorme. Remuévela y sanitiza adecuadamente tus variables.
Es buena práctica no utilizar bloques else. En el código que muestras es muy sencillo removerlo y establecer un caso de salida temprana si el archivo ya está registrado.
En vez de múltiples echos puedes utilizar una sentencia HEREDOC que hará que tu código sea más legible.
En el HTML estás utilizando etiquetas que ya son obsoletas (center y font), te recomiendo que ese tipo de ajustes los hagas con CSS. Votos: 2 - Link respuesta -
Fecha: 12-07-2017 11:32:23 Hola Ernesto comprendo, todo lo que me dices. pero como ya sabran soy nuevo en TODO y mis conocimientos y opciones son muy limitados, entiendo las sugerencias de seguridad y lo demas, pero por ahora tengo que trabajar de la forma en la que ya lo expuse y sin esos cambios o sugerencias que me han dado (por ahora), y de esa forma he logrado que me muestre la alerta de que hay archivos duplicados en la bd, pero no me deja ingresar ahora mas archivos. si me pueden dar una ayuda mas este es el codigo con el que estoy trabajando muchas gracias:
<?php extract($_POST); if ($action == "upload") { $archivo = $_FILES['file']['tmp_name']; $row = 1 - 1; $fp = fopen ($archivo,"r"); $PLANILLA = $_POST['PLANILLA']; $PROCESO = $_POST['PROCESO']; mysql_select_db($database_conexion, $conexion); $query_valida_planilla = "SELECT PLANILLA, PROCESO FROM huawei_acta_entrega WHERE PLANILLA = '$PLANILLA' AND PROCESO = '$PROCESO'"; $valida_planilla = mysql_query($query_valida_planilla, $conexion) or die(mysql_error()); $row_valida_planilla = mysql_fetch_assoc($valida_planilla); if(mysql_num_rows($valida_planilla)>0){ echo '<script>alert("Ya existe un numero de planilla y proceso duplicado en la base de datos, Por favor revise el archivo");</script>'; }else{ //Comprovacion de datos: $verificado=false; while ($data = fgetcsv ($fp, 1000, ";")){ $query_verificar_registro="SELECT PLANILLA, PROCESO FROM huawei_acta_entrega WHERE PLANILLA='".$data[1]."' AND PROCESO='".$data[3]."';"; $verificar_registro = mysql_query($query_verificar_registro, $conexion) or die(mysql_error()); if(mysql_num_rows($verificar_registro)>0){ echo '<script>alert("Existe algun Registro Duplicado");</script>'; $verificado=true; break; } } if($verificado==false){ while ($data = fgetcsv ($fp, 1000, ";")){ $num = count ($data); print ""; $row++; $insertar="INSERT INTO huawei_acta_entrega (IDE, PLANILLA, N_PEDIDO, PROCESO, FECHA_E_FAC, HORA, FECHA_E_CON, FECHA_OPE, OBSERVACIONES) VALUES ('".$data[0]."', '".$data[1]."', '".$data[2]."', '".$data[3]."', '".$data[4]."', '".$data[5]."', '".$data[6]."', '".$data[7]."', '".$data[8]."');"; mysql_query($insertar); //SIGUE SIN INSERTAR } } fclose ($fp); echo "<td><center><font face=\"arial\" color=\"green\"><b>Registros Insertados ".$row."</b></font></center></td>";Votos: 0 - Link respuesta -
Fecha: 12-07-2017 13:33:17 Andersson, cuando dices que no te deja ingresar más archivos... tienes algún mensaje de error que puedas compartir? Votos: 0 - Link respuesta
-
Fecha: 13-07-2017 03:06:21 No solo no me deja ingresar mas archivo, me aparece el mensaje de 0 registros ingresados por parte del mensaje con el $row, pero mensaje de error no muestra. Votos: 0 - Link respuesta
Para participar activamente de la comunidad primero debes autenticarte, ingresa al sistema.Iniciar Sesión
