Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] problema con consulta a base de datos

Estas en el tema de problema con consulta a base de datos en el foro de PHP en Foros del Web. Hola, pues tengo un problema con un codigo, y es que no me escribe la consulta como yo deseo, el codigo es el siguiente(gracias a ...

  #1 (permalink)  
Antiguo 18/01/2013, 16:10
Avatar de Most  
Fecha de Ingreso: marzo-2009
Mensajes: 642
Antigüedad: 15 años, 1 mes
Puntos: 6
problema con consulta a base de datos

Hola, pues tengo un problema con un codigo, y es que no me escribe la consulta como yo deseo, el codigo es el siguiente(gracias a dashtrash):

Código PHP:
<html>
<head>
<title>Problema</title>
</head>
<body>
<?php
//Obtenemos ID
$id=$_GET[id];
//Seleccionamos BD
require("conexion.php");
$result=mysql_query("select * from navi where id_navi='$id'"
,$connect);

$counter=0;
$text="";
$currentFile=null;
 
$cabecera="cabecera"
$pie="Este es mi pie";
 
// $res es el resultado de mysql_query de tu consulta.
while($row=mysql_fetch_array($result))
{
     if(
$counter%10==0)
     {
            if(
$currentFile!=null)
            { 
                
fwrite($currentFile$pie);           
                
fclose($currentFile);
             }
             
$currentFile=fopen("miFichero".($counter/10).".txt","w");
             
fwrite($currentFile$cabecera);
     }
    
fwrite($currentFile"# ".$row[id_navi]."
type=video
name="
.$row[titulo]."
thumb="
.$row[caratula]."
URL="
.$row[url]."
"
.$row[procesador]."\n\n");
    
$counter++; 
}
if(
$currentFile)
     
fclose($currentFile);
     
     
mysql_free_result($result);
     
mysql_close($connect);
     
header("location: url.php");

  
?>
  
</body>
</html>
y lo que quiero conseguir con el, es que al darle a un enlace que lleve a este codigo con un ID:

http://web.com/hecho.php?id=1


pero no me escribe la ID debajo de otra ID, si no, que me actualiza el que ya hay escrito en el archivo de texto, alguna solucion?
  #2 (permalink)  
Antiguo 18/01/2013, 16:20
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: problema con consulta a base de datos

Por favor intenta esforzarte un poco más, debes consultar el manual de cada función que uses y no sepas lo que hace con exactitud.

Que te hayan ayudado con el código no quiere decir que esté completamente resuelto.

La función fopen() acepta un parámetro para abrir el archivo, en el código que tienes se usa "w" que abre el archivo para escribir completamente en él.

Esa es la razón de que borre todo cada vez.

Debes cambiar el modo de apertura a uno que permita añadir contenido al archivo sin borrar nada, consulta el manual.

http://php.net/manual/es/function.fopen.php
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 18/01/2013, 16:36
Avatar de Most  
Fecha de Ingreso: marzo-2009
Mensajes: 642
Antigüedad: 15 años, 1 mes
Puntos: 6
Respuesta: problema con consulta a base de datos

Cita:
Iniciado por pateketrueke Ver Mensaje
Por favor intenta esforzarte un poco más, debes consultar el manual de cada función que uses y no sepas lo que hace con exactitud.

Que te hayan ayudado con el código no quiere decir que esté completamente resuelto.

La función fopen() acepta un parámetro para abrir el archivo, en el código que tienes se usa "w" que abre el archivo para escribir completamente en él.

Esa es la razón de que borre todo cada vez.

Debes cambiar el modo de apertura a uno que permita añadir contenido al archivo sin borrar nada, consulta el manual.

http://php.net/manual/es/function.fopen.php

Ok, gracias :) ya se el por que me pasa por lo menos, es que no tenia ni idea muchas gracias


EDITO: He usado lo siguiente:

$currentFile=fopen("miFichero".($counter/10).".txt","a");

esto, me abre sin borrar nada, pero cada vez que me escribe, me escribe la cabecera tambien, y la cabecera solo quiero que me la escriba una vez en el principio de cada txt :S


EDITO2: He probado todas las formas 1 x 1 y no hay manera, menos la de lectura solo claro...

he estado mirando y creo que es por esto, por lo que me escribe la cabecera siempre con a:

$currentFile=fopen("miFichero".($counter/10).".txt","a");
fwrite($currentFile, $cabecera);

por que esta puesto para que escriba siempre eso, como podria solucionarlo, seria algo como esto?
que es para imprimir el pie...

Código PHP:
Ver original
  1. if($currentFile!=null)
  2.             {
  3.                 fwrite($currentFile, $pie);          
  4.                 fclose($currentFile);
  5.             }

Última edición por Most; 18/01/2013 a las 17:20
  #4 (permalink)  
Antiguo 18/01/2013, 21:13
Avatar de Most  
Fecha de Ingreso: marzo-2009
Mensajes: 642
Antigüedad: 15 años, 1 mes
Puntos: 6
Respuesta: problema con consulta a base de datos

Nada, son las 4 de la mañana, llevo 4h con lo mismo y sigo con lo mismo, con a se inserta una debajo de otra y no reemplaza, pero se inserta mal, cada vez que inserta se pone asi:


Cita:
CABECERA

# 1
type=video
name=nombre
thumb=web.com/caratula
URL=web.com/url

CABECERA

# 2
type=video
name=nombre
thumb=web.com/caratula
URL=web.com/url

