Foros del Web » Programando para Internet » PHP »

Paso de Arrays con GET

Estas en el tema de Paso de Arrays con GET en el foro de PHP en Foros del Web. Hola a todos. Estoy haciendo como proyecto fin de carrera un buscador web. Como en google (pero mucho mas cutre). El caso es que en ...
  #1 (permalink)  
Antiguo 17/03/2003, 06:21
 
Fecha de Ingreso: febrero-2002
Ubicación: Guadalajara
Mensajes: 103
Antigüedad: 15 años, 10 meses
Puntos: 0
Paso de Arrays con GET

Hola a todos.
Estoy haciendo como proyecto fin de carrera un buscador web. Como en google (pero mucho mas cutre). El caso es que en hacer la búsqueda tarda bastante (aún queda un poco de optimización de base de datos). Pero he pensado que iría más rápido si tan sólo se hace una búsqueda y se pasa el resultado con get (de momento, cuando funcione lo haré con post).

El caso es que cuando se da al enlace de siguiente página (de momento pagina bien). le paso:
http://buskdor.php?pagina=2&texto=texto_a_buscar&datos=Ar rayDeDatos

¿cómo he de pasar ese array para que luego pueda recogerlo con el $_GET?. El ArrayDeDatos, me lo devuelve una lectura de base de datos.
Ya para completar, si me dijeran como recoger el array con el get, estaría muy agradecida.

Perdón, si no me he explicado bien. Si es así, intentaré ser más clara.

Gracias
  #2 (permalink)  
Antiguo 17/03/2003, 08:23
 
Fecha de Ingreso: agosto-2002
Ubicación: Colón - Entre Rios - Argentina
Mensajes: 647
Antigüedad: 15 años, 4 meses
Puntos: 8
En las FAQ Cluster publico la solucion...

http://www.forosdelweb.com/showthrea...072#post262072

Saludos.
  #3 (permalink)  
Antiguo 17/03/2003, 08:24
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Tienes que serializar el array para pasar un array por GET/POST .. a su vez donde la recibas (el array) tienes q des-serializarla .. Ademas es bueno que codifiques el URL para no tener problemas con ' " y algunos caracteres mas ..

En las FAQ's de PHP de este foro tienes la solución:
http://www.forosdelweb.com/showthrea...072#post262072

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #4 (permalink)  
Antiguo 17/03/2003, 08:35
 
Fecha de Ingreso: febrero-2002
Ubicación: Guadalajara
Mensajes: 103
Antigüedad: 15 años, 10 meses
Puntos: 0
Gracias a ambos.
La verdad es que no conocía la función serialize, probablemente por que no serializaba la variable no me llegaba nada. Lo probaré esta tarde.
Gracias de nuevo
  #5 (permalink)  
Antiguo 17/03/2003, 13:54
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 15 años, 6 meses
Puntos: 16
Hola,

Crispp, yo me replantearia lo que quieres hacer. El tamaño total de los datos que pasas por URL (GET) esta limitado. Ahora mismo no se a cuanto, pero tu comentas de pasar el resultado de una busqueda. Eso para mi supone bastantes datos, que puede que no entren en la URL. Ademas, al serializar aumenta el tamaño.

Quizas te seria mas sencillo almacenar el array en una sesion. Tampoco es la solucion optima, pero se va acercando.

Suerte.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #6 (permalink)  
Antiguo 18/03/2003, 00:28
 
Fecha de Ingreso: febrero-2002
Ubicación: Guadalajara
Mensajes: 103
Antigüedad: 15 años, 10 meses
Puntos: 0
Gracias Josemi.
En principio no iba a pasar el array, pero resulta que ha de realizar la búsqueda en una tabla con 121000 registros. Y es muy lento, y esa búsqueda me da como resultado un montón de números de páginas con lo que he de buscar de nuevo, los datos de esas páginas (en base de datos). Tarda una media de 45 segundos y eso es mucho tiempo. Así que pensé que la búsqueda la hiciera unicamente la primera vez y pasar los resultados de una página a otra, bien con GET, bien con POST. El problema del post, es que al hacer un document.forms[0].submit(), me dice que no admite la propiedad, así que opté por hacerlo con el get.

Intentaré ver si lo almaceno en una sesión, a ver que tal va.

Gracias

Cristina
  #7 (permalink)  
Antiguo 18/03/2003, 01:30
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Las sesiones tienen tambien su limite .. y me parece que es menor que el GET ..

Lo que "mas dá" es POST (se habla en Megabytes de datos y lo puedes controlar desde el php.ini .. suele ser 8M por defecto.)

Otro detalle .. esos 121000 registros de tu consulta .. Los paginas de alguna forma .. o muestras todos de un viaje?. Supongo que conoceras (si usas Msyql) la sentencia SQL: LIMIT par mostrar solo X grupo de registros que te arroje una consulta ..

