Foros del Web » Programando para Internet » PHP »

Problema carrito compra

Estas en el tema de Problema carrito compra en el foro de PHP en Foros del Web. Hola buenas. Estoy desarrollando un carrito de la compra para una web mediante PHP y una base de datos en SQL ORACLE. Os cuento como ...
  #1 (permalink)  
Antiguo 17/08/2012, 13:24
 
Fecha de Ingreso: agosto-2012
Mensajes: 6
Antigüedad: 11 años, 8 meses
Puntos: 0
Sonrisa Problema carrito compra

Hola buenas. Estoy desarrollando un carrito de la compra para una web mediante PHP y una base de datos en SQL ORACLE. Os cuento como lo he hecho:

En la pagina de los productos, se selecciona el que se desea añadir al carrito. Ese botón lleva hasta una pagina previa que indica el producto escogido y pide una cantidad para añadir al carro. Al aceptar, lo siguiente es una vista del carrito con un enlace para ir a los productos y seguir añadiendo de igual forma.

Cuando estan todos los productos deseados en el carrito, aceptamos y se desarrollan las siguientes funciones:

1. Se crea un nuevo pedido en la tabla Pedido de la bd, donde se introducen datos tales como el usuario logueado, la fecha, etc.

2. Se selecciona el ultimo pedido creado en la tabla, el cual es el pedido del usuario logueado actualmente y que esta comprando.

3. Se consulta todo de articulo para sacar la cantidad, mediante la id del articulo y en el mismo bucle, se inserta cada articulo en la tabla lineas de pedido.


Entonces, tengo el siguiente problema. Cuando selecciono varios productos en el carrito y acepto la compra, se crea el pedido, pero me tira tal error:

SQLSTATE[HY000]: General error: 1722 OCIStmtExecute: ORA-01722: invalid number (ext\pdo_oci\oci_statement.c:148)

Resulta que el pedido nuevo lo crea, pero no es capaz de asociar a cada linea de pedido dicho pedido. No entiendo el error a que puede deberse y me inquieta lo de invalid number, ojala podais ayudarme con esto.

Adjunto el codigo de la pagina donde estan las funciones enumeradas:

Código:
<?php
session_start();
require 'gestionBD.php';
$conexion = conectar();


/////////// INSERTA NUEVO PEDIDO ////////////

$FechaActual=date("d\\/n\\/Y");
echo "Precio total del pedido entero: ".$_SESSION['precioTotal'];

function insertaPedido($FechaActual,$total,$persona,$conexion) {
        try {
                $stmt = $conexion -> prepare("INSERT INTO PEDIDO VALUES(SEQPED.NextVal, :FechaActual,:total, :persona)");
                $stmt->bindParam(':FechaActual', $FechaActual);
                $stmt->bindParam(':total', $total);
                $stmt->bindParam(':persona', $persona);
                
                $stmt -> execute();
                return TRUE;
				
         
        } catch(PDOException $e ) {
		// tratamiento del error
		echo "error: ".$e->GetMessage();
		//header("location: errorRegistro.php");
		return FALSE;
		}
}


if(insertaPedido($FechaActual,$_SESSION['precioTotal'],$_SESSION['usuarioLogueado'],$conexion)){
	echo "<br>Se ha insertado correctamente el pedido!!!";
}


		

/////////// SACA ULTIMO PEDIDO REALIZADO ////////////
 
 
function sacarMaxPed($Usuario, $conexion){
 $stmt1 = $conexion->prepare("SELECT MAX(ID_PED) AS MAXPED FROM PEDIDO WHERE COD_PER = :usuario");
 $stmt1->bindParam(':usuario', $Usuario);
 $stmt1->execute();
 

 $MAXPED=0;
 
 while($reg1 = $stmt1->fetch()){
 echo "<br>Parametro 2: ". $Usuario;
   var_dump($reg1);
   //$MAXPED = $reg1['MAXPED'];
   $_SESSION['MXPD']=$reg1['MAXPED'];
   echo "<hr>";
  // echo "<br>MAXPED: ". $MAXPED;
  echo "<br>MAXPED SSS: ". $_SESSION['MXPD'];
   echo "<br>";
   $reg1 = $stmt1->fetch();
 }

}


 echo sacarMaxPed($_SESSION['usuarioLogueado'],$conexion);
 
//////////////////////////////////////////////////////



$mx=$_SESSION['MXPD'];


