Ayuda con php avanzado

#1
Hola como estan, bueno el asunto es el siguiente, estoy armando un proyecto personal, es un e-bussines y ya tengo gran parte de la pagina terminada, mi problema es el carro de compras, me gustaria que alguien me hiciera el favor de ayudarme por que la verdad ya estoy que me doy de topes contra el escritorio, ya que esto ya supero mi habilidad en este momento.

No he pegado el codigo aqui por que es demasiado largo y complicado aunque voy a hacer lo posible por poner solo lo escencial para que trabaje la pagina y de ser posible mañana mismo les dejo el link para que la visiten, aun que como le sdigo tiene unos cuentos errores.

Si alguien quiere y puede ayudarme se lo agradeceria cabronamente y de paso aprovecho para ofrecer mi ayuda ya sea con hardware o algo de programacion.
 
#4
Gracias por contestar tan rapido, veamos que podemos hacer sin meternos tan de golpe en el codigo, haber si o puedo explicar asi por que hay veces que lo explico y ni yo me entiendo XD.

Toda la informacion la manejo desde una base de datos con varias tablas, ejemplificando solamente 2 seria:

Categorias: ahi va el nombre de cada categoria y el numero unico de cada una.
Categoria1: descripcion de los articulos, precio y fotografia.

Cada articulo tiene mas o menos los mismo campos pero prefiero manejarlo asi por que en determinado momento son muchisimos las categorias (aprox unas 20) y en cada categoria meto bastantes articulos de la misma.

Ahora bien en la pagina principal muestro una drop down list con todas las categorias, utilizando una llamada a la base de datos, especificamente a la tabla "categorias", cuando el usuario selecciona una categoria se envia el numero de la categoria por GET (lo mas probable es que cambie a POST cuando todo funcione bien).

PHP se encarga de mostrar todos los articulos de una categoria en base al contenido del GET, ahora bien ya que mostre todos los articulos supongamos que el usuario escoje uno para comprarlo, asi que da click sobre el boton o link "comprar", usando sesiones de PHP esta informacion se guarda en dicha variable y me regreso al menu principal o a la categoria que estava revizando (esto ultimo aun no se bien como hacerlo aun que realmente no he buscado, para que mas que la verdad :p)

Hasta aqui todo bien, tengo la informacion guardada y cada que el usuario agrega un articulo este se guarda. Mi problema es la forma en la que guardo esta informacion que se compone del nombre del articulo y el precio.

Cuando el usuario intenta ver el carro de compras con un solo articulo todo trabaja de maravilla el problema es cuando tengo mas de un articulo ya que los precios no salen bien acomodados y no puedo borrar ni actualizar la cantidad de articulos.

Este es basicamente mi problema, ya lo intente de varias formas y no llego a nada, para facilitar esto voy a subir el codigo lo mas pronto posible y voy a dejar el server abierto por si alguien se interesa en ver la pagina trabajando.

Gracias por su ayuda y espero haberme explicado
 

cdar

Bovino maduro
#5
ok, aunque no es tan avanzado. va. mira primero hay que centrarse en que hace un carrito.

Uno básico
*Agrega productos
*Borra productos
*Limpia el carrito
*Envia el carrito para la compra

Son 4 tareas muy sencillas. Utilizando sesiones es muy facil de manejar, primero; es necesario tener una variable de session llamada carrito, el carrito tendra un arreglo de registros llamada producto que sera donde se van añadiendo producto por producto (o eliminaodo) y por ultimo cada producto solo tiene que tener dos campos id_producto, cantidad_pedida:
$_SESSION['carrito'];
$_SESSION['carrito']['producto'];
$_SESSION['carrito']['producto']['id'];
$_SESSION['carrito']['producto']['cantidad'];

ejemplo:
$_SESSION['carrito'][0]['id'] = 1;
$_SESSION['carrito'][0]['cantidad'] = 5;
$_SESSION['carrito'][1]['id'] = 2;
$_SESSION['carrito'][1]['cantidad'] = 10;
hay tienes un carrito básico con 2 prouctos el primero (producto 0) es el id=1 y el cliente pidio comprar 5 de ellos, el segundo (producto 1) es el id=2 y el cliente pidio 10 de este.

Para añadis más productos solo tienes que ir creciendo el indice del producto $_SESSION['carrito'][0]['id'], para borrar un producto es tan secillo como aplicar un unset a el producto con el id del producto a borrar unset($_SESSION['carrito'][0]). Solo recuerda que al borrarlo queda un hueco en el arreglo, hay que reacomodar los indices de los productos para rellenar el espacio, no te apures una funcion de php lo ya hace y listo.