CABECERA

# 3
type=video
name=nombre
thumb=web.com/caratula
URL=web.com/url
vamos, que se imprime la cabecera en cada consulta, y el limitador de X consultas no funciona y sige imprimiendo los datos que le señalo, sin fin.
  #5 (permalink)  
Antiguo 19/01/2013, 12:08
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: problema con consulta a base de datos

Lo que pasa es que con el código que tienes no va a funcionar, no es algo mágico, tienes que tener más control sobre lo que va a hacer tu código.

Es decir, tienes que tener alguna manera de indicarle a tu programa que ya escribiste la cabecera y si no lo haz hecho escribir la cabecera, y ya posteriormente escribir todo el contenido que necesites.
  #6 (permalink)  
Antiguo 19/01/2013, 13:06
Avatar de Most  
Fecha de Ingreso: marzo-2009
Mensajes: 642
Antigüedad: 15 años, 1 mes
Puntos: 6
Respuesta: problema con consulta a base de datos

Cita:
Iniciado por GatorV Ver Mensaje
Lo que pasa es que con el código que tienes no va a funcionar, no es algo mágico, tienes que tener más control sobre lo que va a hacer tu código.

Es decir, tienes que tener alguna manera de indicarle a tu programa que ya escribiste la cabecera y si no lo haz hecho escribir la cabecera, y ya posteriormente escribir todo el contenido que necesites.

eso lo se, que tengo que indicarle al php que ya ha escrito la cabecera, la cuestion es como se lo indico, seria hacer algo parecido a lo que indica que escriba el pie ?(aun que tampoco funciona el limitador de texto pero bueno)
  #7 (permalink)  
Antiguo 19/01/2013, 13:56
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años
Puntos: 270
Respuesta: problema con consulta a base de datos

Supongo que, si el fichero existe (file_exists()), es que ya has escrito la cabecera, con lo que no tienes que volver a escribirla.
Ahora bien, otra cosa es el pie.Qué es lo que vas a hacer con él , si añades líneas al fichero? Si lo que quieres es mover el pie hacia abajo, tendrás que buscar el pie dentro del contenido actual, y hacer fseek(), escribiendo a partir de ahi.
  #8 (permalink)  
Antiguo 19/01/2013, 15:00
Avatar de Most  
Fecha de Ingreso: marzo-2009
Mensajes: 642
Antigüedad: 15 años, 1 mes
Puntos: 6
Respuesta: problema con consulta a base de datos

Cita:
Iniciado por dashtrash Ver Mensaje
Supongo que, si el fichero existe (file_exists()), es que ya has escrito la cabecera, con lo que no tienes que volver a escribirla.
Ahora bien, otra cosa es el pie.Qué es lo que vas a hacer con él , si añades líneas al fichero? Si lo que quieres es mover el pie hacia abajo, tendrás que buscar el pie dentro del contenido actual, y hacer fseek(), escribiendo a partir de ahi.

no te he entendido , solo he entendido que tendria que usar file_exists (que ahora me leere el tutorial) y poco mas
  #9 (permalink)  
Antiguo 19/01/2013, 16:03
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años
Puntos: 270
Respuesta: problema con consulta a base de datos

Cita:
esto, me abre sin borrar nada, pero cada vez que me escribe, me escribe la cabecera tambien, y la cabecera solo quiero que me la escriba una vez en el principio de cada txt :S
Si el fichero existe, es que ya tiene la cabecera, no? Por lo tanto, con file_exists(), sabes si ya existe el fichero, y si existe, es que tiene cabecera, y por lo tanto, no la tienes que volver a escribir.
Con eso, no vuelves a escribir la cabecera.
Pero si el fichero existe, y no es el último fichero, también tiene un pie.Si añades al fichero, añadirás después del pie.Y, supongo, que no quieres hacer eso..

Porque..qué es lo que quieres hacer?
Alguien escribe algo en un input de un formulario.De ahí , generas unos ficheros, con cabecera y pie.
Si, después, se vuelve a enviar ese formulario, lo que quieres hacer es añadir a los ficheros que generaste antes?Crear ficheros nuevos..?
  #10 (permalink)  
Antiguo 19/01/2013, 16:16
Avatar de Most  
Fecha de Ingreso: marzo-2009
Mensajes: 642
Antigüedad: 15 años, 1 mes
Puntos: 6
Respuesta: problema con consulta a base de datos

Cita:
Iniciado por dashtrash Ver Mensaje
Si el fichero existe, es que ya tiene la cabecera, no? Por lo tanto, con file_exists(), sabes si ya existe el fichero, y si existe, es que tiene cabecera, y por lo tanto, no la tienes que volver a escribir.
Con eso, no vuelves a escribir la cabecera.
Pero si el fichero existe, y no es el último fichero, también tiene un pie.Si añades al fichero, añadirás después del pie.Y, supongo, que no quieres hacer eso..

Porque..qué es lo que quieres hacer?
Alguien escribe algo en un input de un formulario.De ahí , generas unos ficheros, con cabecera y pie.
Si, después, se vuelve a enviar ese formulario, lo que quieres hacer es añadir a los ficheros que generaste antes?Crear ficheros nuevos..?

