Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   PHP (https://www.clubdelphi.com/foros/forumdisplay.php?f=15)
-   -   SESIONES, VARIABLES y otras yerbas (https://www.clubdelphi.com/foros/showthread.php?t=40958)

juanperez 03-03-2007 01:57:51

SESIONES, VARIABLES y otras yerbas
 
Lo de siempre: nuevo en PHP (15 días)
Estoy haciendo un sitio donde el cliente marca productos en varias paginas y al final aparece una con la lista de pedidos para ser enviada por mail.

Estoy trabajando con sesiones, y subo la información con POST.

codigo:

Código PHP:

<?php 
session_start
(); 
session_register('carrinho'); 
$item=$_POST['item']; 
$name=$_POST['name']; 
$cantidad=$_POST['cantidad']; 
$carrinho=$_SESSION['carrinho']; 

if (
$item){ 
   if (!isset(
$carrinho)){ 
      
$carrinho[$item]=$cantidad
   }else{ 
      foreach(
$carrinho as $k => $v){ 
         if (
$item==$k){ 
         
$carrinho[$k]+=$cantidad
         
$encontrado=1
         } 
      } 
      if (!
$encontrado$carrinho[$item]=$cantidad
   } 

$_SESSION['carrinho']=$carrinho
?>

Pero....

al llegar a la pagina final como hago para que me imprima la lista?

He probado con

Código PHP:

     if (isset($carrinho)){ 
      foreach(
$carrinho as $k => $v){ 
         echo 
"#  $k Prod.:  Quant.: $v n"
      } 
   } 

pero solo logro que aparezcan dos valores, el codigo del producto y la cantidad elegida, pero no el nombre.

Agradesco me expliquen, aunque supongo sea algo sencillo, lo ignoro y ya estoy cansado de 'probar' sin resultados.
Gracias

roman 03-03-2007 05:15:45

Hola, y bienvenido a los foros.

Me parece que no tienes claro cuál es la estructura de tu arreglo. Cuando llenas el carro haces algo como:

Código PHP:

$carrinho[$k] += $cantidad

Entonces no estás dando cabida al nombre del producto, sólo estás manejando una asociación

código => cantidad

Si quieres indizar el carrito con el código del producto, entonces cada elemento del arreglo debe ser a su vez un arreglo, por ejemplo:

Código PHP:

$carrito[84] = array('pera'5); 

Así, el carrito tendría (estamos ejemplificando) un elemento correspondiente al producto de código 84 que corresponde a una pera y te están pidiendo 5.

Puedes acceder a los elementos del carrito así:

Código PHP:

<?
foreach ($carrito as $codigo => $item)
{
  
/*
    $codigo es código del producto
    $item[0] es el nombre del producto 
    $item[1] es la cantidad
  */
}
?>

O bien puedes usar índices más significativos:

Código PHP:

$carrito[84] = array('nombre' => 'pera''cantidad' => 5); 

y en el ciclo usarías $item['nombre'] e $item['cantidad'] en lugar de $item[0] e $item[1].

Otra cosa: olvídate de session_register, éso ya está en desuso. Simplemente usa session_start para iniciar la sesión y $_SESSION para leer y escribir tus variables de sesión.

// Saludos

juanperez 04-03-2007 02:23:50

Gracias Roman por contestar
 
Pero sigo sin lograrlo.

Quite el codigo


if ($item){
if (!isset($carrinho)){
$carrinho[$item]=$cantidad;
}else{
foreach($carrinho as $k => $v){
if ($item==$k){
$carrinho[$k]+=$cantidad;
$encontrado=1;
}
}
if (!$encontrado) $carrinho[$item]=$cantidad;
}
}

que segun entiendo es el que suma más del mismo producto (por si agregan del mismo 2 o mas veces)

así que la paginas de productos (productos que se cargan de uina tabla en la bd según seleccione por rubro o por un buscador de palabras) tiene un include a este codigo

<?php
session_start();
$item=$_POST['item'];
$name=$_POST['name'];
$cantidad=$_POST['cantidad'];
$carrinho=$_SESSION['carrinho'];

$_SESSION['carrinho']=$carrinho;
?>

Alli suben por post el item (codigo), name y la cantidad que especifique la persona en el cuadro de texto

Luego la persona va a la pagina final donde se impreme todo lo que eligió.
Allí puse:

<?php
session_start();
$carrinho = $_SESSION['carrinho'];
?>

al comienzo, y donde debe aparecer el texto

<?php
if (isset($carrinho)){
foreach($carrinho as $codigo => $item){
echo "# $codigo Prod.: $item[0] Quant.: $item[1] \n";
}
}
?>


Pero al probarla, despues de elegir algunos productos aparece:

# 7730177002400 Prod.: 5 Quant.:
# 7730177002417 Prod.: Quant.:
# 7730177002424 Prod.: 1 Quant.: 0


¿Que estoy haciendo mal?

kayetano 05-03-2007 14:12:36

Hola juanperez

copio y pego del correo que te he mandado hace un rato

Cita:

Empezado por juanperez
Lo de siempre: nuevo en PHP (15 días)
Estoy haciendo un sitio donde el cliente marca productos en varias paginas y al final aparece una con la lista de pedidos para ser enviada por mail.

Estoy trabajando con sesiones, y subo la información con POST.

Lo normal para un carrito de tienda on-line.

Cita:

Empezado por juanperez
codigo:

<?php
session_start();
session_register('carrinho');
$item=$_POST['item'];
$name=$_POST['name'];
$cantidad=$_POST['cantidad'];
$carrinho=$_SESSION['carrinho'];

if ($item){
if (!isset($carrinho)){
$carrinho[$item]=$cantidad;
}else{
foreach($carrinho as $k => $v){
if ($item==$k){
$carrinho[$k]+=$cantidad;
$encontrado=1;
}
}
if (!$encontrado) $carrinho[$item]=$cantidad;
}
}
$_SESSION['carrinho']=$carrinho;
?>

Algunos consejos:
- No es necesario que utilices "session_register" cuando utilizas el array $_SESSION
- Puedes trabajar directamente con el array $_SESSION no es necesario que utilices una variable secundaria.
- Deberías filtrar todas los valores de los formularios para evitar inyección de código malicioso.
- Todo el código que has puesto se puede reducir a unas poca lineas (claro está si no haces nada más por medio)
Código PHP:

<?php
session_start
();
$item=$_POST['item'];
if( !isset(
$_SESSION['carrinho']) )
    
$_SESSION['carrinho'] = array();

if ( isset( 
$_POST['item'] ) && $item ){
    
$_SESSION['carrinho'][$item]['cantidad'] += $_POST['cantidad'];
    
$_SESSION['carrinho'][$item]['nombre'] += $_POST['name'];

}
?>


Cita:

Empezado por juanperez
Pero....

al llegar a la pagina final como hago para que me imprima la lista?

He probado con

if (isset($carrinho)){
foreach($carrinho as $k => $v){
echo "# $k Prod.: Quant.: $v n";
}
}

pero solo logro que aparezcan dos valores, el codigo del producto y la cantidad elegida, pero no el nombre.

Código PHP:

if (isset($_SESSION['carrinho'])){
    foreach(
$_SESSION['carrinho'] as $k => $v){
        echo 
"# $k Prod.: "$v['nombre'] ." Quant.: "$v['cantidad'] ."\n";
    }



A través del correo pocas veces contesto, y cundo no lo hago en el foro es porque no tengo tiempo.

juanperez 06-03-2007 02:36:28

Bien, bien
 
Gracias Kayetano por tu respuesta.

Colgué la interrogante en 4 foros y Roman y tú me han comentado, lo que habla muy bien de lo serio de este foro, como me pareció desde el principio.

Las correcciones en el codigo muy buenas.

La verdad como decia, estoy entrando en esto obligado por el pedido de un cliente. Hasta ahora las webs que he realizado son todas en html, pero con esto de PHP, aunque por ahora voy entendiendo con dificultad, veo que se abre un abanico de posibilidades muy grande. Voy comenzando a entender las estructuras.

En concreto, utilicé los codigos que me enviaste Kayetano (estaba intentando las buenas sugerencias de Roman pero sin exito) y el carrito funciona casi bien.

Solo aparece un error y no doy con él: en el resultado no me aparecen los nombres de los productos y en su lugar aparece un 0.

Ejemplo:

# 7730177002400 Prod.: 0 Quant.: 150
# 7730177002417 Prod.: 0 Quant.: 240
# 7730177002448 Prod.: 0 Quant.: 15
# 7730154000153 Prod.: 0 Quant.: 50
# 7730177002110 Prod.: 0 Quant.: 20

El codigo del formulario que sube los productos es:

<form action="<?=$PHP_SELF."?".$SID?>" method="post">
<input type="hidden" name="name" value="<?php echo "$row[name]"; ?>" />
<input type="hidden" name="item" value="<?php echo "$row[codigo]"; ?>" />
Unidades:
<input type="text" name="cantidad" value="000" size="5">
<input type="image" value="enviar" src="images/carrito.gif" width="26" height="26" border="0" />
</form>


Y al comienzo de la pagina final, (el formulario con la lista elegida para enviar) pongo:

<?
session_start();
$carrinho=$_SESSION['carrinho'];
?>


Por si alguna de estas cosas tiene que ver. A mi vista no encuentro la razón de ese cero

Muchas gracias otra vez.

Un abrazo.

juanperez 06-03-2007 03:15:45

Creo que encontré el error
 
En el codigo:

<?php
session_start
();
$item=$_POST['item'];
if( !isset(
$_SESSION['carrinho']) )
$_SESSION['carrinho'] = array();

if ( isset(
$_POST['item'] ) && $item > 0 ){
$_SESSION['carrinho'][$item]['cantidad'] += $_POST['cantidad'];
$_SESSION['carrinho'][$item]['nombre'] += $_POST['name'];

}
?>

a la linea

$_SESSION['carrinho'][$item]['nombre'] += $_POST['name'];

le saqué el símbolo de + y ahora carga los nombres, supongo que el + iría si fuese un número y no una cadena de texto

Quedó así

$_SESSION['carrinho'][$item]['nombre'] = $_POST['name'];

y funciona, gracias:)

kayetano 06-03-2007 09:50:08

Hola

Efectivamente, con las prisas hice copy/paste de la linea que sumaba la cantidad y no me acordé de eliminar el simbolo de sumar. Pero veo que te las has apañado bien.
Suerte con el proyecto.


La franja horaria es GMT +2. Ahora son las 15:22:03.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi