Evitar registros duplicados campo descripción en MySQL y PHP

Desde
22 Ago 2010
Mensajes
6.590
Por favor, ten en cuenta 📝 que si deseas hacer un trato 🤝 con este usuario, está baneado 🔒.
Hola bueno vengo con otra dudita que tengo

Tengo una bd en la cual registra automaticamente datos tipo resumenes pero lo que note que hay veces que registra en el campo description se registran los mismos parrafor un ejemplo

We are seeking fresh and experienced graduates to join our IT <strong>Consulting</strong> Services department In the following technologies either for Training or for Placements: 1. Database Developers (Oracle, SQL Server) 2. PHP Programmers 3. Java...

Como evitar que se registre el mismo parrafo sera posible con php evitar que se repita

de antemanos gracias por la colaboracion si me ayudan
 

vicram10

Épsilon
Programador
Verificación en dos pasos activada
Verificado por Whatsapp
¡Ha verificado su Paypal!
Desde
8 May 2013
Mensajes
751
Edad
39
lo que puedes hacer primeramente es comparar si todo el texto ya se encuentra en la base, con un select count, y si la misma devuelve algo, le muestras en mensaje que ya existe en la base una descripcion igual o parecida.
 

blogers

Pi
SEO
Desde
22 Ago 2010
Mensajes
6.590
Por favor, ten en cuenta 📝 que si deseas hacer un trato 🤝 con este usuario, está baneado 🔒.
mira ya tengo este codigo que me muestra los repetidos

PHP:
SELECT description, COUNT(*) as total FROM mitabla
	GROUP BY description
	HAVING COUNT(*) > 1;


Pero ahora quiero armar el codigo php me ayudarias hacerlo

lo que puedes hacer primeramente es comparar si todo el texto ya se encuentra en la base, con un select count, y si la misma devuelve algo, le muestras en mensaje que ya existe en la base una descripcion igual o parecida.
 

vicram10

Épsilon
Programador
Verificación en dos pasos activada
Verificado por Whatsapp
¡Ha verificado su Paypal!
Desde
8 May 2013
Mensajes
751
Edad
39
Un ejemplo mio seria asi:

PHP:
<?php 
$descripcion = trim(mysqli_real_scape_string($_POST['descripcion']));
$sql = db_query("select count(1) from tabla where trim(descripcion) = '$descripcion'");
list($existe) = mysqli_fetch_row($sql);
if ($existe > 0)
{
     echo 'Error: Ya existe descripcion';
}else{
     //continua su rumbo...
}
?>
 

blogers

Pi
SEO
Desde
22 Ago 2010
Mensajes
6.590
Por favor, ten en cuenta 📝 que si deseas hacer un trato 🤝 con este usuario, está baneado 🔒.
Ese serviria para borrar los que son duplicaods colega de ese campo ?

y si lo puedo correr con cron para que lo detecte automaticamente y lso borre
Un ejemplo mio seria asi:

PHP:
<?php 
$descripcion = trim(mysqli_real_scape_string($_POST['descripcion']));
$sql = db_query("select count(1) from tabla where trim(descripcion) = '$descripcion'");
list($existe) = mysqli_fetch_row($sql);
if ($existe > 0)
{
     echo 'Error: Ya existe descripcion';
}else{
     //continua su rumbo...
}
?>


---------- Post agregado el 01-oct-2013 hora: 20:21 ----------

Ya implemente el codigo pero no me muestra nada esta en blanco la pagina te paso por mp la url
 

vicram10

Épsilon
Programador
Verificación en dos pasos activada
Verificado por Whatsapp
¡Ha verificado su Paypal!
Desde
8 May 2013
Mensajes
751
Edad
39
Un ejemplo de borrado seria algo asi