a ver mira, del formulario se manda a la base de datos, de ahi, se coje la ID de lo que acabo de mandar a la base de datos a traves de el formulario, a traves de URL (http://web/ejemplo.php?id=1) y ese ID se debe de escribir en la el archivo, pero solo ese ID, despues si se quiere añadir otro ID pues lanzas otra url con otra id (http://web/ejemplo.php?id=2) y que este, se añada debajo de el anterior, y que al llegar a los IDs deseados se cierre con el pie escrito y se cree otro con la cabecera deseada, y que siga introduciendo los datos de las respectivas IDs en ese nuevo archivo, y asi constantemente. Ese es el objetivo.


algo asi con lo de file_exists? :

Código PHP:
Ver original
  1. if (file_exists($CurrentFile)) {
  2.     fwrite($currentFile, $cabecera);
  3. } else {
  4.  
  5. }

Última edición por Most; 19/01/2013 a las 16:42
  #11 (permalink)  
Antiguo 19/01/2013, 17:08
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años
Puntos: 270
Respuesta: problema con consulta a base de datos

Ah.Ahora entiendo lo que quieres hacer .
El código que tienes hasta ahora, va bien para resolver sólo 1 post del formulario.Si ese post da más de 40 lineas, creará otro fichero.
Pero no va a funcionar bien para ir añadiendo (ni siquiera sabía que eso era lo que querias hacer).
Ir añadiendo, significa :

- 1) Encontrar cuál es el último fichero escrito, si existe.
- 2) Encontrar cuántas líneas hay escritas en ese fichero.

Para 1), lo más sencillo es directamente ir mirando si existen los ficheros de datos o no.Con el código que tienes, los ficheros de datos tienen la forma miFichero1.txt, miFichero2.txt...etc.
Con un bucle, y file_exists(), sabes cual es el ultimo.

Para 2), con file() , y teniendo en cuenta que no tienes que contar la cabecera, sabrás cuántas filas se han escrito ya ese fichero.
Para hacer el mínimo de modificaciones a lo que ya tienes, $counter lo tienes que inicializar a 40*(numero de ficheros completos) + (numero de filas encontradas en el ultimo fichero).Además, tienes que hacer $currentFile=fopen(....) del ultimo fichero, en modo "a".

Todo eso debe ocurrir antes de entrar en el bucle.Básicamente, todo lo anterior sirve para devolver las variables $counter y $currentFile al estado en el que se encontraban la última vez que se llamó.
  #12 (permalink)  
Antiguo 19/01/2013, 17:25
Avatar de Most  
Fecha de Ingreso: marzo-2009
Mensajes: 642
Antigüedad: 15 años, 1 mes
Puntos: 6
Respuesta: problema con consulta a base de datos

he leido tu ultimo mensaje como 10 veces, y sigo sin enterarme, estoy mirando como hacer el bucle que me compruebe la existencia del archivo, asta ahora sin exito seguire buscando a ver...

Con un bucle, y file_exists(), sabes cual es el ultimo.
Exactamente para que quiero saber el ultimo fichero existente?
  #13 (permalink)  
Antiguo 19/01/2013, 17:51
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años
Puntos: 270
Respuesta: problema con consulta a base de datos

Vale.A ver, si no sabes para qué necesitas saber cuál es el ultimo fichero, es que a lo mejor, yo no entiendo qué quieres hacer tú.
Hablas de campos de texto en formularios, id's que pasas por GET, y rows que vienen de consulta, y ficheros que se tienen que cortar cuando lleguen a 40.
Y esos 40, unas veces son id's, otras veces son rows de la consulta...
De verdad, no entiendo qué quieres hacer.
  #14 (permalink)  
Antiguo 19/01/2013, 18:14
Avatar de Most  
Fecha de Ingreso: marzo-2009
Mensajes: 642
Antigüedad: 15 años, 1 mes
Puntos: 6
Respuesta: problema con consulta a base de datos

Cita:
Iniciado por dashtrash Ver Mensaje
Vale.A ver, si no sabes para qué necesitas saber cuál es el ultimo fichero, es que a lo mejor, yo no entiendo qué quieres hacer tú.
Hablas de campos de texto en formularios, id's que pasas por GET, y rows que vienen de consulta, y ficheros que se tienen que cortar cuando lleguen a 40.
Y esos 40, unas veces son id's, otras veces son rows de la consulta...
De verdad, no entiendo qué quieres hacer.

es que es un poco rayante si, a ver intentare explicartelo con todo detalle...


1.- Formulario

Esto en realidad no me servira para nada a la hora de usar el codigo que necesito, solo servira para subir los datos a la base de datos.

2.- Verificacion

Lo que busco con esto, es que si alguien sube datos a la base de datos yo los tenga que verificar con un link, y al verificarlo, me mandara al php que estamos hablando en este post.

3.- Recibiendo datos

Este php despues de recibir los datos deberia de cojer la ID de el link que acabamos de mandar ($id=$_GET[id];) y cojer los datos que yo le señalo referentes a esa ID.

Código PHP:
# ".$row[id_navi]."
type=video
name
=".$row[titulo]."
thumb=".$row[caratula]."
URL=".$row[url]." 
4.- Funcion al recibir los datos

Una vez recibidos los datos, el php debera imprimirlos en el archivo

5.- Modo de insercion y limites

5.1 Si el archivo no existe, se creara

5.2 Si el php imprime los datos por primera vez en un archivo vacio, que añada la cabecera al principio de este archivo.

5.3 Si el php imprime los datos despues de la primera vez, que solo imprima los datos, sin cabecera.

