Insertar sin duplicar

godot
19 de Enero del 2004
Hola a todos, a ver si me podeis echar una mano en esto.
quiero insertar registros en una bd mysql, pero controlando que no duplique.
meto los datos en un formulario y en el script de inserción no se como filtrarlo. hago primero una select de todos los campos y luego con if le digo que si el campo de la base de datos no es igual al que viene por post del formulario, que lo inserte, y la condición de que si son iguales con endif.
pero debo de tener mal la sintaxis de los valores que van dentro del if, porque no me va.

si alguien tiene un script de similares características le agradecería que me lo pasase.

gracias por anticipado.

Desquiciado
19 de Enero del 2004
Podrías mostrarnos tu código y lo vemos ....

godot
19 de Enero del 2004
si, como no, lo envío tal cual

<HTML>
<HEAD>
<TITLE>Insertar.php</TITLE>
</HEAD>
<BODY>
<?
//Conexion con la base
mysql_connect("localhost","admin","2610");
//Ejecucion de la sentencia SQL
$csql=mysql_db_query("estudios","select * from libros where codmod=\'".$_POST[\'codmod\']."\'"); este post viene de un formulario anterior, es valor se cargó en un

combo en una primera pág

ahora viene el filtro:
quiero poner: si el campo nomblibro de la bd (una vez recorrido) no es igual al valor que trae del form entonces haz la inserción sino, no hagas nada
if (.$row["nomblibro"].!=$_POST[\'nomblibro\'])
{
mysql_db_query("estudios","insert into libros (codmod,nomblibro) values (\'".$_POST[\'codmod\']."\',\'".$_POST[\'nomblibro\']."\')");
//mysql_db_query("estudios","insert into libros (codmod,nomblibro,nombautor,nombeditorial,isbn) values

(\'".$_POST[\'codmod\']."\',\'".$_POST[\'nomblibro\']."\',\'".$_POST[\'nombautor\']."\',\'".$_POST[\'nombeditorial\']."\',\'".$_POST[\'isbn\']."\')");
}
elseif
?>

<table width="300" border="1" cellpadding="0" cellspacing="0" bordercolor="#000000">
<tr>
<td><table width="300" border="0" cellpadding="0" cellspacing="0">
<tr>
<td> <div align="center"><font size="6">Registro Insertado</font></div></td>
</tr>
<tr>
<td bgcolor="#000000"><table width="300" border="0" cellspacing="0" cellpadding="0">
<tr>
<td> </td>
</tr>
<tr>
<td bgcolor="#3399CC"> </td>
</tr>
</table></td>
</tr>
<tr>
<td bgcolor="#3399CC">
<div align="center">
<FORM ACTION="visualizar.php" METHOD="POST" name="insertar" id="insertar">
<input name="codmod" type="hidden" value="<? echo $_POST[\'codmod\'] ?>">
<INPUT name="SUBMIT2" TYPE="SUBMIT" value="Contenido del Módulo">
</FORM>
</div></td>
</tr>
<tr>
<td height="45" bgcolor="#3399CC">
<div align="center">
<FORM ACTION="subirbiblio.php" METHOD="POST" name="insertar" id="insertar">
<INPUT name="SUBMIT2" TYPE="SUBMIT" value="Volver a la Búsqueda">
</FORM>
</div></td>
</tr>
</table></td>
</tr>
</table>
<? echo $_POST[\'isbn\'] ?>
<?
while ($row=mysql_fetch_array($csql))
{
echo \'<td>\'.$row["nomblibro"].\'</td>\';
}
?>
<p> </p>
</BODY>
</HTML>

Desquiciado
19 de Enero del 2004
Me podrías decir cual es la función de la variable " codmod " ???

No te sería más facil realizar la 1° query colocándole como condición el nombre del libro en cuestión ( Ejemplo : $csql= " select * from libros where nomlibro = '".$_POST['nomlibro']."'"; )

y así sabrías más facilmente si ese libro está ó no en tu BD ..........

godot
19 de Enero del 2004
te explico todo el funcionamiento.
es una base de datos para un instituto y consiste en hacer una parte publica para consultar bibliografía recomendada y una privada para los profesores para que la suban, modifiquen y eliminen.

así que estamos en la subida.
en una 1ª pág, salen 4 combos anidados que toman valores de la bd haciendo filtros.
1er combo régimen, al seleccionar carga en el 2º de familias pasando el código de régimen a la select de familias. lo mismo desde familias hasta ciclos y lo mismo desde ciclos hasta módulos (asignaturas), el último combo de módulos carga el código de módulo para que al pasar a la siguiente pág del formulario, lo meta en un input hidden junto con las cajas de texto del resto de info de la tabla libros:nombautor, monblibro, editorial,isbn.

por eso no puedo hacer la select sobre nomblibro, porque el bloque de registros se va a insertar en la tabla libros con un código de módulo específico para que al utilizar laparte pública y el usuario acceda a la información se acceda dela misma forma a través delos combos citados, sacando un listado de libros que solo pertenecen al módulo escogido.

si hago la select hacia nombre de libro, me coge el de todos los módulos.

por eso lo hago sobre codmod(código de módulo) para que solo me seleccione los que pertenecen a ese módulo (el que escogió el profesor al ir a insertar un nuevo libro). se cual es el código de módulo porque viene cargado por post desde la pág de combos.

así que habría 3 págs, 1-selección del módulo a través de combos. 2-formulario de inserción de campos dela tabla libros. 3-script de inserción a bd y (lo que intento) controlar la no duplicación.

oye, gracias por molestarte en contestarme, todas tus sugerencias serán muy bien recibidas.

Desquiciado
19 de Enero del 2004
Entonces que te parece si en una misma query verificas si existe ese Libro ó No, en tal modulo, ejemplo :

$csql= "select * from libros where nomlibro = '".$_POST['nomlibro']."' and codmod='".$_POST['codmod']."';";

No se si te entendí bien ..... que te parece ??

godot
19 de Enero del 2004
si, si, me entendiste perfectamente.
es que estoy un poco liado con todo esto, solo llevo un par de semanas con php y sql.

entonces, ahora tengo una select de todos los campos del libro que pertenece al módulo escogido cuyo nombre de libro es igual al introducido en el formulario.

pero, tengo que hacer a continuación el if, no?
como lo hago? como le digo que si el nombre de libro ya existe no lo inserte?

por ahora con la select solo tengo valores para comparar.

Desquiciado
19 de Enero del 2004
Ok, la cosa sería más ó menos así :

mysql_connect("localhost","admin","2610");
mysql_select_db("estudios");
$result=mysql_query("select * from libros where nomlibro = '".$_POST['nomlibro']."' and codmod='".$_POST['codmod']."';");
$num_resultados=mysql_num_rows($result);

if($num_resultados<>0)
{

$query_insert="insert into libros (codmod,nomblibro,nombautor,nombeditorial,isbn) values ('".$_POST['codmod']."','".$_POST['nomblibro']."','".$_POST['nombautor']."','".$_POST['nombeditorial']."','".$_POST['isbn']."');";
mysql_query($query_insert);

}
else
{

/* Aquí va el código cuando YA existe el Libro en el Modulo elegido, No sé, puedes enviarle
un mensaje de que ya existe ese libro en ese Modulo, por ejemplo !! */

}

y, como Vá ??

godot
19 de Enero del 2004
no me hace el insert.
lo tengo así
le metí todos los campos para que el libro tenga que ser exactamente el mismo.

<?
//Conexion con la base
mysql_connect("localhost","admin","2610");
//Ejecucion de la sentencia SQL
$result=mysql_db_query("estudios","select * from libros where codmod='".$_POST['codmod']."' and nomblibro='".$_POST['nomblibro']."' and nombautor='".$_POST['nombautor']."' and nombeditorial='".$_POST['nombeditorial']."' and isbn='".$_POST['isbn']."'");
$num_resultados=mysql_num_rows($result);
if ($num_resultados!=0)
{
mysql_db_query("estudios","insert into libros (codmod,nomblibro,nombautor,nombeditorial,isbn) values ('".$_POST['codmod']."','".$_POST['nomblibro']."','".$_POST['nombautor']."','".$_POST['nombeditorial']."','".$_POST['isbn']."')");
}
else
{
echo hola;
}
?>

por cierto como puedo mandar un mensaje de que ya existe? redireccionando a otra pág, cual sería el comando para la redirección?

Desquiciado
19 de Enero del 2004
Hber prueba esto :

<?

num_resultados=0;
//Conexion con la base
mysql_connect("localhost","admin","2610");
//Ejecucion de la sentencia SQL

$result=mysql_db_query("estudios","select * from libros where codmod='".$_POST['codmod']."' and nomblibro='".$_POST['nomblibro']."' and nombautor='".$_POST['nombautor']."' and nombeditorial='".$_POST['nombeditorial']."' and isbn='".$_POST['isbn']."'");
$num_resultados=mysql_num_rows($result);

echo "Num_Resultados es ..:".$num_resultados;

if ($num_resultados!=0)
{
mysql_db_query("estudios","insert into libros (codmod,nomblibro,nombautor,nombeditorial,isbn) values ('".$_POST['codmod']."','".$_POST['nomblibro']."','".$_POST['nombautor']."','".$_POST['nombeditorial']."','".$_POST['isbn']."')");
}
else
{
?>
<script language="javascript">

alert("Ese libro ya Existe !!");

</script>
<?
require("pagina_anterior.php");
}
?>

en el require le cambias el require "pagina_anterior.php" por la página a la cual redireccionas ......

godot
19 de Enero del 2004
ok, cojonudo, muchíiiisimas gracias.
no me iba porque al poner la condición de si es igual a 0 ponía = y es ==. así me va de puta madre.

oye, es difícil obtener scripts de internet que se ajusten a las necesidades de cada uno, así que gracias de nuevo por tu ayuda.

Desquiciado
19 de Enero del 2004
Oye amigo, en este momento no te puedo seguir ayundando ya que estoy en el trabajo y me tengo qe ir para el Hogar ................ Mañana sin falta me conecto y seguimos .... sorry.