Hola.
Tu problema está en que en la base de datos almacenas tanto url de los archivos externos como nombres de archivo de tus archivos locales. Y en el segundo código, en el header, pones siempre la ruta local mas lo que se obtenga de la base de datos.
Si en la base de datos tienes dos registros, a) miarchivo.zip y b)http://sitio.com/archivoexterno.zip, cuando se envíe el header estarás enviando para, a) http://localhost/counter/descargas/miarchivo.zip pero para b) http://localhost/counter/descargas/http://sitio.com/archivoexterno.zip
Una solución podría ser detectar si en el campo devuelto de la base de datos existe 'http://' y enviar una cabecera u otra en función de lo que sea. Pero es bastante chapucera. Podría ser algo asi:
Código PHP:
//Si comienza por http, https o ftp...
if(preg_match("#^(http|https|ftp)://#", $archivo))
{
//... se trata de una url externa
header("Location: $archivo");
}
else
{
//si no, se trata de un archivo local
header("Location: http://localhost/counter/descargas/$archivo");
}
Por cierto, investiga sobre la inyección de código SQL, que tu script falla en eso.
Saludos.