5.4 Si el php imprime los datos 40 veces, que imprima el pie de pagina, cierre ese archivo, no vuelva a escribir en el y cree otro archivo nuevo (MiFichero2.txt).

5.5 Si el php vuelve a imprimir algun dato mas, que lo imprima en MiFichero2.txt, pero que antes de imprimir haga como en el paso 5.1.


Despues del paso 5.5 que empiece de nuevo por el 5.3

---------------------------------------------------------------------------------------

Me he explicado mejor?

Última edición por Most; 19/01/2013 a las 18:28
  #15 (permalink)  
Antiguo 19/01/2013, 18:43
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años
Puntos: 270
Respuesta: problema con consulta a base de datos

Cita:
Iniciado por Most Ver Mensaje

5.- Modo de insercion y limites

5.1 Si el archivo no existe, se creara

5.2 Si el php imprime los datos por primera vez en un archivo vacio, que añada la cabecera al principio de este archivo.

5.3 Si el php imprime los datos despues de la primera vez, que solo imprima los datos, sin cabecera.

5.4 Si el php imprime los datos 40 veces, que imprima el pie de pagina, cierre ese archivo, no vuelva a escribir en el y cree otro archivo nuevo (MiFichero2.txt).

5.5 Si el php vuelve a imprimir algun dato mas, que lo imprima en MiFichero2.txt, pero que antes de imprimir haga como en el paso 5.1.


Despues del paso 5.5 que empiece de nuevo por el 5.3

---------------------------------------------------------------------------------------

Me he explicado mejor?
A ver si es esto.
5.- Modo de insercion y limites

5.1 Si no existe ningún archivo, o el último escrito tiene 40 lineas (excluyendo cabecera y pie), se crea uno nuevo.

5.2 Si el fichero es nuevo, añadir cabecera.

5.3 "Si el php imprime los datos despues de la primera vez", supongo que significa , "si el php es llamado de nuevo, en una nueva request".Si es eso lo que significa, automáticamente sabes por qué necesitas encontrar cuál es el último fichero en el que se ha escrito.

5.4 "Si el php imprime los datos 40 veces" supongo que significa que "cuando, al añadir líneas en la primera, o en otras requests a ese php, el fichero actual llegue a tener 40 lineas".En ese caso, se añade el pie, y se crea un archivo nuevo. (MiFichero2.txt).

5.5 "Si el php vuelve a imprimir algun dato mas, que lo imprima en MiFichero2.txt," supongo que significa que "si en la request actual, aún quedan filas de la base de datos por guardar, siga guardando en el nuevo fichero, tras añadir la cabecera.5.1.

Si es como he puesto arriba, el algoritmo es sencillo:

1) Encontrar dónde me quedé.Dónde me quedé significa saber cuál fue el último fichero donde se escribió, y cuántas filas de la base de datos se escribieron en él.

2)Si no existe ningún fichero, es que es la primera vez que se llama.El algoritmo que tenías va a funcionar bien.

3)Pero si existe algún fichero, hay que inicializar las variables a un estado compatible con el algoritmo que tenías.Y esto es, asignar valores a $counter, y $currentFile, que es lo que te decía en un post anterior.
  #16 (permalink)  
Antiguo 19/01/2013, 18:51
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años
Puntos: 270
Respuesta: problema con consulta a base de datos

A ver si esto es lo que quieres:
- Request 1:
Se hace una consulta a la base de datos.Se obtienen 10 filas.
Estado final:
Fichero Mitexto1.txt, con cabecera, y 10 filas.

- Request 2:
Se hace una consulta a la base de datos.Se obtienen 25 filas.
Estado final:
Fichero Mitexto1.txt, con cabecera, y 35 filas.

- Request 3:
Se hace una consulta a la base de datos.Se obtienen 50 filas.
Estado final:
Fichero Mitexto1.txt con cabecera, 40 filas, y pie.
Fichero Mitexto2.txt con cabecera, 40 filas, y pie.
Fichero Mitexto3.txt con cabecera, y 5 filas.

Es eso??
  #17 (permalink)  
Antiguo 19/01/2013, 18:55
Avatar de Most  
Fecha de Ingreso: marzo-2009
Mensajes: 642
Antigüedad: 15 años, 1 mes
Puntos: 6
Respuesta: problema con consulta a base de datos

con:

5.5 "Si el php vuelve a imprimir algun dato mas, que lo imprima en MiFichero2.txt,"

quiero decir, que si le señalo con la URL (blabla.com/bla.php?=1) que lo imprima en MiFichero2.txt ya que el MiFichero1.txt ya tiene el limite que yo quiero que es 40...


------------------------

Por lo demas... me he quedado un poco perdido la verdad no entiendo muy bien lo que debo hacer


EDITO: Espera que lea el otro post que has puesto que no lo he leido.
  #18 (permalink)  
Antiguo 19/01/2013, 18:59
Avatar de Most  
Fecha de Ingreso: marzo-2009
Mensajes: 642
Antigüedad: 15 años, 1 mes
Puntos: 6
Respuesta: problema con consulta a base de datos

EDITO: Si, es como lo has escrito tu... que los 3 son el ejemplo no me dado cuenta xd
  #19 (permalink)  
Antiguo 19/01/2013, 19:04
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años
Puntos: 270
Respuesta: problema con consulta a base de datos