/////////// INSERTA NUEVA LINEA_PEDIDO ////////////

//function sacarArticulo ($cantidad,$subtotal,$regart,$conexion){
function sacarArticulo ($cantidad,$subt,$regart,$mx,$conexion){
	$registros3 = $conexion->prepare("select * from ARTICULO");
	$registros3->execute();
	
	while($reg3 = $registros3->fetch()){
	echo "<br>variableeee: ".$_SESSION["Art".$reg3['ID_ART']];
 		if(isset($_SESSION["Art".$reg3['ID_ART']])){    
			$cantidad = $_SESSION["Art".$reg3['ID_ART']];
			$precio = $reg3['PRECIO'];
			
			
			$descuento=($reg3['PRECIO']*$reg3['DESCUENTO'])/100;
			$precioSubtotal=$reg3['PRECIO']-$descuento;	
			
			$subtotal = $precioSubtotal * $cantidad;
			echo "precio articulo: ".$precioSubtotal;
			echo "cantidad articulo: ".$cantidad;
			echo "sub: ".$subtotal;
			$regart = $reg3['ID_ART'];
			echo "<br>id articulooooooooooo: ".$regart;	
			
			$registros4 = $conexion->prepare("insert into LINEAS_PEDIDO values(:cantidad, :subtotal, :regart, :mx)");
			
				$registros4->bindParam(':subtotal', $subt);
				$registros4->bindParam(':regart', $regart);
				$registros4->bindParam(':cantidad', $cantidad);
				$registros4->bindParam(':mx', $mx);
			$registros4->execute();
		
		}
	}
}
//echo sacarArticulo($cantidad,$subtotal,$regart,$conexion);
echo sacarArticulo($cantidad,$subtotal,$regart,$mx,$conexion);
?>
<a href="index.php">volver a inicio</a>
<?

session_destroy();
?>

PD: Si necesitan algo más de información, por favor les ruego me lo comuniquen que se la proporcionaré.

Muchas gracias.
  #2 (permalink)  
Antiguo 17/08/2012, 13:43
 
Fecha de Ingreso: agosto-2012
Ubicación: En algún lugar de México
Mensajes: 41
Antigüedad: 11 años, 8 meses
Puntos: 16
Respuesta: Problema carrito compra

Cheque el código del error y se produce cuando se intenta convertir una cadena de caracteres a un número, pero sin embargo esa cadena no se puede representar como un literal numérico. Verifica bien las inserciones que realizas, probablemente no estes manejando correctamente los tipos.
  #3 (permalink)  
Antiguo 17/08/2012, 13:59
 
Fecha de Ingreso: agosto-2012
Mensajes: 6
Antigüedad: 11 años, 8 meses
Puntos: 0
Respuesta: Problema carrito compra

Cita:
Iniciado por kale86 Ver Mensaje
Cheque el código del error y se produce cuando se intenta convertir una cadena de caracteres a un número, pero sin embargo esa cadena no se puede representar como un literal numérico. Verifica bien las inserciones que realizas, probablemente no estes manejando correctamente los tipos.
He comprobado los tipos en la base de datos y son tipo Integer los identificadores de los productos, que es lo que se va añadiendo a la tabla de las lineas de pedido.
Entonces, no se como darle solución la verdad.
  #4 (permalink)  
Antiguo 17/08/2012, 14:17
 
Fecha de Ingreso: agosto-2012
Ubicación: En algún lugar de México
Mensajes: 41
Antigüedad: 11 años, 8 meses
Puntos: 16
Respuesta: Problema carrito compra

Asi como expresas el ejemplo, aparentemente se encuentra bien, no se como trabaja esa clase que utilizas, pero a mi cuando se me presenta un problema como este lo intento resolver por partes, te explico, puedes ir implementando cada uno de los puntos que comentas arriba de forma secuencial, es decir, trabajo primero con el punto 1, prueba hasta aqui todas las posibles variaciones en las acciones que púedan presentarse con los datos que puede introducir el cliente (debe de guardar correctamente). Una vez checado el punto anterior, verifica el punto dos, y despues el punto 3.

Realizando esto, es mas facil detectar en que parte se produce el error. Puedes utilizar funciones echo y print_r para ir viendo los resultados obtenidos.

Espero que me halla explicado y hallas captado. Saludos
  #5 (permalink)  
Antiguo 18/08/2012, 16:00
 
