Alguien que sepa de PHP

Mi intencion es que cuando control.php valide el codigo, que me inicie la descarga automatica del archivo dependiendo del valor de $id

control.php

// Aquí has de poner los datos para conectarte al servidor MySQL
$username="root";
$password="marmolillo";
$database="test";

// Leemos lo que nos han pasado en el formulario
$codigo=$_POST['codigo'];
$id=$_POST['id'];

// Conectamos a la base de datos (normalmente, siempre se hace igual)
mysql_connect(localhost,$username,$password);
@mysql_select_db($database) or die( "Unable to select database");

// Preparamos la consulta SQL ...
$query = "UPDATE ia_codigos SET estado=1 WHERE codigo='$codigo' AND estado = 0";

// ... y la ejecutamos
mysql_query($query);

// Como ha ido?
if (mysql_affected_rows() == 0)
{
// $id = 1;
echo $id;
// No hemos modificado ningún registro!!
// - posibilidad 1: es un código inventado que no tenemos en la BBDD
// - posibilidad 2: sí lo tenemos, pero ya lo han usado (Estado=1)
// En cualquier caso...
echo "Codigo incorrecto";
} else {
echo $id;
echo "Hemos modificado un registro (== el código es bueno)";
if ($id > 0 && $id < 21){
echo "";
} else {
echo "Este video no existe";
echo "el id es $id";
}
}

mysql_close();
?>

En principio creo que el "
";

tendria que descargarme el video1.zip, pero no lo hace

¿Alguien sabe cual es el problema?
Mi consejo, una vez que tengas la web generada en html, recisalo y aseguraté de que el html generado sea correcto.

No sé que esperas que haga el código
echo "<a href='video$id.zip'</a>";


pero apostaría una servesita a que el fallo anda por ahí.

Saludos
Prueba 2 cositas a ver si hay suerte.

Tu código original:

echo "";

Lo que creo que te puede servir:

echo "
Bajate el vídeo ";

Con \" escapas las comillas dobles. Al hacer . $id . intercalas el valor de $id en el literal. Si no me he equivocado (que es más que probable) te debería quedar al final algo asi en html:

Bájate el vídeo

Por cierto, no tenías bien cerrado el tag de a href.

Espero que te sirva.

Suerte y saludos. [bye]
Yo lo haria mejor así:

<?
   // CODIGO PREVIO DE VALIDACION (pon las comprobaciones de antes)
   
   header("Content-type: application/zip");
   header('Content-Disposition: attachment; filename="nombrequequieras.zip"');
   
   // Este es el archivo, lo de antes es el nombre del archivo predeterminado a la hora de guardarlo
   readfile('/ruta/archivoadescargar.zip');
?>