Limpiar el carrito es muy simple, solo destruye la session y listo, adios carrito.

Por ultimo para enviar, en el panel donde se visualize el carrito hay que poner un submit que reciba los datos de envio y el arreglo productos de la session, y que mande todo ya sea por email o lo almacene a la bd. es muy simple si lo ves.
Hay quien cree deseable guardar la informacion de envio enla misma session del carrito:
$_SESSION['carrito']['datos_personales']['nombre']
$_SESSION['carrito']['datos_personales']['telefono']
$_SESSION['carrito']['datos_personales']['calle']
$_SESSION['carrito']['datos_personales']['ciudad']
pero eso ya es cuestion de gustos.

Suerte... bytez.-..--.
 

gershek

Bovino adicto
#6
no he hecho algo asi pero una vez alguien de aqui me dijo que buscara librerias si le buscas al igual y hay algo que puedas usar, suerte. saludos
 
#7
Hola yo de nuevo, CDAR la idea que tienes suena interesante y la voy a implementar para ver que sale, de momento les adjunto el codigo que ya tengo escrito pero reducidos para que sean implementados y vean ustedes mismos cual es el problema.

Empezamos con la base de datos:

//creamos la base de datos
create database prueba;
use prueba;

//creo la primer tabla e inserto valores
create table categories
(
catid int(3) unsigned not null primary key,
catname char(20) not null
);

insert into categories values
(1, 'Cables'),
(2, 'Discos Duros'),
(3, 'Procesadores');

//creo las tablas para cada articulo
create table cables
(
clave char(10) not null primary key,
descripcion varchar(255) not null,
fabricante char(15) not null,
precio decimal(6,2) not null,
pixb char(15) not null,
pixm char(15) not null,
pixf char(15) not null,
formato char(15) not null,
conectores char(50) not null,
dimensiones char(20) not null
);

create table dduros
(
clave char(10) not null primary key,
capacidad char(10) not null,
descripcion varchar(255) not null,
fabricante char(15) not null,
formato char(15) not null,
interface char(10) not null,
precio decimal(6,2) not null,
pixb char(15) not null,
pixm char(15) not null,
pixf char(15) not null,
velocidad char(10) not null
);

create table procesadores
(
clave char(15) not null primary key,
descripcion varchar(255) not null,
fabricante char(15) not null,
precio decimal(6,2) not null,
pixb char(15) not null,
pixm char(15) not null,
pixf char(15) not null,
socket char(10) not null,
velocidad char(15) not null,
bus char(20) not null,
cachel2 char(20) not null
);

//inserto articulos en cada tabla
INSERT INTO cables VALUES
('A2095', 'Cable Sata Rojo UV', 'Thermaltake', 40.00, 'a2095.jpg', 'a2095.jpg', 'TTMini.png', 'S-ata', '', '50 MM'),
('A2096', 'Cable Sata Azul UV', 'Thermaltake', 30.00, 'a2096.jpg', 'a2096.jpg', 'TTMini.png', 'S-ata', '', '50 MM');

INSERT INTO dduros VALUES
('WD1500ST', '150 GB', 'Disco duro S-ata 150 GB ', 'Western Digital', '3 1/2 pulgadas', 'S-ata II', 850.00, 'WDST1000.jpg', 'raptor.jpg', 'western.png', '7200 RPM'),
('SEA360DG', '360 GB', 'Disco Duro S-ata 360 GB', 'Seagate', '3 1/2 pulgadas', 'S-ata II', 1500.00, 'SG5600WSD.jpg', 'raptor.jpg', 'seagate.png', '7200 RPM');

INSERT INTO procesadores VALUES
('CP1036AMD1', 'Procesador AMD Sempron LE-1250', 'AMD', 33.80, 'sempron.png', 'sempronm.png', 'null', 'AM2', '2.2 GHz', 'null', '512 KB'),
('CP1240AMD1', 'Procesador AMD Athlon 64 X2 BE-2400', 'AMD', 88.94, 'athlonx2.png', 'athlonx2m.png', 'null', 'AM2', '2.3 GHZ', 'null', '512 KB'),
('CP1252AMD0', 'Procesador AMD Athlon 64 X2 5200+', 'AMD', 53.94, 'athlonx2.png', 'athlonx2m.png', 'null', 'AM2', '2.7 GHZ', 'null', '512 KB'),
('CP1256AMD0', 'Procesador AMD Athlon 64 X2 5600+', 'AMD', 75.96, 'athlonx2.png', 'athlonx2m.png', 'null', 'AM2', '2.8 GHZ', 'null', '512 KB');
Ok con esto ya tenemos la base de datos preparada y funcionando para la pagina, ahora vamos a empezar con el codigo de cada hoja o pagina del sitio web.