PHP:
<?php 
//vemos todos los duplicados
$sql = db_query("SELECT description, COUNT(*) as total FROM mitabla GROUP BY description HAVING COUNT(*) > 1");
while ($row = mysqli_fetch_assoc($sql))
{
     //borramos el duplicado
     $sql2 = db_query("select max(id_registro) from mitabla where descripcion = '". $row['description'] ."'");
     list($id_registro) = mysqli_fetch_row($sql2);
     db_query("delete from mitabla where id_registro = $id_registro");
}
?>

Es algo rapido que se me ocurre como solucion, puedes duplicar tu BD y hacer en otra BD una prueba con el script y ver si te funciona como quieres.
 

blogers

Pi
SEO
Desde
22 Ago 2010
Mensajes
6.590
Por favor, ten en cuenta 📝 que si deseas hacer un trato 🤝 con este usuario, está baneado 🔒.
Puedo hacerlo en una tabla aparte duplicar esa base de datos seria una odisea pesa 4.5 gb
Un ejemplo de borrado seria algo asi

PHP:
<?php 
//vemos todos los duplicados
$sql = db_query("SELECT description, COUNT(*) as total FROM mitabla GROUP BY description HAVING COUNT(*) > 1");
while ($row = mysqli_fetch_assoc($sql))
{
     //borramos el duplicado
     $sql2 = db_query("select max(id_registro) from mitabla where descripcion = '". $row['description'] ."'");
     list($id_registro) = mysqli_fetch_row($sql2);
     db_query("delete from mitabla where id_registro = $id_registro");
}
?>

Es algo rapido que se me ocurre como solucion, puedes duplicar tu BD y hacer en otra BD una prueba con el script y ver si te funciona como quieres.
 

vicram10

Épsilon
Programador
Verificación en dos pasos activada
Verificado por Whatsapp
¡Ha verificado su Paypal!
Desde
8 May 2013
Mensajes
751
Edad
39
El primer ejemplo que te pase es por si queres evitar que se duplique al querer guardar, pero si queres un cron, entonces la segunda opcion que te pase seria lo mas indicado ya que hace lo que necesitas, aunque lo debes probar :rolleyes:

Pd.: esto es contestando a tu mp a traves de aqui jeje..
 

blogers

Pi
SEO
Desde
22 Ago 2010
Mensajes
6.590
Por favor, ten en cuenta 📝 que si deseas hacer un trato 🤝 con este usuario, está baneado 🔒.
Este error me salio con el code

PHP:
[01-Oct-2013 16:32:49 America/New_York] PHP Warning:  array_key_exists() expects parameter 2 to be array, null given in /home/bolsa/public_html/conf.php on line 24
[01-Oct-2013 16:32:49 America/New_York] PHP Warning:  session_start() [<a href='function.session-start'>function.session-start</a>]: Cannot send session cookie - headers already sent by (output started at /home/bolsa/public_html/listado/duplicados.php:1) in /home/bolsa/public_html/conf.php on line 63
[01-Oct-2013 16:32:49 America/New_York] PHP Warning:  session_start() [<a href='function.session-start'>function.session-start</a>]: Cannot send session cache limiter - headers already sent (output started at /home/bolsa/public_html/listado/duplicados.php:1) in /home/bolsa/public_html/conf.php on line 63
[01-Oct-2013 16:32:49 America/New_York] PHP Fatal error:  Call to undefined function db_query() in /home/bolsa/public_html/listado/duplicados.php on line 7


---------- Post agregado el 01-oct-2013 hora: 20:35 ----------

Ya probe el segundo code me arrojo ese error que te puse abajo y pagina en blanco
El primer ejemplo que te pase es por si queres evitar que se duplique al querer guardar, pero si queres un cron, entonces la segunda opcion que te pase seria lo mas indicado ya que hace lo que necesitas, aunque lo debes probar :rolleyes:

Pd.: esto es contestando a tu mp a traves de aqui jeje..
 

vicram10

Épsilon
Programador
Verificación en dos pasos activada
Verificado por Whatsapp
¡Ha verificado su Paypal!
Desde
8 May 2013
Mensajes
751
Edad
39
te pase por mp un ejmplo de lo que necesitas, pero debes adaptar las conexiones a la base de datos y las consultas..
el db_query y demas que agregue son solo referencias..