Y si paginas .. para obtener el total de registros de la consulta (para usarlo en los cálculos de las páginas resultantes en funcion de los registros que muestres por página) .. ese dato solo (ese numero total de registros) te lo puedes guardar en una sesion y usalo donde lo requieras ... Pero lo principal es que segun el "usuario" quiera ver mas resultados de su busqueda tu hagas una consulta usando "LIMIT" para mostrarle esos registros de esa pagina solo.

Ademas .. por ejemplo puedes optimizar en caso de que "pagines" tus consultas .. por ejemplo:

En lugar de usar para calcular el total de registros de tu consulta realizada -.... msyql_num_rows() .. usar la sentencia SQL: COUNT(*) .. En fin, que habría que ver el código q usas es probable que se pueda optimizar. Bien con esos detallitos o replanteando denuevo el algoritmo q usas ..

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.

Última edición por Cluster; 18/03/2003 a las 01:34
  #8 (permalink)  
Antiguo 18/03/2003, 02:07
 
Fecha de Ingreso: febrero-2002
Ubicación: Guadalajara
Mensajes: 103
Antigüedad: 15 años, 10 meses
Puntos: 0
Gracias Cluster.

Utilizo oracle, pq para rellenar las tablas utilizo java.
En resumen, mi buscador hace lo siguiente:
- Lee lo que se ha de buscar de un cuadro de texto, (por defecto es OR, admite + para los AND, - para los AND NOT).
- Mete cada lista de palabras (genera 3 listas, la de oes, yes y noes) en un array.
- Busca las páginas (nºs) donde se encuentra esa palabra, (aqui tarda bastante, pq para sacar las páginas, tiene que "desmontar" un CLOB).
- crea la sentencia SQL con los datos obtenidos:
para el and not ->
$condicionFinal="id_pagina not in ( $cNo)"; (donde $cNo es una cadena formada por los identificadores de pagina separados por comas)
para el AND
$condicionFinal =$condicionFinal ."AND id_pagina=$MatrizT[$i]", para cada y
y para los OR
$condicionFinal=$condicionFinal ."OR id_pagina=" para cada o.

El caso es que los busca todos, aunque luego solo muestre los 10 primeros o del 81 al 90. Probé con el rownum pero eso solo me vale para los primeros o los últimos, no para los demás.

Supongo que es fácil de mejorar, acepto cualquier sugerencia

Cristina


select url from paginas where id_pagina in (todos las paginas obtenidas de la matriz de la o) and id_pagina= .. and id_pagina=...

Última edición por Crispp; 18/03/2003 a las 03:06
  #9 (permalink)  
Antiguo 18/03/2003, 03:52
 
Fecha de Ingreso: febrero-2002
Ubicación: ¿donde vivo? pues en mi casa, ¿donde voy a vivir?...
Mensajes: 214
Antigüedad: 15 años, 9 meses
Puntos: 0
si en buscar entre 150.000 o 200.000 registros, tarda 45 segundos, yo me planteaba 2 cosas:
1, cambiar ese 8086 por algo mas rapido.
2, revisar el diseño de la db, y/o del motor de buskeda, pq vamos.... xD
__________________
Linux, es para los que odian Microsoft/Windows, BSD, es para los que amamos *IX.
  #10 (permalink)  
Antiguo 18/03/2003, 09:14
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
En Oracle me pierdo .. pero seguro que se puede optimizar mejor el algoritmo que usas o replantearlo.

Si quieres .. te invito al foro "Ingenería del software y gestión de Proyectos" para que comentes mas a fondo el algoritmo de busqueda que has implementado para ver alguna alternativa tal vez mejor y mas óptima.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #11 (permalink)  
Antiguo 18/03/2003, 16:13
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 15 años, 6 meses
Puntos: 16
Hola,

Cluster, no tenia ni idea de que las sesiones tuvieran un limite. Aun asi, mi intencion era que se olvidara de propagar los datos por GET o por POST o por COOKIES. ¿Por que? Porque en cualquiera de los tres metodos hay que enviar al cliente la pagina de resultados CON LA LISTA COMPLETA DE RESULTADOS QUE QUIERES PASAR EN EL ARRAY. Y despues tienes que volver a enviar OTRA VEZ todo el array al servidor. Pongamos un ejemplo numerico: supongamos que el HTML generado que muestra el resultado pesa 30kb SIN CONTAR el array que quieres pasar; supongamos que el array pesa 100kb; esto supone (sin imagenes ni .js ni .css ni otras gaitas) que cuando quiere ver una pagina tiene que bajarse 130kb. Menudo incremento de tamaño. Y eso no es todo. Cuando de al link para la siguiente pagina pasandole el array (por cualquiera de los 3 metodos) sera lo mismo que cuando haces un upload de un fichero de 100kb. Todavia mas lento. Asi, si quieres ver 2 paginas de resultados, el total de bytes transferidos (subidos y bajados) es de 360kb (bajar 130kb + subir 100kb + bajar 130kb). No se cuanto tiempo supone eso en ADSL, pero con un pobre modem de 56kbps ...

Por eso cuando me referia a almacenarlo en la sesion, me estaba refiriendo mas bien a almacenarlo en el servidor. Ya sea creando un fichero, una tabla temporal en la BD, o de cualquier otra forma posible. La cuestion es cachear el resultado en el servidor. Hay los tiempos de acceso y lectura son muchisimo mas bajos.

