Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Problema con POST...Movido desde CGI

Estas en el tema de Problema con POST...Movido desde CGI en el foro de C/C++ en Foros del Web. Saludos Cómo capturo los valroes de un formulario, si no se como se llaman los campos?? Es decir, ese formulario carga campos dinamicamente, y los ...
  #1 (permalink)  
Antiguo 07/06/2006, 08:25
Avatar de José Molina  
Fecha de Ingreso: enero-2002
Ubicación: USA
Mensajes: 768
Antigüedad: 23 años
Puntos: 1
Capturar Valores POST

Saludos

Cómo capturo los valroes de un formulario, si no se como se llaman los campos??

Es decir, ese formulario carga campos dinamicamente, y los que hoy peuden ser 2 mañana pueden ser 20 y todos tienen nonmbres distintos.

Lo que quiero es capturar todo lo que venga por POST.

Cómo hago eso ??

Gracias
__________________
José Molina
La marginalidad no esta en la incapacidad de calmar el hambre de un estómago sino en la incapacidad de calmar el hambre de la mente.
  #2 (permalink)  
Antiguo 07/06/2006, 09:47
Colaborador
 
Fecha de Ingreso: mayo-2006
Ubicación: Valladolid
Mensajes: 525
Antigüedad: 18 años, 8 meses
Puntos: 11
El módulo CGI te puede dar un listado de todos los parámetros pasados por el cliente.
Código:
#!/usr/bin/perl
use CGI qw/:standard/;

print header,
      start_html('Volcado de parámetros'),
      h1('Lista de los parámetros pasados'),
      hr;

# Aquí sacamos la lista de los parámetros
my @parametros = param();

# Les sacamos por la página, como párrafos
foreach my $par ( @parametros ) {
    print p, $par;
    print blockquote(param( $par ));
}

print end_html;
Hay otras funciones que también pueden servir, como Vars, por ejemplo.
  #3 (permalink)  
Antiguo 07/06/2006, 10:14
Avatar de José Molina  
Fecha de Ingreso: enero-2002
Ubicación: USA
Mensajes: 768
Antigüedad: 23 años
Puntos: 1
Caramba, creanme que no quiero pasar por molesto, pero creo que se presenta aqui el mimo inconveniente que con un post anterior mio.

No creo quee stemos hablando del mismo lenguaje.

En los 39 cgi que tiene este site, ninguno tiene en su código un "@" o un "$"

Según entiendo, despues que buscar por internet, yo estoy trabajando con C++ dentro de los CGI que corren en Linux.

Por favor, disculpen mi ignorancia, pero estoy tratando de entender lo que hago ....
__________________
José Molina
La marginalidad no esta en la incapacidad de calmar el hambre de un estómago sino en la incapacidad de calmar el hambre de la mente.
  #4 (permalink)  
Antiguo 07/06/2006, 10:17
 
Fecha de Ingreso: mayo-2003
Mensajes: 328
Antigüedad: 21 años, 8 meses
Puntos: 0
Hola:

Me parece que tus post deben de ir en el foro de C++, por lo menos ahí tendrás más suerte con programadores de ese lenguaje:
http://www.forosdelweb.com/f96/


Saludos
__________________
Uriel Lizama, Perl Developer

Aprende Perl en Perl en Español.
  #5 (permalink)  
Antiguo 07/06/2006, 13:32
Avatar de José Molina  
Fecha de Ingreso: enero-2002
Ubicación: USA
Mensajes: 768
Antigüedad: 23 años
Puntos: 1
Algun moderador que mueva los post por favor...
__________________
José Molina
La marginalidad no esta en la incapacidad de calmar el hambre de un estómago sino en la incapacidad de calmar el hambre de la mente.
  #6 (permalink)  
Antiguo 07/06/2006, 14:00
Avatar de monoswim
$moderador{'Esteban'}
 
Fecha de Ingreso: febrero-2002
Ubicación: Buenos Aires - Argentina
Mensajes: 8.762
Antigüedad: 22 años, 11 meses
Puntos: 90
Trasladado desde CGI a c++

Saludos
__________________
Esteban Quintana
  #7 (permalink)  
Antiguo 07/06/2006, 14:07
Avatar de José Molina  
Fecha de Ingreso: enero-2002
Ubicación: USA
Mensajes: 768
Antigüedad: 23 años
Puntos: 1
Bueno ahora como que si esta el post donde debe ser.

A ver, consgui lo siguiente:

scanf ("%s", argin);
strtok (argin, "=&");
var1 = strtok (NULL, "=&");
strtok (NULL, "=&");
var2 = strtok (NULL, "=&");
strtok (NULL, "=&");
var3 = strtok (NULL, "=&");
strtok (NULL, "=&");

Según entiendo, me va colocando los valores del par "nombre_Campo/Valor" en las varn que voy asignando con el strtok. Y esto depende de la posición en que vienen las variables POST, ya que el scanf me va asignando a %s uno por uno el par de variables POST