Voy a tratar de hacer un ejemplo conciso al respecto para que puedas entender mejor.
 

blogers

Pi
SEO
Desde
22 Ago 2010
Mensajes
6.590
Por favor, ten en cuenta 📝 que si deseas hacer un trato 🤝 con este usuario, está baneado 🔒.
Si creo que es por las conexion que no lo esta haciendo correctamente
te pase por mp un ejmplo de lo que necesitas, pero debes adaptar las conexiones a la base de datos y las consultas..
el db_query y demas que agregue son solo referencias..

Voy a tratar de hacer un ejemplo conciso al respecto para que puedas entender mejor.
 

vicram10

Épsilon
Programador
Verificación en dos pasos activada
Verificado por Whatsapp
¡Ha verificado su Paypal!
Desde
8 May 2013
Mensajes
751
Edad
39
Bueno primeramente

Crea un archivo php con el nombre borrar.php

PHP:
<?php
	//conexion a la base de datos
	$link = mysql_connect('localhost', 'root', '');
	if (!$link)
	   die('Error al conectarse con MySQL: ' . mysql_error().' <br>Número del error: '.mysql_errno());
	if (! @mysql_select_db("bd_laboratorio",$link)){
	   echo "No se pudo conectar correctamente con la Base de datos";
	   exit();
	}
	
	//vemos todos los duplicados
	$sql = mysql_query("SELECT contenido as descripcion, COUNT(*) cantidad FROM contenido_duplicado GROUP BY contenido HAVING COUNT(*) > 1");
	echo 'Registros Eliminados';
	while ($row = mysql_fetch_assoc($sql))
	{
		//borramos el duplicado
		$sql2 = mysql_query("select max(id_registro) from contenido_duplicado where trim(contenido) = '". $row['descripcion'] ."'");
		list($id_registro) = mysql_fetch_row($sql2);
		echo '<p>Id.: ', $id_registro ,' -> descripcion: ', $row['descripcion'] ,'</p>';
		mysql_query("delete from contenido_duplicado where id_registro = $id_registro");
	} 
?>

Y ejecutarlo desde el navegador asi como me mostraste via MP..
Debes adaptar lo siguiente:

$link = mysql_connect('localhost', 'root', 'password');

Localhost, debes cambiar por el nombre de tu server
root => tu usuario de tu servidor
password => la contraseña de tu server

Luego

! @mysql_select_db("bd_laboratorio",$link)

bd_laboratorio => lo debes cambiar por el nombre de tu Base de datos

Y luego en las consultas debes especificar el campo de "descripcion" y el "id" principal de la tabla.
Todo lo que expuse es referencia...

Algunos pantallazos del ejemplo seria..

print1.jpg


print2.jpg


print3.jpg
 

blogers

Pi
SEO
Desde
22 Ago 2010
Mensajes
6.590
Por favor, ten en cuenta 📝 que si deseas hacer un trato 🤝 con este usuario, está baneado 🔒.
Ya hace conexion perfectamente con el archivo pero no los borra con este code

PHP:
 <?php

set_time_limit(0);
include('../conf.php');

//vemos todos los duplicados
$sql = mysql_query("SELECT description, COUNT(*) as total FROM staffpruebasbolsa GROUP BY description HAVING COUNT(*) > 1");
echo 'Registros Eliminados';
while ($row = mysqli_fetch_assoc($sql))
{
//borramos el duplicado
$sql = mysql_query("select max(id_registro) from staffpruebasbolsa where description = '". $row['description'] ."'");
list($id_registro) = mysqli_fetch_row($sql2);
echo '<p>Id.: ', $id_registro ,' -> description: ', $row['description'] ,'</p>';
db_query("delete from staffpruebasbolsa where id_registro = $id_registro");
}
?>


Bueno primeramente

Crea un archivo php con el nombre borrar.php