Ahorita no me pienso meter en el aspecto "visual o estetico" de la pagina ya que de momento eso es lo que menos me interesa asi que vayamos al grano.

Vamos a desplegar una drop down list con el contenido de la tabla categories, con la cual los usuarios podran seleccionar el tipo de articulos que le interesan.

index.php
<?
session_start(); //agregamos esto para manejar la sesion
$user="root"; /*temporal habria que cambiarlo por seguridad*/
$host="localhost"; /*al parecer este valor va a ser fijo en el server*/
$password=""; /*alterno a contraseña debe de asignarse uno a la bd a utilizar*/
$database="prueba"; /*nombre de la bd a utilizar*/

/*inicia la conexion a la base de datos*/
$connect=mysql_connect($host,$user,$password)
or die ("No se puede conectar al servidor");
/*conexion a la base de datos utilizando los paramentros: host, user y password*/

$select=mysql_select_db($database,$connect)
or die ("No se pudo seleccionar la base de datos");
/*seleccionando la base de datos utilizando los paramentros de conexion y el nombre de la base de datos a utilizar*/

$oracle="SELECT catid, catname FROM categories ORDER BY catid";
/*guardo en oracle la solicitud a la base de datos, pido la columna categoria de la tabla articulos ordenado por categoria, agregon el distinct para que no envie campos repetidos */

$answer=mysql_query($oracle)
or die ("No se pudo realizar la consulta");
/*mando a la variable answer el resultado de la consulta hecha por oracle*/

/*comienzo a crear la dropdown list con la informacion recibida de la base
de datos*/

echo "<form action='show_cat.php' method='GET'>
<select name='catid'>\n";

while ($fila=mysql_fetch_array($answer))
{
extract($fila);
echo "<option value='$catid'>$catname\n";
}
echo "</select>\n";
echo "<input type='submit' value='Buscar'>
</form>\n";

$cart = $_SESSION['cart'];
//$catid=$_SESSION['precio']; //linea experimental
if (!$cart)
{
echo'<p>Tu carro esta vacio</p>';
}
else
{

$items = explode(',',$cart);
$s = (count($items) > 1) ? 's':'';

//$precio=explode(',',$catid);
echo '<p>Tienes '.count($items).' articulo'.$s.' en tu cesta<br>
<a href="show_cart.php">Ver ahora</a></p>';
echo 'El precio es:'.$precio;
}?>
Ok ya tenemos la drop down list en la cual el usuario puede seleccionar una categoria, ya con esto pasamos a procesar la solicitud y a mostrar los resultados con el siguiente codigo:

show_cat.php
<?
session_start();
$user="root";
$host="localhost";
$password="";
$database="prueba";

$connect=mysql_connect($host,$user,$password)
or die ("No se puede conectar al servidor");

$select=mysql_select_db($database,$connect)
or die ("No se pudo seleccionar la base de datos");

