Ver Mensaje Individual
  #1 (permalink)  
Antiguo 15/03/2009, 17:20
parriman
 
Fecha de Ingreso: enero-2009
Ubicación: Valencia (España)
Mensajes: 29
Antigüedad: 15 años, 3 meses
Puntos: 1
Bueno, voy a exponer aquí un "problema" con un script php, que tras haber rebuscado por la red, HE VISTO QUE MUCHAS PERSONAS LO TIENEN, pero a nadie le han sabido dar una respuesta con el origen del problema.

Os adelanto que es una "adaptación" de una web de tienda online que anda por la red, que funciona teóricamente, pero que a la mayoría de las personas que les falla, lo hace en el mismo punto: modificando el carrito de la compra.

Supuestamente se puede modificar la cantidad ($qty) de cada producto, pero cuando lo hago, me aparece el siguiente error:

Warning: array_count_values() [function.array-count-values]: Can only count STRING and INTEGER values! in “ruta” on line 254

Esa linea, es esta: if($cart&&array_count_values($cart))

Y los valores del Array $cart, son, por poner un ejemplo (2010010 => 1 ; 2011012 =>1), donde la Key es la que identifica al producto, y el ´value' el numero de productos elegidos ($qty).

SI HE AÑADIDO TRES ELEMENTOS AL CARRO, Y PULSO EL BOTON DE CAMBIOS, ME SALE TRES VECES EL ERROR MENCIONADO...... Y si añado luego otro elemento al carro, me muestra solo un error al principio, y al mostrar el carro, me enseña el elemento añadido, y los que tenía antes del error, pero estos últimos, sin valor en el cuadro de texto $qty.

He hecho muchas pruebas, pero no sé que hacer más. También es cierto que no soy un experto de PHP, pero por eso os consulto...

LA MODIFICACIÓN QUE DEBE HACER EN UN ELEMENTO DEL ARRAY, la hace a todos..... Si modifico valores para hacer pruebas, me modifica TODOS los productos.......

Espero haberme explicado. Aquí os pongo primero el script que creo que genera el problema....

Código PHP:
if($save)
  {
      foreach (
$cart as $isbn => $qty)
    {
       if($
$isbn=="0")
        {unset(
$cart[$isbn]);
        }
       else
        {
$cart[$isbn] == $$isbn;}
}
    
    
$total_price calculate_price($cart);
    
$items calculate_items($cart);
    
  } 
POR DAR MAS DATOS, Si en el segundo $$isbn, pongo 25, al pulsar en cambios (sin modificar nada en las casillas), me pone el 25 en TODAS las casillas donde va la cantidad de productos comprados (donde teóricamente va $qty).


AHORA OS PONGO TODO EL CONJUNTO, QUE INCLUYE TAMBIÉN EL ANTERIOR SCRIPT

Código PHP:
<?
  
include ('book_sc_fns.php');
  
// El carrito de compra necesita sesiones, así que empezar una
  
session_start();

 
// recuperar categorías de la base de datos
 
 
$cat_array get_categories();  //recupera info de la DB por una function de otro archivo
 
 
if($new)
  {
    
//nuevo artículo seleccionado
    
if(!session_is_registered("cart"))
    {
      
$cart = array();
      
session_register("cart");
      
$items 0;
      
session_register("items");
      
$total_price "0.00";
      
session_register("total_price");
    }
    if(
$cart[$new])
      
$cart[$new]++;
    else
      
$cart[$new] = 1;
    
$total_price calculate_price($cart);
    
$items calculate_items($cart);
  }
  if(
$save)
  {
      foreach (
$cart as $isbn => $qty)
    {
       if($
$isbn=="0")
        {unset(
$cart[$isbn]);
        }
       else
        {
$cart[$isbn] == $$isbn;}
        }
    
$total_price calculate_price($cart);  //simplemente se da nuevamente valor a estas variables tras los cambios
    
$items calculate_items($cart);
      }
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Tu bolso de la compra</title>
<body>
  
  <div id="mainContent">
    
  
   <!-- ventana principal -->
    
   <?
   
       
if($cart&&array_count_values($cart))
      { 
      
      echo 
"<table><tr><td>&nbsp;</td></tr>";
      echo 
"<tr><td colspan = 5 align = center class=carro4><U>Estas han sido tus elecciones</b></td></tr></table>";

       
display_cart($cart); //abajo hay otro script con esta funcion
       
}
       else
       {
        echo 
"<tr>&nbsp;</tr>";    
        echo 
"<p>No hay artículos en tu bolso</p>";
        echo 
"<tr>&nbsp;</tr>";    
        }
       
