duda asp

irene albentos
23 de Enero del 2013
Hola! Lo primero decir que soy novata en esto. Tengo unas dudas
de asp con base de datos.

A ver, yo tengo una base de datos con 3 tablas:
ENLACES: CodEnlace, Titulo, URL, Descripcion
USERS: CodUsers, usLog, Passwd, Nombre
PUBLICACION: CodUsers, CodEnlace, CodPub, Publico

mis relaciones son 1 a muchos asi:
•Publicacion.Coduser= Users.Coduser
•Publicacion.CodEnlace=Enlaces.CodEnlace


Lo que quiero hacer es un formulario en el que el usuario pueda publicar sus enlaces y decida si estos son publicos o privados.
Como la publicacion, enlaces y usuarios son de distintas tablas no se como se haria.

Yo he probado a hacer esto:
SQL = "INSERT INTO Publicacion (CodUsers, codEnlace, Publico) VALUES ('" 
SQL = SQL & Request.Form("codUsers") & "','" & Request.Form("codEnlace") & "','"
SQL = SQL & Request.Form("Publico") & "') WHERE CodUsers="??"

SQL = "INSERT INTO Enlaces (Titulo, Descripcion, dirURL) VALUES ('"
SQL = SQL & Request.Form("Titulo") & "','" & Request.Form("Descripcion") & "','"
SQL = SQL & Request.Form("dirURL") & "') WHERE "??"


El problema que tengo es:
1. No se si se pueden hacer dos inserts de un mismo formulario
2. El primer insert tendria que insertar la informacion segun el codigo del usuario que esta conectado en publicacion. No se como hacerlo. Puede que sea a traves de una variable session? Cuando el usuario se loguea pongo: session("usuario")=Request.form("usLog").

4. En el segundo insert tendria que insertar el titulo, descripcion, URL en la tabla enlaces.

Si no entendeis algo de lo que digo preguntarme porque no se si estoy siendo muy clara.

Muchas gracias.

Elena
12 de Agosto del 2026

Hola,

Vas por buen camino, pero hay dos cosas que corregir. La primera, rápida: un INSERT INTO nunca lleva WHERE, eso es para SELECT/UPDATE/DELETE. Quítalo de los dos INSERT.

La segunda es la que realmente resuelve tu duda: como Enlaces y Publicacion son tablas distintas relacionadas, tienes que insertar primero en Enlaces, recuperar el CodEnlace que se acaba de generar (autonumérico), y usarlo después para el INSERT en Publicacion:

<%
' 1. Insertamos el enlace primero
SQL = "INSERT INTO Enlaces (Titulo, Descripcion, URL) VALUES ('" & Request.Form("Titulo") & "', '" & Request.Form("Descripcion") & "', '" & Request.Form("dirURL") & "')"
Conexion.Execute SQL

' 2. Recuperamos el codigo autonumerico recien creado
Set RS = Conexion.Execute("SELECT @@IDENTITY AS NuevoCodigo")
nuevoCodEnlace = RS("NuevoCodigo")
RS.Close

' 3. Ahora si podemos insertar en Publicacion, con el CodEnlace nuevo
SQL = "INSERT INTO Publicacion (CodUsers, CodEnlace, Publico) VALUES ('" & Session("CodUsuario") & "', '" & nuevoCodEnlace & "', '" & Request.Form("Publico") & "')"
Conexion.Execute SQL
%>

@@IDENTITY devuelve el último valor autonumérico generado en la conexión actual, justo después de un INSERT en una tabla con esa columna. Es la pieza que te faltaba: sin ella no hay forma de saber qué CodEnlace le toca al enlace recién creado.

Un detalle importante sobre lo que guardas en sesión: ahora mismo guardas Session("usuario") = Request.form("usLog"), que es el login (texto), pero para el INSERT en Publicacion necesitas el código numérico del usuario (CodUsers), no su login. En el momento en que compruebes el login y la contraseña al iniciar sesión, guarda también Session("CodUsuario") = RS("CodUsers"), para tenerlo disponible después sin tener que volver a consultar la base de datos.

Y ya que empiezas, un aviso a futuro que no es culpa tuya (así se escribía ASP clásico en su época): meter Request.Form(...) directamente dentro de la cadena SQL, como en tu código, es vulnerable a inyección SQL, si alguien escribe un valor con comillas simples en el formulario puede alterar la consulta. La solución correcta sería usar Command con parámetros en vez de concatenar texto, pero es un tema aparte del que preguntas, si te interesa profundizar en ello, avísame.

Elena