/*Comienzo el Switch solamente con los case que tengo hasta el momento*/
switch ($_GET['catid'])
{
case 1: $consulta="SELECT * FROM cables";
$resultado=mysql_query($consulta)
or die ("no se pudo realizar la consulta");
echo"<center>Cables</center>";
while ($row= mysql_fetch_array($resultado))
{
extract($row);
echo "<table border=0 width=600 cellpadding=1>

<!-- Cabecera de la tabla -->
<tr bgcolor=#FFD700>
<td colspan=2 align='center'>
<b>$clave</b>
</td>
</tr>

<!-- descripcion -->
<tr>
<td valign='top'>
<b>Descripcion:</b>$descripcion<br>
<b>Dimensiones:</b>$dimensiones<br>
<img src='images/{$row['pixf']}'>
</td>

<!-- imagen -->
<td align='right'>
<img src='images/{$row['pixb']}'><br>
<b>Precio:</b>$precio <br>
</td>
</tr>

<!-- boton mas informacion y popup -->
<tr bgcolor=#FFD700>
<td>
<left> <form action='show_item.php' method='GET' onsubmit='abrirpopup()' target='popup'>
<input type='hidden' name='catid' value='3'>
<input type='hidden' name='clave' value='$clave'>
<input type='submit' value='Mas detalles'>
</form>
</left>\n
</td>
<!-- termina popup -->

<!-- boton agregar al carro -->
<td align=right>
<a href='process.php?action=add&id=".$descripcion."&precio=".$precio."'>Comprar</a>
</td>
</tr>
<br>
</table>";
}
break;

case 2: $consulta="SELECT * FROM dduros";
$resultado=mysql_query($consulta)
or die ("no se pudo realizar la consulta");
echo"<center>Discos Duros</center>";
while ($row= mysql_fetch_array($resultado))
{
extract($row);
echo "<table border=0 width=600 cellpadding=1>

<!-- Cabecera de la tabla -->
<tr bgcolor=#FFD700>
<td colspan=2 align='center'>
<b>$clave</b>
</td>
</tr>

<!-- descripcion -->
<tr>
<td valign='top'>
<b>Descripcion:</b>$descripcion<br>
<b>Capacidad:</b>$capacidad<br>
<b>Velocidad:</b>$velocidad<br>
<img src='images/{$row['pixf']}'>
</td>

<!-- imagen -->
<td align='center'>
<img src='images/{$row['pixm']}'><br>
<b>Precio:</b>$precio <br>
</td>
</tr>

<!-- boton mas informacion y popup -->
<tr bgcolor=#FFD700>
<td>
<form action='show_item.php' method='GET' onsubmit='abrirpopup()' target='popup'>
<input type='hidden' name='catid' value='4'>
<input type='hidden' name='clave' value='$clave'>
<input type='submit' value='Mas detalles'>
</form>\n
</td>
<!-- termina popup -->

<!-- boton agregar al carro -->
<td align=right>
<a href='process.php?action=add&id=".$descripcion."&precio=".$precio."'>Comprar</a>
</td>
</tr>
<br>
</table>";
}
break;

case 3: $consulta="SELECT * FROM procesadores";
$resultado=mysql_query($consulta)
or die ("no se pudo realizar la consulta");
echo"<center>Procesadores</center>";
while ($row= mysql_fetch_array($resultado))
{
extract($row);
echo "<table border=0 width=600 cellpadding=1>
<!-- Cabecera de la tabla -->
<tr bgcolor=#FFD700>
<td colspan=2 align='center'>
<b>$clave</b>
</td>
</tr>

<!-- descripcion -->
<tr>
<td valign='top'>
<b>Descripcion: </b>$descripcion<br>
<b>Velocidad: </b>$velocidad<br>
</td>

<!-- imagen -->
<td align='right'>
<img src='images/{$row['pixm']}'><br>
<b>Precio:</b>$precio USD<br>
</td>
</tr>

<!-- boton mas informacion y popup -->
<tr bgcolor=#FFD700>
<td>
<left>
<form action='show_item.php' method='GET' onsubmit='abrirpopup()' target='popup'>
<input type='hidden' name='catid' value='13'>
<input type='hidden' name='clave' value='$clave'>
<input type='submit' value='Mas detalles'>
</form>
</left>\n
</td>
<!-- termina popup -->

<!-- boton agregar al carro -->
<td align=right>
<a href='process.php?action=add&id=".$descripcion."&precio=".$precio."'>Comprar</a>
</td>
</tr>
<br>
</table>";
}
break;
default: break;
}?>
Ok, nuestro usuario ya puede ver los articulos que tenemos en cada categoria y ya puede agregarlos al carro de compra dando click en "comprar"ya con esto pasamos al archivo 'process.php' que se va a encargar de ir insertando los articulos en el carro de compras

process.php
<?php
session_start();
extract($_GET);

$cart = $_SESSION['cart'];
switch ($action)
{
case 'add':if ($cart)
{
$cart .= ','.array("ID"=>$id,"Cantidad"=>$cantidad,"Precio"=>$precio);
}
else
{
$cart = array("ID"=>$id,"Cantidad"=>$cantidad,"Precio"=>$precio);
}
break;
}
$_SESSION['cart'] = $cart;
echo '<a href="index.php">Seguir Comprando</a>';?>
Obviamente este proceso anterior no deberia de ver ya en la pagina finalizada pero por motivos de control prefiero manejarlo asi.

De momento ya tenemos articulos en el carro de compras y en teoria deberiamos de verlos para eso regresamos a nuestro index y verificamos que todo este en orden.

show_cart.php
<?php
session_start();
$cart = $_SESSION['cart'];