$target "index.php";

      
// si hemos añadido un artículo al carro, continuar comprando en esa categoría
      
if($new)
      {
        
$details =  get_book_details($new);
         if(
$details["catid"])
         
$target "aqui un enlace”;
       }
         display_button($target, "
sigomirando", "Seguir mirando ropa");
         $path = $_SERVER['PHP_SELF'];
         $path = str_replace("
show_cart.php", "", $path);
         display_button("
aquí hay un enlace”)."login.php""hacerpedido""Comenzar tu pedido");
         echo 
"<p>&nbsp;</p>";
         echo 
"<p>&nbsp;</p>";
        }

?>    
    
  </div><!-- end #mainContent -->
  
    <br class="clearfloat" />
  
  <div id="footer">
  
   <?
   
  pie_pagina
()
  
  
?>
  <!-- end #footer --></div>
<!-- end #container --></div>
</body>
</html>
Aqui esta display_cart:


Código PHP:
function display_cart($cart$change true$images 1)
{
  
// display items in shopping cart
  // optionally allow changes (true or false)
  // optionally include images (1 - yes, 0 - no)

  
global $items;
  global 
$total_price;
  
  echo 
"<table border = 0 width = 95% cellpadding=3 cellspacing = 0>
        <form action = “Va a show_cart.php” method = post>
        <tr><th colspan = "
. (1+$images) ." bgcolor=\"#3333333\" class=carro1>Producto</th>
        <th bgcolor=\"#333333\" class=carro1>Precio</th><th bgcolor=\"#333333\" class=carro1>Cantidad</th>
        <th bgcolor=\"#333333\" class=carro1>Total</th></tr>"
;

  
//display each item as a table row
  
foreach ($cart as $isbn => $qty)
  {
    
$book get_book_details($isbn);
    echo 
"<tr>";
    if(
$images ==true)
    {
      echo 
"<td align = left>";
      if (
file_exists("ruta"))
      {
         
$size GetImageSize("ruta");
         if(
$size[0]>&& $size[1]>0)
         {
           echo 
"<img src=ruta" border=";
           echo "
width ". $size[0]/6 ." height " .$size[1]/6 . ">";
         }
      }
      else
         echo "
&nbsp;";
      echo "
</td>";
    }
    echo "
<th align left class=carro2>";
    echo "
<= ruta>".$book["producto"]." ".$book["color"]." ".$book["modelo"]."</a>";
    echo "
</td><th align center class=carro2>".number_format($book['precio'],2)." eu";
    echo "
</td><th align center class=carro2>";
    
    // si se permiten cambios, van en cajas de texto
    
    if ($change == true)
     {
      echo "
<input type 'text' name "$isbn\" value = '$qty' size=2>";
      }
    else
    {
      echo 
$qty;
    }
    echo 
"</td><th align = center class=carro2>".number_format($book["precio"]*$qty,2)." eu</td></tr>\n";
  }
  
// display total row
  
echo "<tr>
          <th colspan = "
. (2+$images) ." bgcolor=\"#dddddd\" class=carro2>&nbsp;</td>
          <th align = center bgcolor=\"#dddddd\" class=carro2>$items</th>
          <th align = center bgcolor=\"#dddddd\" class=carro2>"
.number_format($total_price2)." eu</th>
        </tr>"
;
  
// mostrar boton de guardar cambios
  
if($change == true)
  {
    echo 
"<tr>
             <td colspan = "
. (2+$images) .">&nbsp;</td>
            <td align = center>
               <input type = hidden name = save value = true>
               <input type = image src = ruta
                     border = 0 alt = \"Click aqui para modificar el contenido de tu bolso\">
                     <tr>&nbsp;</tr>
            </td>
            <td>&nbsp;</td>
            </tr>
            </tr>"
;
        }
  
  echo 
"</form></table>";
    

Bueno, si alguien puede ayudarme, LO AGRADECERÍA YO, y creo que bastante gente en toda la RED, que no consigue solucionar el problema, tambien.

Muchas Gracias a todos por vuestro tiempo.

Última edición por jam1138; 18/03/2009 a las 14:21