Eso perfecto, pero resulta que no se en que posición vienen las variables POST, ya que el formulario puede tener 3 o 45 campos, depende de la consulta que esten realizando.

Ya se como se llaman los campos que vienen, pero no puedo saber en que posición vienen.

En fin, replanteando el asunto seria: Cómo pregunto directamente por el valor de una variavle POST por su nombre ??

Algo como:

$var1 = $_POST["variable_post_1"] (Como lo haria en PHP)

Es posible preguntar directamente asi en c++ ??

Gracias
__________________
José Molina
La marginalidad no esta en la incapacidad de calmar el hambre de un estómago sino en la incapacidad de calmar el hambre de la mente.
  #8 (permalink)  
Antiguo 07/06/2006, 17:34
 
Fecha de Ingreso: mayo-2006
Mensajes: 40
Antigüedad: 18 años, 7 meses
Puntos: 0
No conozco el CGI pero buscando cual es el formato del POST ese que mencionas me tope con una pagina personal de Marcelo Maraboli en donde pone un ejemplo en lenguaje C que procesa un formulario hecho en CGI. No probe el programa y solo lo vi por encima pero al parecer es algo cercano a lo que quieres hacer. Te pondria el enlace pero como solo puedo poner ligas hasta haber puesto un minimo de 15 mensajes en este foro entonces solo te puse el nombre para que lo busques con el google y te salga el enlace a dicha pagina. Cuando entres a su pagina busca en la columna de la izquierda el enlace titulado "CGI y FORM".

Eso que quieres hacer no es muy complicado, si no te ayuda el el programa de arriba pon un ejemplo de la o las cadenas que quieres procesar para tratar de ayudarte.
  #9 (permalink)  
Antiguo 07/06/2006, 19:27
Avatar de José Molina  
Fecha de Ingreso: enero-2002
Ubicación: USA
Mensajes: 768
Antigüedad: 23 años
Puntos: 1
Si el ejemplo ya lo habia visto, pero lo que hacen alli es recorrer todo el arreglo de las variables POST.

Yo lo que quiero es preguntar por una en especifico.

Pero bueno, gracias por la idea.
__________________
José Molina
La marginalidad no esta en la incapacidad de calmar el hambre de un estómago sino en la incapacidad de calmar el hambre de la mente.
  #10 (permalink)  
Antiguo 08/06/2006, 09:30
Avatar de José Molina  
Fecha de Ingreso: enero-2002
Ubicación: USA
Mensajes: 768
Antigüedad: 23 años
Puntos: 1
He tratado de implementar ese ejemplo:

#include <stdio.h>
#ifndef NO_STDLIB_H
#include <stdlib.h>
#else
char *getenv();
#endif
#include <string.h>

#define MAX_ENTRIES 10000

typedef struct {
char *name;
char *val;
} entry;

char *makeword(char *line, char stop);
char *fmakeword(FILE *f, char stop, int *len);
char x2c(char *what);
void unescape_url(char *url);
void plustospace(char *str);