Juas..Pues no lo entiendo..
A ver..
En la request 1 se obtienen 10 filas, y se meten en el primer fichero, que queda con 10 lineas.
En la request 2, se obtienen 25 filas, y se meten en el primer fichero, que queda con 35 lineas, las 10 antiguas más 25 nuevas.No me has corregido eso.
En la request 3, si se obtienen 50 filas, y lo que tiene que hacer todo esto, es añadir a los ficheros, todo tiene que quedar como yo he escrito, y no como tú me has corregido.

Ahora bien.
A ver si lo que quieres es esto....
- Request 1:
Se hace una consulta a la base de datos.Se obtienen 10 filas.
Estado final:
Fichero CONSULTA1_1.txt, con cabecera, y 10 filas.

- Request 2:
Se hace una consulta a la base de datos.Se obtienen 25 filas.
Estado final:
Fichero CONSULTA2_1.txtcon cabecera, y 25 filas.

- Request 3:
Se hace una consulta a la base de datos.Se obtienen 50 filas.
Estado final:
Fichero CONSULTA3_1.txt con cabecera, 40 filas, y pie.
Fichero CONSULTA3_2.txt con cabecera y 10 filas.

O sea, diferente conjunto de ficheros por cada request...
  #20 (permalink)  
Antiguo 19/01/2013, 19:09
Avatar de Most  
Fecha de Ingreso: marzo-2009
Mensajes: 642
Antigüedad: 15 años, 1 mes
Puntos: 6
Respuesta: problema con consulta a base de datos

lee que lo he editado, si que era como lo habias dicho antes, lo que pasa es que me he liado, perdon.

Cita:
- Request 1:
Se hace una consulta a la base de datos.Se obtienen 10 filas.
Estado final:
Fichero Mitexto1.txt, con cabecera, y 10 filas.

- Request 2:
Se hace una consulta a la base de datos.Se obtienen 25 filas.
Estado final:
Fichero Mitexto1.txt, con cabecera, y 35 filas.

- Request 3:
Se hace una consulta a la base de datos.Se obtienen 50 filas.
Estado final:
Fichero Mitexto1.txt con cabecera, 40 filas, y pie.
Fichero Mitexto2.txt con cabecera, 40 filas, y pie.
Fichero Mitexto3.txt con cabecera, y 5 filas.
esa es la forma correcta
  #21 (permalink)  
Antiguo 19/01/2013, 19:16
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años
Puntos: 270
Respuesta: problema con consulta a base de datos

Cita:
Iniciado por Most Ver Mensaje
EDITO: Si, es como lo has escrito tu... que los 3 son el ejemplo no me dado cuenta xd
Ok.Entonces, supongamos que llega la Request 4.
La request 4, tiene, primero, que saber qué fichero es el último escrito.
Hay muchas formas de hacer esto, pero, para no liar más la cosa, vamos a "lo bestia".Debe mirar si existe MiTexto1.txt...MiTexto2.txt..miTexto3.txt...
Cuando llegue a un número (índice), y no exista el fichero, ya sabremos cuál es el último.
Lo anterior se resuelve con un bucle, y file_exists().

Ya sabe en qué fichero debe escribir.
Ahora le queda por saber CUÁNTAS líneas hay ya escritas en miTexto3.txt, para saber cuándo saltar.
Esto lo sabes con la función file(), y count().

Para que no tengas que modificar lo que ya hay dentro del bucle, lo más sencillo, es inicializar $counter a 40*(numero de ficheros completos)+(numero de lineas en el ultimo fichero).

Si al entrar al script, no existe fichero ninguno, $currentFile debe ser NULL, y $counter==0.

Si ya existen ficheros, $currentFile=fopen(<ultimo_fichero>,"a"), y $counter=40*(numero de ficheros completos)+(numero de lineas en el ultimo fichero, que está incompleto)...
  #22 (permalink)  
Antiguo 19/01/2013, 19:23
Avatar de Most  
Fecha de Ingreso: marzo-2009
Mensajes: 642
Antigüedad: 15 años, 1 mes
Puntos: 6
Respuesta: problema con consulta a base de datos

Cita:
Iniciado por dashtrash Ver Mensaje
Ok.Entonces, supongamos que llega la Request 4.
La request 4, tiene, primero, que saber qué fichero es el último escrito.
Hay muchas formas de hacer esto, pero, para no liar más la cosa, vamos a "lo bestia".Debe mirar si existe MiTexto1.txt...MiTexto2.txt..miTexto3.txt...
Cuando llegue a un número (índice), y no exista el fichero, ya sabremos cuál es el último.
Lo anterior se resuelve con un bucle, y file_exists().

Ya sabe en qué fichero debe escribir.
Ahora le queda por saber CUÁNTAS líneas hay ya escritas en miTexto3.txt, para saber cuándo saltar.
Esto lo sabes con la función file(), y count().

Para que no tengas que modificar lo que ya hay dentro del bucle, lo más sencillo, es inicializar $counter a 40*(numero de ficheros completos)+(numero de lineas en el ultimo fichero).

Si al entrar al script, no existe fichero ninguno, $currentFile debe ser NULL, y $counter==0.

Si ya existen ficheros, $currentFile=fopen(<ultimo_fichero>,"a"), y $counter=40*(numero de ficheros completos)+(numero de lineas en el ultimo fichero, que está incompleto)...

Ok, voy por partes, el bucle es como dije mensajes arriba? y a que se lo debo aplicara $currentfile?
  #23 (permalink)  