Fecha de Ingreso: agosto-2012
Mensajes: 6
Antigüedad: 11 años, 8 meses
Puntos: 0
Respuesta: Problema carrito compra

Pues llevo todo el dia viendo paso a paso cual puede ser el problema y he llegado a la conclusión de que solo crea un nuevo pedido si la cantidad de articulos seleccionada en el carrito es como maximo 3. Si se seleccionan 4 o más me tira el error del invalid number y la verdad, no entiendo nada ya. Ojala puedan orientarme porque estoy mas perdido que el barco del arroz.
Muchas gracias.


Edit: He reducido el codigo, comprobando primero el último pedido que está creado, para luego incrementarlo en 1. Seguidamente creo el pedido gracias a ese dato y añado las lineas de pedido.

Código:
<?php
session_start();
require_once 'gestionBD.php';
$conexion = conectar();

/////////// COMPROBAR ULTIMO PEDIDO Y SUMAR 1 PARA EL PROXIMO ////////////

 
function sacarMaxPed($Usuario, $conexion){
 $stmt1 = $conexion->prepare("SELECT MAX(ID_PED) AS MAXPED FROM PEDIDO WHERE COD_PER = :usuario");
 $stmt1->bindParam(':usuario', $Usuario);
 $stmt1->execute();
 
 while($reg1 = $stmt1->fetch()){
 	
   var_dump($reg1);
	 
   $_SESSION['MXPD'] = $reg1['MAXPED'];
   
   echo "<br>  Ultimo pedido: ". $_SESSION['MXPD'];
 
   $reg1 = $stmt1->fetch();
 }

}


 echo sacarMaxPed($_SESSION['usuarioLogueado'],$conexion);
 COMMIT;
$lastPed2 = $_SESSION['MXPD'] + 1;
echo "Ultimo pedido actualizado: ".$lastPed2;

/////////// CREAR NUEVO PEDIDO QUE SERÁ EL ULTIMO QUE HABIA +1 ////////////

	//if(isset($_SESSION['usuarioLogueado'])){
	
		$FechaActual=date("d\\/n\\/Y");
		echo "   Precio total: ".$_SESSION['precioTotal']." euros";

		function insertaPedido($ped,$fec,$total,$per,$conexion) {

                $stmt = $conexion -> prepare("INSERT INTO PEDIDO VALUES(:pedido,:FechaActual,:total, :persona)");
                $stmt->bindParam(':FechaActual', $fec);
                $stmt->bindParam(':total', $total);
                $stmt->bindParam(':persona', $per);
				$stmt->bindParam(':pedido', $ped);
                
                $stmt -> execute();
               
         
		}
			echo insertaPedido($lastPed2,$FechaActual,$_SESSION['precioTotal'],$_SESSION['usuarioLogueado'],$conexion);
			echo "<br>Se ha insertado correctamente el pedido!!!";
		//	}



/////////// INSERTA NUEVA LINEA DE PEDIDO EN EL PEDIDO CREADO ////////////

function sacarArticulo ($cantidad,$subtotal,$regart,$ultimoPedido,$conexion){
	$registros3 = $conexion->prepare("select * from ARTICULO");
	$registros3->execute();
	
	while($reg3 = $registros3->fetch()){
	echo "<br>variableeee: ".$_SESSION["Art".$reg3['ID_ART']];
 		if(isset($_SESSION["Art".$reg3['ID_ART']])){
 			    
			$cantidad = $_SESSION["Art".$reg3['ID_ART']];
			
			$regart = $reg3['ID_ART'];
			
			echo "<br>ID articulo: ".$regart;	
			$registros4 = $conexion->prepare("insert into LINEAS_PEDIDO values(:cantidad, :subtotal, :regart, :mx)");
			
				$registros4->bindParam(':subtotal', $subtotal);
				$registros4->bindParam(':regart', $regart);
				$registros4->bindParam(':cantidad', $cantidad);
				$registros4->bindParam(':mx', $ultimoPedido);
				
				$registros4->execute();
		
		}
	}
}
//echo sacarArticulo($cantidad,$subtotal,$regart,$conexion);
echo sacarArticulo($cantidad,$subtotal,$regart,$lastPed2,$conexion);

unset($_SESSION["Art".$_POST[ID_ARTICULO]]);

//session_destroy();

?>

Última edición por robe92; 18/08/2012 a las 16:04 Razón: añado codigo nuevo

Etiquetas: carrito
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:57.