echo '<center>
<form action="agregar.php?action=update" method="post" id="cart">
<table border=1>
<tr bgcolor=#CCCFFF>
<th width=200>Descripcion</th>
<th width=100>Cantidad</th>
<th width=80>Precio</th>
<th width=100>Subtotal</th>
</tr>';

echo "<tr>";

for ($i=0; $i<3; $i++)
{
echo "<td>".$i."</td>";
echo "<td>".$cart."</td>";
echo "</tr>";
}
// CON UN SOLO FOR MUESTRO ESTO
/******************************************************************************
*Descripcion Cantidad Precio Subtotal
0 Array,Array,Array
1 Array,Array,Array
2 Array,Array,Array
*******************************************************************************/
echo '<a href="show_cat.php?catid=3">Seguir Comprando</a>';
?>
Hasta aqui es el codigo que llevo hecho, es algo muy sencillo por que como les comente estoy dejando completamente de lado la parte estetica y me estoy centrando en que el programa se ejecute correctamente.

Disculpen la tardanza pero la escuela me trae en chinga, si alguien me pudiera ayudar se los agradeceria muchisimo ya que realmente falta muy poco por hacer.

Mi problema como se puede observar es a la hora de imprimir el arreglo que contiene todos los datos, de igual forma creo que los estoy metiendo de forma incorrecta y por eso cuando hago FOR me muestra 3 arreglos con 3 arreglos internos ¬¬ osease no se ni que pex.

Nuevamente gracias por su atencion y espero alguien me pueda sacar de la ignorancia
 
#8
Ya verifique el codigo y trabaja hasta donde pido mostrar el contenido del carro e hice algunas pruebas pero sigo igual, si a alguien le interesa ver la ejecucion hoy mismo subo la pagina a internet para que la revizen
 
#9
Ayuda con PHP avanzado (solucionado)

Hola como estan bueno si recuerdan tenia un problema a la hora de insertar y mostrar la informacion de un arreglo, bueno pues ya dandole un poco de vueltas lo solucione.

Lo que hice fue:

1.- En el archivo process.php extraigo todo lo que mande por GET
PHP:
extract($_GET);
2.- Convierto todas mis variables en un arreglo asociativo y las inserto en otro arreglo
PHP:
$cart[] = array("ID"=>$id,"Cantidad"=>$cantidad,"Precio"=>$precio);
3.- Si quiero insertar un nuevo articulo a la variable solamente hago esto:
PHP:
array_push($cart,array("ID"=>$id,"Cantidad"=>$cantidad,"Precio"=>$precio));
4.- Haciendo varias veces esto obtengo:
Código:
Array
(
    [0] => Array
        (
            [ID] => Cable Sata Rojo UV
            [Cantidad] => 1 
            [Precio] => 40.00
        )

    [1] => Array
        (
            [ID] => Disco duro S-ata 150 GB 
            [Cantidad] => 1 
            [Precio] => 850.00
        )

    [2] => Array
        (
            [ID] => Procesador AMD Sempron LE-1250
            [Cantidad] => 1 
            [Precio] => 33.80
        )

    [3] => Array
        (
            [ID] => Cable Sata Rojo UV
            [Cantidad] => 1 
            [Precio] => 40.00
        )

)
Ya con esto almacenado en la variable $cart ahora lo unico que tengo que hacer es imprimirla.

Entonces:
1.- Declaro una variable para utilizarla como contador en este caso va a ser $x.

2.- Comienzo un for cuyo limite va a ser: count<($cart) para que no me imprima mas de lo que ya tengo

3.- Pongo los valores que quiero que el for me imprima.

4.- Realizo algunas operaciones

5.- Y aumento en uno mi contador para llevar un control del indice de mi arreglo

PHP:
$x=0;
for($i=0; $i<count($cart); $i++)
{
echo "<tr align=center><td>".$cart[$x]['ID']."</td>";
echo "<td><input type= 'text' value=".$cart[$x]['Cantidad']." size='3' maxlength='3'/></td>";
echo "<td>".$cart[$x]['Precio']."</td>";
$subtotal=$cart[$x]['Cantidad']*$cart[$x]['Precio'];
echo "<td>".$subtotal."</td>";
echo "<td><a href='process.php?action=delete&index=".$x."'>Borrar</a></td>";
echo "</tr>";
$x++;
$total+=$subtotal;
}
Y listo problema solucionado, ya solo es cuestion de acompletar la tabla y hacer las modificaciones pertinentes, aun que tiene algunos errores que me gustaria tratar de solucionar pero esos los vemos en el proximo post.

Gracias a todos los que intentaron ayudarme :vientos:
 
Arriba