Sobre htmlspecialchars() .. lo debes de usar en el momento que presentas HTML en tu foro o bien lo guardas "limpio de html" cuando insertes tu dato en tu Base de dtos campo q corresponda al mensaje (en realidad todos deberian ser)
Lo de la recarga se produce porque trabajas la parte q presenta eso datos y la q lo gestiona en la misma página .. Por eso el navegador te pide confirmación para reenviar los dtos nuevamente y por eso mismo tu lógica detecta los mismos datos .. Eso sumado a campos autoincrementales en las BD ocasiona ese efecto ..
La forma de solucionarlo (por lo menos la mas efectiva q uso yo) es redireccionando (aunque sea a la misma página) al terminar los procesos de INSERT/DELETE/UPDATE de tu Base de dato
Esto lo haces via:
header("Location: comosellametupagina.php");
exit;
(o puedes usar $_SERVER['PHP_SELF'] .. si quieres para obtner el nombre de la página en curso..)
Si lo usas en tu código tal cual está te va a dar un error aceca de las cabeceras ..
Esta parte de cabeceras HTML
<html>
<head>
<title> The Internet Joke Database </title>
</head>
<body>
no debe estar ahi .. solo debe de mostrarse cuando vallas a mostrar datos en el navegador .. En tu caso es cuando se usa el formulario .. o se muestra el SELCT q tienes por ahí .. Te recomiendo q pongas eso en una funcion .. y lo llames cuando sea necesario ... Lo mismo para el píe de página . aunque podría quedarse ahí ..
Los mensajes de error o como fué el proceso NO deberias mostrarlo ahí .. en ese punto (usando header() ) ..sino mandar alguna variable de control a "si mismo" (a la misma página) ejemplo:
Código PHP:
if(...){
// caso error
header("location: comosellametupagina.php?error=codigotuyo");
exit;
} else {
// caso error
header("location: comosellametupagina.php?ok=codigotuyo");
exit;
}
y en tu código principal .. usar algun condicional tipo:
Código PHP:
if (isset($_GET['error'])){
echo "hay un error .. codigo".$_GET['error'];
}
if (isset($_GET['ok'])){
echo "Todo bien .. codigo".$_GET['error'];
}
Es decir .. Si hay alguna de estas variables error o OK .. se muestra el mensaje deacuerdo con la accion .. He de ahí ese "codigo" .. puedes emplear lo q quieras .. Lo mas funcional suele ser usar un array con tus mensajes de errror o OK .. y usar ese "codigo" como un indice del array .. $mensajes[$error] .. etc ..
Un saludo,