Antiguo 19/01/2013, 19:34
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años
Puntos: 270
Respuesta: problema con consulta a base de datos

No lo liemos más...Te lo escribo..Lo que hace, ya te lo he explicado..Por favor, lee este código, y al menos, intenta comprenderlo, ya que no tiene sentido que simplemente te lo resuelva..
Código PHP:
Ver original
  1. $k=1;
  2. while(file_exists("miFichero".$k.".txt"))$k++; // Este es el bucle.
  3. // Al salir del bucle, k indica que fichero NO existe.Asi que, el ultimo que existe es k-1.
  4. $k--;
  5.  
  6. // Ahora, si k > 1 , significa que hay más de un fichero.k-1 es el numero de ficheros completos.
  7. $counter=0;
  8. $currentFile=null;
  9.  
  10. if(k>0)
  11. {
  12.      $lines=file("miFichero".$k.".txt");
  13.      $counter=($lines-1); // se resta la linea de la cabecera.
  14.      $currentFile=fopen("miFichero".$k.".txt","a");
  15. }
  16. if(k>1)
  17.     $counter+=40*(k-1);
  18.  
  19. $text="";
  20.  
  21.  
  22.  
  23. $cabecera="cabecera";  
  24. $pie="Este es mi pie";
  25.  
  26. // $res es el resultado de mysql_query de tu consulta.
  27. while($row=mysql_fetch_array($result))
  28. {
  29.      if($counter%10==0)
  30.      {
  31.             if($currentFile!=null)
  32.             {  
  33.                 fwrite($currentFile, $pie);            
  34.                 fclose($currentFile);
  35.              }
  36.              $currentFile=fopen("miFichero".($counter/10).".txt","w");
  37.              fwrite($currentFile, $cabecera);
  38.      }
  39.     fwrite($currentFile, "# ".$row[id_navi]."
  40. type=video
  41. name=".$row[titulo]."
  42. thumb=".$row[caratula]."
  43. URL=".$row[url]."
  44. ".$row[procesador]."\n\n");
  45.     $counter++;  
  46. }
  47. if($currentFile)
  48.      fclose($currentFile);

No lo he probado.Pueden aparecer problemas.Pero ese es el algoritmo.
  #24 (permalink)  
Antiguo 19/01/2013, 19:40
Avatar de Most  
Fecha de Ingreso: marzo-2009
Mensajes: 642
Antigüedad: 15 años, 1 mes
Puntos: 6
Respuesta: problema con consulta a base de datos

Cita:
Iniciado por dashtrash Ver Mensaje
No lo liemos más...Te lo escribo..Lo que hace, ya te lo he explicado..Por favor, lee este código, y al menos, intenta comprenderlo, ya que no tiene sentido que simplemente te lo resuelva..
Código PHP:
Ver original
  1. $k=1;
  2. while(file_exists("miFichero".$k.".txt"))$k++; // Este es el bucle.
  3. // Al salir del bucle, k indica que fichero NO existe.Asi que, el ultimo que existe es k-1.
  4. $k--;
  5.  
  6. // Ahora, si k > 1 , significa que hay más de un fichero.k-1 es el numero de ficheros completos.
  7. $counter=0;
  8. $currentFile=null;
  9.  
  10. if(k>0)
  11. {
  12.      $lines=file("miFichero".$k.".txt");
  13.      $counter=($lines-1); // se resta la linea de la cabecera.
  14.      $currentFile=fopen("miFichero".$k.".txt","a");
  15. }
  16. if(k>1)
  17.     $counter+=40*(k-1);
  18.  
  19. $text="";
  20.  
  21.  
  22.  
  23. $cabecera="cabecera";  
  24. $pie="Este es mi pie";
  25.  
  26. // $res es el resultado de mysql_query de tu consulta.
  27. while($row=mysql_fetch_array($result))
  28. {
  29.      if($counter%10==0)
  30.      {
  31.             if($currentFile!=null)
  32.             {  
  33.                 fwrite($currentFile, $pie);            
  34.                 fclose($currentFile);
  35.              }
  36.              $currentFile=fopen("miFichero".($counter/10).".txt","w");
  37.              fwrite($currentFile, $cabecera);
  38.      }
  39.     fwrite($currentFile, "# ".$row[id_navi]."
  40. type=video
  41. name=".$row[titulo]."
  42. thumb=".$row[caratula]."
  43. URL=".$row[url]."
  44. ".$row[procesador]."\n\n");
  45.     $counter++;  
  46. }
  47. if($currentFile)
  48.      fclose($currentFile);

No lo he probado.Pueden aparecer problemas.Pero ese es el algoritmo.


la verdad es que me jode no enterarme, por que llevo 2 dias con lo mismo y lo que mas quiero es enterarme, voy a leer el codigo y si tengo alguna duda de alguna cosa del codigo te lo digo, por que no me gusta hacer perder tiempo a la gente, ya que bastante ocupados estareis, por eso no me gusta que me hagan las cosas pero bueno... gracias y ya te digo, si tengo alguna duda de alguna cosa del codigo de la funcion de alguna cosa la preguntare.

gracias.
  #25 (permalink)  
Antiguo 19/01/2013, 19:50
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años
Puntos: 270
Respuesta: problema con consulta a base de datos

Error: la linea 13 debe ser:
Código PHP:
Ver original
  1. $counter=count($lines)-1;
Nota: Eso supone que cada fila de la base de datos, ocupa 1 sola linea de fichero.
Ok, si tienes cualquier pregunta...
  #26 (permalink)  
Antiguo 19/01/2013, 20:01
Avatar de Most  
Fecha de Ingreso: marzo-2009
Mensajes: 642
Antigüedad: 15 años, 1 mes
Puntos: 6
Respuesta: problema con consulta a base de datos

Ok, la linea 36 : $currentFile=fopen("miFichero".($counter/10).".txt","w");


Hay que dejarla asi, en W ?


(no se si sera por que la cambie la linea 36 a "a" pero me sige escribiendo la cabecera :S)

si lo dejo en W lo que hace es modificar el archivo sustitullendo no?


Código PHP:
Ver original
  1. <html>
  2. <head>
  3. <title>Problema</title>
  4. </head>
  5. <body>
  6. <?php
  7. //Obtenemos ID
  8. $id=$_GET[id];
  9. //Seleccionamos BD
  10. require("conexion.php");
  11. $result=mysql_query("select * from navi where id_navi='$id'",$connect);
  12.  
  13.  
  14. $k=1;
  15. while(file_exists("miFichero".$k.".txt"))$k++; // Este es el bucle.
  16. // Al salir del bucle, k indica que fichero NO existe.Asi que, el ultimo que existe es k-1.
  17. $k--;
  18.  
  19. // Ahora, si k > 1 , significa que hay más de un fichero.k-1 es el numero de ficheros completos.
  20. $counter=0;
  21. $currentFile=null;
  22.  
  23. if(k>0)
  24. {
  25.      $lines=file("miFichero".$k.".txt");
  26.      $counter=count($lines)-1; // se resta la linea de la cabecera.
  27.      $currentFile=fopen("miFichero".$k.".txt","a");
  28. }
  29. if(k>1)
  30.     $counter+=40*(k-1);
  31.  
  32. $text="";
  33.  
  34.  
  35.  
  36. $cabecera="cabecera\n\n";  
  37. $pie="Este es mi pie";
  38.  
  39. // $res es el resultado de mysql_query de tu consulta.
  40. while($row=mysql_fetch_array($result))
  41. {
  42.      if($counter%10==0)
  43.      {
  44.             if($currentFile!=null)
  45.             {  
  46.                 fwrite($currentFile, $pie);            
  47.                 fclose($currentFile);
  48.              }
  49.              $currentFile=fopen("miFichero".($counter/10).".txt","a");
  50.              fwrite($currentFile, $cabecera);
  51.      }
  52.     fwrite($currentFile, "# ".$row[id_navi]."
  53. type=video
  54. name=".$row[titulo]."
  55. thumb=".$row[caratula]."
  56. URL=".$row[url]."
  57. ".$row[procesador]."\n\n");
  58.     $counter++;  
  59. }
  60. if($currentFile)
  61.      fclose($currentFile);
  62.  
  63.   ?>
  64.  
  65. </body>
  66. </html>

asi lo he dejado.

linea 49: $currentFile=fopen("miFichero".($counter/10).".txt","a");

Con a = escribe cabecera siempre, delante de cada linea

con w = reemplaza

Última edición por Most; 19/01/2013 a las 20:09
  #27 (permalink)  
Antiguo 19/01/2013, 20:33
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años
Puntos: 270
Respuesta: problema con consulta a base de datos

"w" significa "abrir para escribir a partir de la posicion 0 del fichero".
"a" significa "abrir para escribir a partir de la posicion final del fichero".

Lo que hagas en la linea 49 da lo mismo.Igual te da "w" que "a".

Porque esa línea crea un fichero nuevo.La posición 0 del fichero es la posicion final del fichero.Escribir a partir de la linea 0 y escribir a partir del final, es lo mismo.

La que sí es importante que sea "a", es la llamada de la linea 27.Porque ahí, vas a "añadir" a un fichero que ya existe, porque fue creado por una request anterior.Escribir a partir de la linea 0 , y escribir a partir del final, NO es lo mismo.
  #28 (permalink)  
Antiguo 19/01/2013, 20:41
Avatar de Most  
Fecha de Ingreso: marzo-2009
Mensajes: 642
Antigüedad: 15 años, 1 mes
Puntos: 6
Respuesta: problema con consulta a base de datos

Ok, pero si en la linea 49 escribo W, solo hace lo que tu has dicho..

"w" significa "abrir para escribir a partir de la posicion 0 del fichero".

debo de escribir A para que me escriba, pero me escribe con la cabecera tambien encima de cada linea nueva...


ejemplo visual:

[MiFichero0.txt] >>
cabecera

linea 1

cabecera

linea 2

cabecera

linea 3
  #29 (permalink)  
Antiguo 19/01/2013, 21:17
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años
Puntos: 270
Respuesta: problema con consulta a base de datos

Eso no tiene sentido.A ver, en el código que te he puesto, faltan algunos '$' delante de 'k'.
Eso está liando al algoritmo, aparte de que tienes bastantes lineas en blanco, cosa que tampoco le ayuda.
Esta función hace lo que quieres. Ejecútala tal cual.
He sustituido la llamada a la función, por un simple bucle.
Cuando la hayas probado, vuelve a meterle la query.
Código PHP:
Ver original
  1. <html>
  2. <head>
  3. <title>Problema</title>
  4. </head>
  5. <body>
  6. <?php
  7.  
  8. // Ponemos el numero de lineas por fichero , en un define, en vez de repetirla en todos lados a pelo.
  9. define("NLINES",10);
  10.  
  11.  
  12. $k=0;
  13. while(file_exists("miFichero".$k.".txt"))$k++; // Este es el bucle.
  14.  
  15.  
  16. // Al salir del bucle, k indica que fichero NO existe.Asi que, el ultimo que existe (si existe) es k-1.
  17. $k--;
  18.  
  19. // Ahora, si k > 0 , significa que hay más de un fichero.k-1 es el numero de ficheros completos.
  20. $counter=0;
  21. $currentFile=null;
  22.  
  23. // Puede ser que no exista ninguno, asi que hacemos is_file.
  24. if(is_file("./miFichero".$k.".txt"))
  25. {    
  26.      // Existe alguno, y $k es el ultimo fichero.Se abre.
  27.      $lines=file("./miFichero".$k.".txt");    
  28.      // Se cuentan las lineas que empiezan por '#'.Esas son las lineas que ya hay escritas en el fichero.
  29.      foreach($lines as $value)
  30.          $counter+=($value[0]=='#'?1:0);
  31.  
  32.      // Por ahora, pensamos que tenemos que escribir en el ultimo fichero    
  33.      $curFile=$k;
  34.  
  35.      if($counter>=NLINES) // A menos que ese fichero ya tenga NLINES.En ese caso, vamos al siguiente.
  36.          $curFile++;
  37.  
  38.      $currentFile=fopen("miFichero".$curFile.".txt","a");          
  39. }
  40.  
  41. // En counter, tenemos el numero de lineas que habia en el ultimo fichero.Le añadimos todas las que hay en los ficheros anteriores.
  42. if($k>1)
  43.     $counter+=NLINES*$k;
  44.  
  45. $text="";  
  46. $cabecera="cabecera\n\n";  
  47. $pie="Este es mi pie";
  48.  
  49. // $res es el resultado de mysql_query de tu consulta.
  50. for($k=0;$k<29;$k++)
  51. {
  52.      if($counter%NLINES==0)
  53.      {
  54.             if($currentFile!=null)
  55.             {  
  56.                 fwrite($currentFile, $pie);            
  57.                 fclose($currentFile);
  58.              }
  59.              $currentFile=fopen("miFichero".($counter/NLINES).".txt","w");
  60.              fwrite($currentFile, $cabecera);
  61.      }
  62.     fwrite($currentFile, "# ".$k." -- ".$counter."\n\n");
  63.     $counter++;  
  64. }
  65. if($currentFile)
  66.      fclose($currentFile);
  67.  
  68.   ?>
  69.  
  70. </body>
  71. </html>

Última edición por dashtrash; 19/01/2013 a las 21:29
  #30 (permalink)  
Antiguo 19/01/2013, 21:43
Avatar de Most  
Fecha de Ingreso: marzo-2009
Mensajes: 642
Antigüedad: 15 años, 1 mes
Puntos: 6
Respuesta: problema con consulta a base de datos

Ok, si lo pongo tal cual como tu has dicho me lo crea los archivos asi:

Cita:
cabecera

# 0 -- 0

# 1 -- 1

# 2 -- 2

# 3 -- 3

# 4 -- 4

# 5 -- 5

# 6 -- 6

# 7 -- 7

# 8 -- 8

# 9 -- 9

Este es mi pie
asi si funciona bien


pero en cuanto lo pongo asi, nada, se pone a hacer la funcion de w, osea, reemplazarme los datos.

Código PHP:
<?php
//Obtenemos ID
$id=$_GET[id];
//Seleccionamos BD
require("conexion.php");
$result=mysql_query("select * from navi where id_navi='$id'",$connect);

define("NLINES",10);
 
 
$k=0;
while(
file_exists("miFichero".$k.".txt"))$k++; // Este es el bucle.
 
 
// Al salir del bucle, k indica que fichero NO existe.Asi que, el ultimo que existe es k-1.
$k--;
 
// Ahora, si k > 1 , significa que hay más de un fichero.k-1 es el numero de ficheros completos.
$counter=0
$currentFile=null
 
 
if(
$k>0)
{     
     
$lines=file("./miFichero".$k.".txt");     
     foreach(
$lines as $value)
         
$counter+=($value[0]=='#'?1:0);
     
     
$curFile=$k;
     if(
$counter>=NLINES)
         
$curFile++;
     
$currentFile=fopen("miFichero".$curFile.".txt","a");          
}
 
if(
$k>1)
    
$counter+=NLINES*$k;
 
$text="";   
$cabecera="cabecera\n\n";  
$pie="Este es mi pie"
  
// $res es el resultado de mysql_query de tu consulta. 
while($row=mysql_fetch_array($result))

     if(
$counter%NLINES==0
     { 
            if(
$currentFile!=null
            {  
                
fwrite($currentFile$pie);            
                
fclose($currentFile); 
             } 
             
$currentFile=fopen("miFichero".($counter/NLINES).".txt","w"); 
             
fwrite($currentFile$cabecera); 
     } 
        
fwrite($currentFile"# ".$row[id_navi].
type=video 
name="
.$row[titulo].
thumb="
.$row[caratula].
URL="
.$row[url].
"
.$row[procesador]."\n\n"); 
    
$counter++;    

if(
$currentFile
     
fclose($currentFile);
 
  
?>

Etiquetas: html, mysql, select, sql
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:25.