No se trata de probar y probar todo lo que se nos dice buscando la ¡
combinación mágica! que nos de el resultado esperado.
El "problema" (digamos mejor, la confusión) es que
htmlspecialchars() por defecto solo convierte las comillas dobles mientras que las simples las deja intactas. Para solucionar tu problema opta por:
1. Encerrar los valores de los atributos de tus tags HTML con comillas
dobles (más recomendable)
ó
2. Usar
htmlspecialchars() pasándole como segundo parámetro la constante ENT_QUOTES para que así convierta también las comillas simples.
Ahora, para el error al insertar en la base de datos. o más recomendable es usar
mysql_real_escape_string() que cumple la misma función que addslashes (agregar barras) pero está especializada y orientada a prevenir los
SQL Injection. Desde mi punto de vista, los datos en una base de datos deben ser una copia fiel de lo que se quizo guardar originalmente, es decir, no debería convertirse a entidades html (
htmlspecialchars()) ni usar otras funciones afines, como
nl2br(), que alteran el "texto nativo". Estas funciones deberían ser solo aplicadas al momento de mostrar los datos.
Y por ultimo, es un estándar HTML que todo texto que cumpla la función de valor de un atibuto en un tag debe estar codificada en sus respectivas entidades html. Es decir, siempre debes aplicar a tu texto
htmlspecialchars() o
htmlentities() si lo piensas usar, por ejemplo, en el value de un input.