main(int argc, char *argv[]) {
entry entries[MAX_ENTRIES];
register int x,m=0;
int cl;

printf("Content-type: text/html%c%c",10,10);

if(strcmp(getenv("REQUEST_METHOD"),"POST")) {
printf("This script should be referenced with a METHOD of POST.\n");
printf("If you don't understand this, see this ");
printf("<A HREF=\"http://www.ncsa.uiuc.edu/SDG/Software/Mosaic/Docs/fill-out-forms/overview.html\">forms overview</A>.%c",10);
exit(1);
}
if(strcmp(getenv("CONTENT_TYPE"),"application/x-www-form-urlencoded")) {
printf("This script can only be used to decode form results. \n");
exit(1);
}
cl = atoi(getenv("CONTENT_LENGTH"));

for(x=0;cl && (!feof(stdin));x++) {
m=x;
entries[x].val = fmakeword(stdin,'&',&cl);
plustospace(entries[x].val);
unescape_url(entries[x].val);
entries[x].name = makeword(entries[x].val,'=');
}

printf("<H1>Query Results</H1>");
printf("You submitted the following name/value pairs:<p>%c",10);
printf("<ul>%c",10);

for(x=0; x <= m; x++)
printf("<li> <code>%s = %s</code>%c",entries[x].name,
entries[x].val,10);
printf("</ul>%c",10);

/* de aqui en adelante colocar el codigo nuevo */

Pero nunca entra en el for (x=0;cl && (!feof(stdin));x++) ya que no se cumple el
!feof(stdin)

Alguna idea??

Gracias
__________________
José Molina
La marginalidad no esta en la incapacidad de calmar el hambre de un estómago sino en la incapacidad de calmar el hambre de la mente.
  #11 (permalink)  
Antiguo 09/06/2006, 10:27
 
Fecha de Ingreso: mayo-2006
Mensajes: 40
Antigüedad: 18 años, 7 meses
Puntos: 0
Como te decia anteriormente no conozco lo del CGI, es por eso que te hago esta pregunta. En el ejemplo viene un archivo .HTML el cual al verlo con el browser despliega un formulario. Si llenas el formulario ¿donde se supone que se guardan estos cuando presionas el boton "Submit Form"? Lo que supongo es que se guardan en un archivo en el servidor web y ahi es donde tienes que correr el programa de ejemplo desviando la entrada estandar hacia este archivo en la linea de comandos, por ejemplo programa<nom_arch_cgi, ya que si corres este programa sin desviar la entrada estandar entonces va a estar esperando toda la entrada desde el teclado hasta que le des un caracter que represente el fin de archivo (comunmente es ^Z).

Si es correcto eso de que en un archivo estan los valores del formulario entonces seria bueno que pusieras un ejemplo de uno de ellos para analizar como extraer estos valores, a menos que con el mencionado ejemplo resuelvas el problema.
  #12 (permalink)  
Antiguo 11/06/2006, 17:23
Avatar de José Molina  
Fecha de Ingreso: enero-2002
Ubicación: USA
Mensajes: 768
Antigüedad: 23 años
Puntos: 1
Bueno, resulta lo siguiente.

No tiene un buene fecto mandar a guardar en un archivo de texto lo que te envian en un formulario, porque si ese formulario lo estan llenadno 51 personas el mismo tiempo, como vas a saber que buscar en ese archivo de texto donde lo mandas a guardar??

En fin, resulta ser que el ejemplo funciona perfectamente, el asunto estaba en que en el cgi se corria antes una funcion que capturaba las variables del post, el famoso:

scanf ("%s", argin);
strtok (argin, "=&");
var1 = strtok (NULL, "=&");
strtok (NULL, "=&");
var2 = strtok (NULL, "=&");
strtok (NULL, "=&");
var3 = strtok (NULL, "=&");
strtok (NULL, "=&");

Esto ocasianaba que dichos valores de post quedaran vacios, porque la ya el scanf lo habia asignado.
__________________
José Molina
La marginalidad no esta en la incapacidad de calmar el hambre de un estómago sino en la incapacidad de calmar el hambre de la mente.
  #13 (permalink)  
Antiguo 12/06/2006, 08:43
Avatar de José Molina  
Fecha de Ingreso: enero-2002
Ubicación: USA
Mensajes: 768
Antigüedad: 23 años
Puntos: 1
Saludos

Sigo con el tema.

Tengo en el CGI lo siguiente:

void imprimeVariable( char *lpzNombre );

int main(void) {

imprimeVariable( "campo_form" );

}

void imprimeVariable( char *lpzNombre ){

char lpzResultado[LARGO_MAXIMO];

printf("<tr>\n");
printf("<td bgcolor=\"#9999FF\" valign=top>%s</td>\n",lpzNombre);
printf("<td bgcolor=\"#DDDDFF\" valign=top><font color=#000000>");

formPideVariable( lpzNombre,lpzResultado,LARGO_MAXIMO);
printf("[%s]",lpzResultado);

printf("</td>\n");
printf("</tr>\n");

}

Esto funciona perfecto, me busca el valor del "campo" y lo imprime por pantalla. Perfecto, pero ...

Resulta que yo no quiero que me lo imprima por pantalla, quiero que me lo almacene en una variable, para poder hacer cosas con los valores.

Intente colocar dentro de
void imprimeVariable( char *lpzNombre ) simplemente esto:

sprintf(valor,"%s",IpzNombre);

Dejando todo dentro de la variable valor, pero me da al compliar:

invalid use of void expression

Cómo debería hacer para que void imprimeVariable( char *lpzNombre ) en vez de mandarme a pintar el valor del campo me lo guarde en una variable y que esa variable me la retorne al main para poder hacer cosas con ella.??
__________________
José Molina
La marginalidad no esta en la incapacidad de calmar el hambre de un estómago sino en la incapacidad de calmar el hambre de la mente.
  #14 (permalink)  
Antiguo 12/06/2006, 16:06
 
Fecha de Ingreso: abril-2006
Ubicación: Acapulco Gro. México
Mensajes: 483
Antigüedad: 18 años, 8 meses
Puntos: 2
la funcion sprintf es muy similar a printf.

solo que en lugar de enviar la cadena a la salida estandar la manda a un array el cual se manda como primer parametro.


char cadenafinal[40];
char cadena[30] = "EL valor de la variable entera es: ";
int var = 20;

sprintf(cadenafinal, "%s%d", cadena, var);

despues de esto cadenafinal es : "EL valor de la variable entera es: 20".

pero esta funion se usa generalmente para la convericon de datos de tipos diferentes a un acdena.

si quieres copiar una cadena en otra solo tienes que usar strcpy(destino, origen);


Saludos.
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 18:06.