Foros del Web » Programando para Internet » PHP »

guardar y mostrar datos en array

Estas en el tema de guardar y mostrar datos en array en el foro de PHP en Foros del Web. Hola amigos, llevo dos días dándole vueltas y vueltas, leyendo sobre arrays (multidimensionales, corrientes, de asignación...) bufff!! y no lo pillo. Debo ser un poco ...
  #1 (permalink)  
Antiguo 07/04/2005, 12:15
Gux
 
Fecha de Ingreso: octubre-2003
Mensajes: 58
Antigüedad: 20 años, 6 meses
Puntos: 0
guardar y mostrar datos en array

Hola amigos, llevo dos días dándole vueltas y vueltas, leyendo sobre arrays (multidimensionales, corrientes, de asignación...) bufff!! y no lo pillo. Debo ser un poco zoquete... a lo más que he llegado (y con bastante codigo "prestado") ha sido a guardar en una variable de sesion un array con dos variables (referencia y cantidad). Quisiera incluir dos variables más (Familias y Artículos) pero se me resiste... Os comento como va el tema por si alguien se pudiera apiadar de este pobre desdichado:

Saco unos datos de una BD (en una especie de carro de pedidos) y al darle al boton de añadir quisiera que se incluyeran en un array las variables que he comentado antes (familia, referencia, articulo y cantidad).

Adjunto el código que utilizo para guardar y mostrar los datos:

Para GUARDAR:

session_start();
session_register('pedido');
if ($referencia)
{
if (!isset($pedido))
{
$pedido[$referencia]=$cantidad;
}
else
{
foreach($pedido as $k => $v)
{
if ($referencia==$k)
{
$pedido[$k]+=$cantidad;
$encontrado=1;
}
}
if (!$encontrado) $pedido[$referencia]=$cantidad;
}
}

Para MOSTRAR


session_start();