PHP:
<?php
	//conexion a la base de datos
	$link = mysql_connect('localhost', 'root', '');
	if (!$link)
	   die('Error al conectarse con MySQL: ' . mysql_error().' <br>Número del error: '.mysql_errno());
	if (! @mysql_select_db("bd_laboratorio",$link)){
	   echo "No se pudo conectar correctamente con la Base de datos";
	   exit();
	}
	
	//vemos todos los duplicados
	$sql = mysql_query("SELECT contenido as descripcion, COUNT(*) cantidad FROM contenido_duplicado GROUP BY contenido HAVING COUNT(*) > 1");
	echo 'Registros Eliminados';
	while ($row = mysql_fetch_assoc($sql))
	{
		//borramos el duplicado
		$sql2 = mysql_query("select max(id_registro) from contenido_duplicado where trim(contenido) = '". $row['descripcion'] ."'");
		list($id_registro) = mysql_fetch_row($sql2);
		echo '<p>Id.: ', $id_registro ,' -> descripcion: ', $row['descripcion'] ,'</p>';
		mysql_query("delete from contenido_duplicado where id_registro = $id_registro");
	} 
?>

Y ejecutarlo desde el navegador asi como me mostraste via MP..
Debes adaptar lo siguiente:



Localhost, debes cambiar por el nombre de tu server
root => tu usuario de tu servidor
password => la contraseña de tu server

Luego



bd_laboratorio => lo debes cambiar por el nombre de tu Base de datos

Y luego en las consultas debes especificar el campo de "descripcion" y el "id" principal de la tabla.
Todo lo que expuse es referencia...

Algunos pantallazos del ejemplo seria..

print1.jpg


print2.jpg


print3.jpg
 

vicram10

Épsilon
Programador
Verificación en dos pasos activada
Verificado por Whatsapp
¡Ha verificado su Paypal!
Desde
8 May 2013
Mensajes
751
Edad
39
y tienes el campo "id_registro" en tu tabla?

es eso lo que te mencione al final

Y luego en las consultas debes especificar el campo de "descripcion" y el "id" principal de la tabla.

Para borrar el toma en cuenta el "id" principal de la tabla, aquel ID que no se repetira, en mi ejemplo se llamo id_registro, en tu tabla puede llegar a tener otro nombre.. de ahi que no borra..
 

blogers

Pi
SEO
Desde
22 Ago 2010
Mensajes
6.590
Por favor, ten en cuenta 📝 que si deseas hacer un trato 🤝 con este usuario, está baneado 🔒.
Ya lo puse asi parece que ya quiere funcionar pero no borra checalo

PHP:
 <?php

set_time_limit(0);
include('../conf.php');




    //vemos todos los duplicados
    $sql = mysql_query("SELECT description as description, COUNT(*) cantidad FROM staffpruebasbolsa GROUP BY description HAVING COUNT(*) > 1");
    echo 'Registros Eliminados';
    while ($row = mysql_fetch_assoc($sql))
    {
        //borramos el duplicado
        $sql2 = mysql_query("select max(code) from description where trim(description) = '". $row['descripcion'] ."'");
        list($id_registro) = mysql_fetch_row($sql2);
        echo '<p>Id.: ', $id_registro ,' -> description: ', $row['description'] ,'</p>';
        mysql_query("delete from description where code = $id_registro");
    } 
?>


---------- Post agregado el 01-oct-2013 hora: 21:22 ----------

M eequivoque en id es codigo

asi quedaria pero no los borra aun


PHP:
 <?php

set_time_limit(0);
include('../conf.php');




    //vemos todos los duplicados
    $sql = mysql_query("SELECT description as description, COUNT(*) cantidad FROM staffpruebasbolsa GROUP BY description HAVING COUNT(*) > 1");
    echo 'Registros Eliminados';
    while ($row = mysql_fetch_assoc($sql))
    {
        //borramos el duplicado
        $sql2 = mysql_query("select max(codigo) from description where trim(description) = '". $row['description'] ."'");
        list($id_registro) = mysql_fetch_row($sql2);
        echo '<p>Id.: ', $id_registro ,' -> description: ', $row['description'] ,'</p>';
        mysql_query("delete from description where codigo = $id_registro");
    } 