Una recomendación: mírate la función header (http://es2.php.net/header)

Un saludo.
Gracias a todos por la ayuda.
Estoy intentando que la descarga sea automatica, (que se me habra la ventanita de descarga una vez validado el codigo) ¿sabeis a que me refiero? he visto que hay una instruccion como esta que puede servir:

o algo asi.
Si alguien sabe como lo puedo lograr se lo agradeceria
Gracias a tudos
soymatrixmoy escribió:Gracias a todos por la ayuda.
Estoy intentando que la descarga sea automatica, (que se me habra la ventanita de descarga una vez validado el codigo) ¿sabeis a que me refiero? he visto que hay una instruccion como esta que puede servir:

o algo asi.
Si alguien sabe como lo puedo lograr se lo agradeceria
Gracias a tudos


Si miras mi código de arriba, te explica como hacerlo.

Sólo tienes que añadir arriba tu código PHP de validación y cambiar el tipo de archivo (si no quieres que sea un zip) y las rutas y nombres de los archivos a descargar.

Te recomiendo de nuevo que te mires la documentación de la función header.

Un saludo.
Pues yo de php no es mucho (mejor dicho no sé nada), pero la verdad es que nunca me gustó su forma de trabajar. Me parece un lenguaje que hace demasiadas cosas "por detrás", y con una lógica extraña en las condionales...

Yo al menos nunca he entendido cómo interpreta el php la asignación dentro de una condición...porque en cada ejemplo que veo me queda menos claro. Y para el c++, una asignación es siempre verdadera, excepto cuando no puede asignarla por alguna razón. Y es lógico.

Bueno, puede que mi post no haya sido de ayuda, simplemente era mi opinión sobre el tema xd creo que me gusta más ASP.net, aunque sea de microsoft y only for windows...
Zor escribió:Pues yo de php no es mucho (mejor dicho no sé nada), pero la verdad es que nunca me gustó su forma de trabajar. Me parece un lenguaje que hace demasiadas cosas "por detrás", y con una lógica extraña en las condionales...

Yo al menos nunca he entendido cómo interpreta el php la asignación dentro de una condición...porque en cada ejemplo que veo me queda menos claro. Y para el c++, una asignación es siempre verdadera, excepto cuando no puede asignarla por alguna razón. Y es lógico.



El manual de php.net lo explica perfectamente.
Y para el c++, una asignación es siempre verdadera, excepto cuando no puede asignarla por alguna razón. Y es lógico.


What ?

- ferdy
perdonalos, ferdy... no saben lo que dicen...

para C, cualquier valor DISTINTO de 0 es VERDADERO, y el 0 es mas FALSO que un euro de madera.

pero claro luego me encuentro 'wannabes' escribiendo C y leo cosas como...

if (a=4) {
.....
}

y claro, luego pasa lo que pasa...
Este es el error que me da cuando pongo la instruccion header:


Warning: Cannot modify header information - headers already sent by (output started at C:\Program Files\xampp\htdocs\[url]www.fwf.com\paginas[/url] videos\control.php:35) in C:\Program Files\xampp\htdocs\[url]www.fwf.com\paginas[/url] videos\control.php on line 39

Warning: Cannot modify header information - headers already sent by (output started at C:\Program Files\xampp\htdocs\[url]www.fwf.com\paginas[/url] videos\control.php:35) in C:\Program Files\xampp\htdocs\[url]www.fwf.com\paginas[/url] videos\control.php on line 40

Warning: readfile(/video$id.zip) [function.readfile]: failed to open stream: No such file or directory in C:\Program Files\xampp\htdocs\[url]www.fwf.com\paginas[/url] videos\control.php on line 43


control.php:

if ($id > 0 && $id < 21){
// CODIGO PREVIO DE VALIDACION (pon las comprobaciones de antes)

header("Content-type: application/zip");
header('Content-Disposition: attachment; filename="nombrequequieras.zip"');

// Este es el archivo, lo de antes es el nombre del archivo predeterminado a la hora de guardarlo
readfile('video$id.zip');

} else {
echo "Este video no existe";
}
}



No me aclaro con el tema y como siempre seguro que sera una chorrada pero no doy con ella
Seguramente tengas tres errores, el primero y fundamental es que si haces un echo "ALGO"; mandas la cabecera por lo que luego no puedes cambiarla llamando a la funcion header. Así que no hagas ningún echo.

Segundo, seguramente hayas empezado con las etiquetas etc. Eso tampoco lo hagas, que es lo mismo que hacer el pto 1.

Tercero llamas mal a la función readfile, mejor haz esto:

$nombre = "video" . $id . ".zip";
readfile($nombre);

No es lo mismo "video$id.zip" que eso, porque lo interpreta como $id a secas sin interpretarlo.

Esto a mí me funciona:

<?
$id = $_GET['id'];
if (isset($id) && $id > 0 && $id < 21)
{
        // CODIGO PREVIO DE VALIDACION (pon las comprobaciones de antes)

      header("Content-type: application/zip");
      header('Content-Disposition: attachment; filename="nombrequequieras.zip"');

        // Este es el archivo, lo de antes es el nombre del archivo predeterminado a la hora de guardarlo
        $nombre="video" . $id . ".zip";
        readfile($nombre);
        exit(0);
}
else
{
        // Aquí si quieres pon <!DOCTYPE> <html>.......<head>....</head><body>
        echo "MAL";
        // Y cerrando</body></html>
}
?>



Suerte.

Un saludo.
Pues eso amigos solo deciros que mil gracias a todos por la ayuda que me habeis dado el codigo funciona a la perfeccion.
Gracias
Gracias
Gracias

En esta instruccion que es lo que esta mal?


Un saludo
13 respuestas