if (isset($pedido))
{
echo'El contenido de la cesta de la compra es:<br>';

foreach($pedido as $k => $v)
{
echo 'Referencia: '.$k.' Unidades: '.$v.'<br>';
}


Muchas gracias.
  #2 (permalink)  
Antiguo 07/04/2005, 12:33
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
El uso de sesiones .. no es correcto (por lo menos hoy por hoy desde PHP 4.1.0 en adelante).

Debes manejar las sesiones con los arrays superglobales:
$_SESSION

eso es un array .. y ahí guardas por elementos lo que gustes .. sean variables .. o más arrays de cualquier tipo .. No es necesario serializar ni nada más extra (como creo que tendrías que hacer si usas "session_register()" ..)

Si estás haciendo un "carrito" de compra .. que en definitiva gestiona una série de datos relacionados .. ya sea en arrays N-dimensionales .. o bien N arrays de una dimensión con un indice común (son las dos formas de resolver el problema) .. que al final se ha de "propagar" de alguna forma (sesión es lo ideal . .podría ser por el URL pero no es ni seguro ni óptimo ..) .. puedes usar el buscador del foro .. ahí veras muchos ejemplos.


Puedes gestionar un array bidimensional asociativo tipo:

$carrito[0]['propiedad1']="valor";
$carrito[0]['propiedad2']="valor";
$carrito[0]['propiedad3']="valor";

$carrito[1]['propiedad1']="valor";
$carrito[1]['propiedad2']="valor";
$carrito[1]['propiedad3']="valor";

// etc ...

O bien arrays simples .. pero en base al mismo indice:

$carrito_propiedad1[0]="valor";
$carrito_propiedad2[0]="valor";
$carrito_propiedad3[0]="valor";

$carrito_propiedad1[1]="valor";
$carrito_propiedad2[1]="valor";
$carrito_propiedad3[1]="valor";

La segunda forma .. si no te aclaras con "arrays" sería más sencilla de entender y de implementar .. Pero, ahí tendrías que propagar en la sesión esas 3 o N arrays .. mientras que en la opción 1 como es bidimensional sólo propagas una en la sesión.

La gestión de la variable cara a la sesión sería tipo:
Código PHP:
session_start();
if (isset(
$_SESSION['mi_carrito'])){
   
$carrito=$_SESSION['mi_carrito'];
} else {
   
$carrito=array();
}

Y a partir de ahí .. gestionas el array $carrito comodamente ... 
Un saludo,
  #3 (permalink)  
Antiguo 08/04/2005, 03:36
Gux
 
Fecha de Ingreso: octubre-2003
Mensajes: 58
Antigüedad: 20 años, 6 meses
Puntos: 0
Lo siento

Muchas gracias Cluster pero sigo sin entenderlo.
  #4 (permalink)  
Antiguo 08/04/2005, 04:28
Gux
 
Fecha de Ingreso: octubre-2003
Mensajes: 58
Antigüedad: 20 años, 6 meses
Puntos: 0
Exclamación Avances

Bueno, hay avances en el proceso...

He conseguido guardar en un array los datos que necesito... pero sólo consigo guardar el último dato que selecciono del carrito de pedidos (me machaca el existente y me mete el nuevo...).

¿Cómo podría hacer que se sumen los datos?

Muchas gracias.

Adjunto el codigo...

<?php
$pedido = array();

$pedido[0]["familia"] = $familia;
$pedido[1]["referencia"] = $referencia;
$pedido[2]["cantidad"] = $cantidad;

//Muestro los datos

echo 'Familia:'.$pedido[0]["familia"]. 'Referencia:'.$pedido[1]["referencia"]. 'Cantidad:'.$pedido[2]["cantidad"].'<br>';

?>
  #5 (permalink)  
Antiguo 11/04/2005, 06:24
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Fijate en los ejemplos que te puse ..

NO debes usar un indice tipo [0],[1][2] para datos que son del mismo "registro" .. en tal caso:

Con Count() podrías obtener el n° de elementos de una array de dichas características .. Para ese punto el array tendrías que haberla propagado ya por la sesión tal cual el ejemplo que te dejé.

Suponiendo que tengas un formulario X donde apuntas tu action al "add_producto.php" y method POST. Si usas un link poara pasar esas 3 variables a este script .. usa $_GET en lugar de $_POST:

add_producto.php
Código PHP:
<?
session_start
(); 
if (isset(
$_SESSION['mi_carrito'])){ 
   
$pedido=$_SESSION['mi_carrito']; 
} else { 
   
$pedido=array(); 

$indice=count($pedido)+1;

$pedido[$indice]["familia"] = $_POST['familia'];
$pedido[$indice]["referencia"] = $_POST['referencia'];
$pedido[$indice]["cantidad"] = $_POST['cantidad'];

?>
<a href="ver_carrito.php">ver carrito</a>
(fijate que DEBES!!! usar los arrays superglobales: $_POST /$_GET .. etc según el metodo que uses para enviar tus variables a tus scritps .. NO Las asumas como "globales" (cuando haces $famila)

Y para leer los datos de tu carrito .. tendrás que usar un bucle for()

ver_carrito.php
Código PHP:
<?
session_start
(); 
if (isset(
$_SESSION['mi_carrito'])){ 
   
$pedido=$_SESSION['mi_carrito']; 
} else { 
   
$pedido=array(); 


for (
$x=0$x<count ($pedido); $x++){
   echo 
"Producto en carro n°: ".$x."<br>";
   echo 
"Familia: ".$pedido[$x]['familia']."<br>";
   echo 
"Referencia: ".$pedido[$x]['referencia']."<br>";
   echo 
"Cantidad: ".$pedido[$x]['cantidad']."<br><br>";
}
?>
Un saludo,

Última edición por Cluster; 11/04/2005 a las 06:26
  #6 (permalink)  
Antiguo 11/04/2005, 07:59
Gux
 
Fecha de Ingreso: octubre-2003
Mensajes: 58
Antigüedad: 20 años, 6 meses
Puntos: 0
Muchas gracias Cluster. Eres un crack!
  #7 (permalink)  
Antiguo 11/04/2005, 17:15
 
Fecha de Ingreso: abril-2003
Ubicación: Córdoba
Mensajes: 160
Antigüedad: 21 años
Puntos: 0
Cluster y si supongamos que lo que en vez de que con un formulario, halla una lista de productos y en el link de agregar tenga la id del producto, y por ejemplo el cliente gregar el producto con id 10 y despues vuelve a agregar el producto con id 10, como hariamos para que en vez de que en la lista de productos agregados figure:
producto cantidad
10 1
10 1

nos aparezca:
producto cantidad
10 2
__________________
-----------------
_
__|_|__
º(-_-)º
  #8 (permalink)  
Antiguo 12/04/2005, 07:50
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
gdb7

La filosofía es la misma . .sea un formulario o un link .. sólo cambiaría el método GET para el caso de que esos datos los hagas llegar por un link tipo:

add_producto.php?id=1&cantidad=1

En tu caso .. si cada producto es una unidad .. hasta puedes evitar tener que usar "cantidad=1" siempre ..

Código PHP:
$pedido[$indice]["id"] = $_GET['id']; 
$pedido[$indice]["cantidad"] = $_GET['cantidad']; 
Intenta entender los "arrays multidimensionales" (esto lo podrás ver en algún tutorial de programación en general .. el uso bajo PHP es el mismo que en otros lenguajes en su base).. por qué es eso en su base un "carrito de compra" cualquiera .. Lo de menos es si trabajas con más o menos datos que relacionen tu "producto" o lo que quieras ir registrando.

Un saludo,
  #9 (permalink)  
Antiguo 14/04/2005, 12:18
 
Fecha de Ingreso: abril-2003
Ubicación: Córdoba
Mensajes: 160
Antigüedad: 21 años
Puntos: 0
uuuuuuuuy porqueeeeeeeeeeeeeeeeeee!

estoy haciendo asi ahora.

Código PHP:
session_start(); 
if (isset(
$_SESSION['carrito'])){ 
   
$pedido=$_SESSION['carrito']; 
} else { 
   
$pedido=array(); 

if(
$_GET['sum']==1){
$indice=count($pedido)+1

$pedido[$indice]["id"] = $_GET['pid']; 
$pedido[$indice]["cant"] = 1

y solo me agrega un producto y despues no agrega mas!!
que es lo que esta mal, si es como decis vos cluster!
__________________
-----------------
_
__|_|__
º(-_-)º
  #10 (permalink)  
Antiguo 14/04/2005, 13:42
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Antes de nada .. evalua como actua el script .. no siempre tienes que fiarte de lo que te digan (y si me equivoqué?) ...

Revisa el valor de $indice .. y observa si toma el valor esperado .. Tal vez tengas problemas con la sesión en sí .. por eso puede ser que siempre $indice sea 0, mira si entra el código en que parte del IF() .. para descartar problemas con la sesión o con la función count() si es que no la apliqué bien o no está dando el resultado esperado.

Un saludo,
  #11 (permalink)  
Antiguo 13/07/2005, 14:39
T4X
 
Fecha de Ingreso: enero-2004
Ubicación: myT-Base
Mensajes: 254
Antigüedad: 20 años, 3 meses
Puntos: 2
Cita:
Iniciado por Cluster
El uso de sesiones .. no es correcto (por lo menos hoy por hoy desde PHP 4.1.0 en adelante).

Debes manejar las sesiones con los arrays superglobales:
$_SESSION

eso es un array .. y ahí guardas por elementos lo que gustes .. sean variables .. o más arrays de cualquier tipo .. No es necesario serializar ni nada más extra (como creo que tendrías que hacer si usas "session_register()" ..)

Si estás haciendo un "carrito" de compra .. que en definitiva gestiona una série de datos relacionados .. ya sea en arrays N-dimensionales .. o bien N arrays de una dimensión con un indice común (son las dos formas de resolver el problema) .. que al final se ha de "propagar" de alguna forma (sesión es lo ideal . .podría ser por el URL pero no es ni seguro ni óptimo ..) .. puedes usar el buscador del foro .. ahí veras muchos ejemplos.


Puedes gestionar un array bidimensional asociativo tipo:

$carrito[0]['propiedad1']="valor";
$carrito[0]['propiedad2']="valor";
$carrito[0]['propiedad3']="valor";

$carrito[1]['propiedad1']="valor";
$carrito[1]['propiedad2']="valor";
$carrito[1]['propiedad3']="valor";

// etc ...

O bien arrays simples .. pero en base al mismo indice:

$carrito_propiedad1[0]="valor";
$carrito_propiedad2[0]="valor";
$carrito_propiedad3[0]="valor";

$carrito_propiedad1[1]="valor";
$carrito_propiedad2[1]="valor";
$carrito_propiedad3[1]="valor";


La segunda forma .. si no te aclaras con "arrays" sería más sencilla de entender y de implementar .. Pero, ahí tendrías que propagar en la sesión esas 3 o N arrays .. mientras que en la opción 1 como es bidimensional sólo propagas una en la sesión.

La gestión de la variable cara a la sesión sería tipo:
Código PHP:
session_start();
if (isset(
$_SESSION['mi_carrito'])){
   
$carrito=$_SESSION['mi_carrito'];
} else {
   
$carrito=array();
}

Y a partir de ahí .. gestionas el array $carrito comodamente ... 
Un saludo,
Lo indicado en rojo, podría funcionar tambien usando un bucle?

Código PHP:
for($p=0$p<=49$p++) {
   
$carrito_propiedad1[$p]="valor";
   
$carrito_propiedad2[$p]="valor";
  
$carrito_propiedad3[$p]="valor";

__________________
Ahora T4X es
WinGFX!!!!!
  #12 (permalink)  
Antiguo 17/06/2011, 12:12
 
Fecha de Ingreso: junio-2011
Ubicación: Irapuato
Mensajes: 13
Antigüedad: 12 años, 10 meses
Puntos: 0
Pregunta Cómo guardar y mostrar datos en array

Buen día.

Ojala puedan ayudare.

Soyt nuevo en esto de la programación y estoy haciendo mis primeros aportes en PHP y MyAdmin. El problema es el siguiente. En la empresa donde trabajo (Ferretera), necesito que mediante un formulario, se guarden los datos de cada caja de texto en una base de datos. Incluí un script para agregar campos dinamicos, pero no se como meterlos en la bd. Leí que se podía hacer haciendo un barrido de los datos mediante un array, pero por mas que le busco no se como.

Al hacer click en en enlace, se van agregando los campos.

Alguien tiene alguna idea?

El código es el siguiente:

<html>
<head>
<script type="text/javascript">
counter = 1;
function agregarCampo()
{
var x = document.getElementById("campos_txt");
var campo = document.createElement("input");
// campo.setAttribute('type', "text");
// campo.setAttribute('name', "texto"+counter);
// campo.setAttribute('id', "texto"+counter);
var br = document.createElement("br");
// Pone nombre del Articulo + Número de campo
x.appendChild(document.createTextNode("Articulo "+counter+" : "));
// Hace que aparezca el campo.
x.appendChild(campo);
x.appendChild(br);
counter++;
if (counter>30)
{
alert("Ha excedido el límte de 30 pedidos. Aunque agregue más, solamente se grabaran 30 códigos.");
}
}
function borrarElemento()
{
var x = document.getElementById("campos_txt");
x.removeChild(x.lastChild);
x.removeChild(x.lastChild);
x.removeChild(x.lastChild);
}

</script>
<script LANGUAGE="JavaScript">
<!-- Begin
function checkFields() {
if (document.form1.counter.value >30)
{
alert(excedido);
}
return false;
}
// End -->
</script>

<style type="text/css">
<!--
.Estilo2 {
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: x-small;
}
a:link {
text-decoration: none;
}
a:visited {
text-decoration: none;
}
a:hover {
text-decoration: none;
}
a:active {
text-decoration: none;
}
.Estilo4 {
color: #0000FF;
font-weight: bold;
}
.Estilo10 {
color: #0000FF;
font-size: medium;
}
.Estilo6 {font-family: Verdana, Arial, Helvetica, sans-serif}
body {
background-image: url(logorsfondo.png);
}
.Estilo8 {font-family: Verdana, Arial, Helvetica, sans-serif; font-size: x-small; font-weight: bold; }
.Estilo12 {font-family: Verdana, Arial, Helvetica, sans-serif; font-size: xx-small; }
.Estilo13 {
color: #FF0000;
font-weight: bold;
}
.Estilo15 {color: #FFFFFF; font-weight: bold; }
.Estilo17 {color: #0000FF; font-weight: bold; font-size: small; }
.Estilo18 {font-size: small}
-->
</style>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head>
<body>
<table width="607">
<tr>
<td width="204" rowspan="2"><div align="center"><img src="file:///C|/Documents and Settings/Administrador/Escritorio/ANGEL/WEB RS DISTRIBUCIONES/logorsdistbco.png" width="204" height="159" /></div></td>
<td width="872"><div align="center">
<p><span class="Estilo6"><span class="Estilo10">RS Distribuciones, S.A. de C.V.</span><br />
</span><strong>Formulario de Pedido de Material</strong></p>
<p class="Estilo13">&nbsp;</p>
</div></td>
</tr>
<tr>
<td bgcolor="#0000FF"><div align="center" class="Estilo6"><span class="Estilo15">¡Restringido a 30 códigos por formulario!</span></div></td>
</tr>
</table>
<table width="604" border="1" bordercolor="#FFFFFF" bgcolor="#FF6600">
<tr>
<td>&nbsp;</td>
</tr>
</table>
<br>
<form id="form1" name="form1" method="post" action="file:///C|/Documents and Settings/Administrador/Escritorio/ANGEL/WEB RS DISTRIBUCIONES/agregapedidos.php" onSubmit="return checkFields();">
<table width="771" border="0">
<tr>
<td width="189"><span class="Estilo8">No. de Cliente:</span></td>
<td width="166"><span class="Estilo2">
<input type="text" name="nocliente" id="nocliente">
</span></td>
<td width="394"><span class="Estilo12">Ejemplo: 1974 debera escribirse 001974<br>
Ejemplo: 635 debera escribirse 000635</span></td>
</tr>
<tr>
<td><span class="Estilo8">Nombre del Cliente:</span></td>
<td colspan="2"><span class="Estilo2">
<input type="text" name="nombrecliente2" id="nombrecliente2">
</span></td>
</tr>
</table>
<h6 class="Estilo2">Ingresar pedido:</h6>
<p class="Estilo2"><span class="Estilo13">Ayuda: </span><br>
<br>
Para ingresar su pedido, debe antes determinar cuantos códigos va a ingresar. <br>
Por ejemplo, si solamente requiere ingresar 7 códigos, presione solamente 7 veces en la línea &quot;Añadir Articulo (Código)&quot;<br>
para que aparezcan 7 campos únicamente, y automáticamente aparecera: &quot;Articulo 1:&quot;, &quot;Articulo 2:&quot;, etc.<br>
<br>
Ingrese los códigos que requiere uno por cada línea. Si se equivocó en la cantidad de códigos, simplemente deje en blanco<br>
la información.</p>
<p class="Estilo2">Para ingresar los códigos y cantidad del producto solicitado, debera colocarse de la sig. manera:</p>
<p class="Estilo2">Ejemplo: Supongamos que queremos <strong>6</strong> piezas del código <strong>12593 </strong>(Cinta Masking Tape 2'X 50 Metros), deberemos ingresar el<br>
código y despues la cantidad, separada por un asterisco: <strong>12593*6</strong>.</p>
<p class="Estilo2">También es importante que nos deje sus comentarios, por ejemplo: Favor de entregar las carretillas armadas o el cliente pasara <br>
directamente a la oficina por el pedido, etc.</p>
<p class="Estilo2"><span class="Estilo13">IMPORTANTE:</span> <strong>LIMITADO UNICAMENTE A 30 CODIGOS POR FORMULARIO</strong>. Si desea agregar más códigos, vuelva a cargar el formulario.</p>
<p class="Estilo2"><a href="#" class="Estilo4" onClick="agregarCampo()"><span class="Estilo18">»</span> A&ntilde;adir Articulo (Código)</a> <span class="Estilo17">«</span></p>
<div class="Estilo2" id="campos_txt"></div>
<p class="Estilo2">Comentarios sobre el pedido:<br>
<textarea name="comentarios" id="comentarios" cols="45" rows="5"></textarea>
</p>
<p class="Estilo2">
<span class="Estilo2">
<input type="submit" name="button" id="button" value="Enviar">
<input type="reset" name="button2" id="button2" value="Restablecer">
</span></p>
</form>

</body>
</html>
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 01:31.