?>

y tienes el campo "id_registro" en tu tabla?

es eso lo que te mencione al final



Para borrar el toma en cuenta el "id" principal de la tabla, aquel ID que no se repetira, en mi ejemplo se llamo id_registro, en tu tabla puede llegar a tener otro nombre.. de ahi que no borra..
 

vicram10

Épsilon
Programador
Verificación en dos pasos activada
Verificado por Whatsapp
¡Ha verificado su Paypal!
Desde
8 May 2013
Mensajes
751
Edad
39
no lo borra por que le pusiste "description" en ves de nombre de tabla en las 2 ultimas consultas..

Aqui
$sql2 = mysql_query("select max(code) from description where trim(description) = '". $row['descripcion'] ."'");

y aqui

mysql_query("delete from description where code = $id_registro");

Esos 2 resaltados en negrita lo modificas por el nombre de tu tabla y deberia de funcionar..

el nombre de tu tabla segun el ejemplo que pasaste seria "staffpruebasbolsa"
 

blogers

Pi
SEO
Desde
22 Ago 2010
Mensajes
6.590
Por favor, ten en cuenta 📝 que si deseas hacer un trato 🤝 con este usuario, está baneado 🔒.
Ya funciono por fin estaba mal yo exacto cambie descripcion pordescrption ya quedo bien asi


PHP:
 <?php

set_time_limit(0);
include('../conf.php');




   //vemos todos los duplicados
    $sql = mysql_query("SELECT description as descripcion, COUNT(*) cantidad FROM staffpruebasbolsa GROUP BY description HAVING COUNT(*) > 1");
    echo 'Registros Eliminados';
    while ($row = mysql_fetch_assoc($sql))
    {
        //borramos el duplicado
        $sql2 = mysql_query("select max(codigo) from staffpruebasbolsa where trim(description) = '". $row['descripcion'] ."'");
        list($id_registro) = mysql_fetch_row($sql2);
        echo '<p>Id.: ', $id_registro ,' -> descripcion: ', $row['descripcion'] ,'</p>';
        mysql_query("delete from staffpruebasbolsa where codigo = $id_registro");
    } 
?>


Ahora la pregunta del millon cuando elimina borra los mas nuevos y deja el original es decir el primero que se registro ?
no lo borra por que le pusiste "description" en ves de nombre de tabla en las 2 ultimas consultas..

Aqui


y aqui



Esos 2 resaltados en negrita lo modificas por el nombre de tu tabla y deberia de funcionar..

el nombre de tu tabla segun el ejemplo que pasaste seria "staffpruebasbolsa"
 

vicram10

Épsilon
Programador
Verificación en dos pasos activada
Verificado por Whatsapp
¡Ha verificado su Paypal!
Desde
8 May 2013
Mensajes
751
Edad
39

blogers

Pi
SEO
Desde
22 Ago 2010
Mensajes
6.590
Por favor, ten en cuenta 📝 que si deseas hacer un trato 🤝 con este usuario, está baneado 🔒.
A perfecto y por ejemplo se pueden borrar varios al mismo tiempo en una ejecucion o en vez de borrar solo 1 asi que periodicamente este funcionando por medio de cron
Como decias evitar duplicacion, pues la respuesta seria SI :)
Pero si crees conveniente dejar el mas nuevo pues seria cambiar solo una parte..

Buscar


Reemplazar por
 

vicram10

Épsilon
Programador
Verificación en dos pasos activada
Verificado por Whatsapp
¡Ha verificado su Paypal!
Desde
8 May 2013
Mensajes
751
Edad
39
En realidad el script busca todos los duplicados y los enlista, y luego va borrandolos de a 1..
Lo puedes poner dentro de un cron sin problemas y él se encarga de periodicamente ver si hay duplicados y los elimina en caso que encuentre.
 
Arriba