Por supuesto, revisa tu algoritmo de busqueda. ¿No tiene Oracle ninguna herramienta para analizar las consultas? Asi quizas encuentras cual es tu cuello de botella. Pregunta a algun experto en Oracle. No entiendo "desmontar un CLOB", pero si es una tarea pesada que debes hacer para busqueda, quizas es que tienes que cambiar la forma de almacenar los datos o realizar esa operancion una vez al dia (o cuando actualizes la BD). Ademas, revisa tu condicion. Me parece que te faltan () para agrupar las condiciones. Y posiblemente puedas reducir la condicion (puede que agrupando los numeros de pagina). Es dificil optimizar sin saber el codigo entero y sin datos de donde esta el cuello de botella.

Recuerda, nada de mandar los datos al cliente y luego de vuelta al servidor. Almacenalos en el servidor.

Suerte.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #12 (permalink)  
Antiguo 18/03/2003, 16:49
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Lo del tamaño de las sessiones .. por lo menos el tipo por defecto y el que se suele usar de handler "file" se podría gestionar "manualmente" usando:

session_set_save_handler()

Y creando tu propio sistema de formato de datos en la sesion y donde lo guardes ... Con eso no creo q hubiera limitaciones de espacio salvo las propias fisicas del medio de almacenamiento que uses ..

Un ejemplo:
http://www.keasyphp.org/php/Sessions...sions.inc.phps

guardan las variables de session en una BD Msyql en lugar del tipico "file" en el sistema de archivos ..

Un saludo,

pd: lo del tamaño de la session .. no sé donde lo leí .. si lo encuentro lo pongo por aquí ...
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #13 (permalink)  
Antiguo 20/03/2003, 01:15
 
Fecha de Ingreso: febrero-2002
Ubicación: Guadalajara
Mensajes: 103
Antigüedad: 15 años, 10 meses
Puntos: 0
Gracias a ambos de nuevo.
Os voy a contar como funciona mi buscador.
Consta de dos partes, la primera de ellas recoge los términos, y la segunda muestra los resultados.
Primera Parte: Está implementada en java, y con una base de datos Oracle 8.0.5
Araña -> La primera vez se parte de una serie de servidores de la universidad. La "araña" recoge todos los términos que no son "palabras vacías" (como de, la, los, etc) y lo introduce en una base de datos. Como hay que relacionar cada palabra con la página a la que pertenece, su párrafo y su posición dentro de él. Se mira si ya existe la palabra, si no existe se hace una inserción en BD, idTermino, termino, localización (donde estará recogido el idPagina:numParrafo;PosParrafo, es un CLOB). Recorre esta tabla hasta que todas las páginas se han visitado y extraido sus términos.
En sucesivas veces, se comprueba si ha habido cambios en alguna página (si la fecha es más reciente que la que había en base de datos) y se borran todos las entradas de la tabla términos que había de esa página.

2ª parte -> página PHP. (aqui está el lío)
Hay un cuadro de texto donde el usuario introduce lo que quiere buscar. Se admite el símbolo + para el AND, y el - para el AND NOT. Si no se pone nada se presupone un OR.

Se separan las palabras a buscar en 4 arrays (array para las OR, array para las AND, array para los AND NOT y otro array para las palabras vacías).
Una vez que se tienen los 4 arrays se crean las lecturas a base de datos.
Se hace una lectura por array (bueno, del de las palabras vacías no).
Se crea cada sentencia leyendo de la tabla terminos el campo localización (que recuerdo es un CLOB). Pero como todos los datos de ese campo no me interesan, de momento solo quiero saber el número de página, ejecuto un procedimiento de oracle que me devuelve en una cadena separada por espacios los números de página .

Para construir la cadena de los OR por ejemplo:
$condicionO = "lower(termino)='$MaO[0]'";
$ctosO=tamanioMatriz($MaO);
if ($ctosO>1) {
for ($o=1;$o<$ctosO;$o++){

$condicionO=$condicionO." or Lower(termino)='$MaO[$o]'";
} /* for o*/
} /* if ctosO */

y realiza la lectura de base de datos.
Para construir la cadena de los AND:
se repite tantas veces como palabras haya la lectura y se va haciendo la y entre las dos matrices que van resultando. (Quizá aqui esté el cuello de botella).

Para la cadena de los AND NOT:
También se hace una lectura por cada palabra para luego ir concatenando los resultados, con una coma y luego hacer un AND NOT IN(....).

Con estas tres matrices, hacemos las operaciones de "y", "no" y "or". Y obtenemos en una nueva matriz las páginas de las que realmente queremos saber sus datos para crear los enlaces.

No se si os habrá aclarado algo, si ves interesante pasarlo a otro foro, acepto encantada. Con esto me he dado cuenta que quizá hago demasiadas lecturas de unos campos demasiado grandes y eso penalice las búsquedas. Si teneis alguna sugerencia o bien, alguna duda, ya sabeis.

Cristina
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 17:25.