我无法保存通过get传递的会话变量

时间:2015-06-14 00:21:37

标签: javascript php mysql session-variables

下午好,我希望你可以帮我处理我的代码,我有四个小时的搜索时间,找不到错误,我正在进行交换,变量存储在一个会话中,问题是那个我每次添加,删除,删除或更新产品时都会清除$discount,我想推迟这个变量保持活跃状态​​。

这是我的代码:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Vender</title>
 <style>
    body {
        width: 80%;
        margin: 0 auto;
        padding: 20px;
    }
    table {
        width:100%;
        margin: 0 auto;
        border: 1px solid black;
        border-collapse: collapse;
        padding: 3px;
    }

    td {
        border: 1px solid black;
        border-collapse: collapse;
    }

    form {
        display: inline-block;
        margin-right: 10px;
        margin-bottom: 10px;
    }

    table {
        margin-bottom: 10px;
    }
 </style>
</head>
<body>
<?php
//INICIAMOS SESION
session_start();

//CONECTAMOS A LA DB
require ("config/conectar.php");

//CALCULAMOS DESCUENTO
$descuento = $_GET[descuento];
$des = $total-(($total*$descuento)/100);
$porcentaje = $total - $des;

//RECUPERAMOS VALORES DE LA URL
$product_id = $_GET[codigo];     //ID DE PRODUCTO
$accion     = $_GET[accion]; //ACCION


//SI EL PRODUCTO NO EXISTE MOSTRAMOS UNA ALERTA
    if($product_id && !productExists($product_id)) {
        die('<script type="text/javascript">alert("El producto no existe!");window.location.href="index-sin-estilos.php";</script>');
    }

//DECIDIMOS QUE HAREMOS
switch($accion) {
    case "agregar":
        $_SESSION['venta'][$product_id]++; //SUMAMOS UNO 
    break;

    case "restar":
        $_SESSION['venta'][$product_id]--; //RESTAMOS UNO
        if($_SESSION['venta'][$product_id] == 0) unset($_SESSION['venta'][$product_id]); //SI LA CANTIDAD LLEGA A CERO BORRAMOS PRODUCTO
    break;

    case "vaciar":
        unset($_SESSION['venta']); //DESTRUIMOS LA SESION Y BORRAMOS TODO 
    break;

    case "eliminar":
        unset($_SESSION['venta'][$product_id]); //BORRAMOS EL PRODUCTO SELECCIONADO
    break;

    case "idescuento":
        $_SESSION['venta'][$descuento]; //BORRAMOS EL PRODUCTO SELECCIONADO
    break;

}

//USAMOS SPRINTF PARA ASEGURARSE DE QUE $PRODUCT_ID SE INSERTA EN LA CONSULTA COMO UN NÚMERO - PARA EVITAR LA INYECCIÓN SQL
function productExists($product_id) {
        $sql = sprintf("SELECT * FROM productos WHERE codigo = %d;",
                        $product_id); 
        return mysql_num_rows(mysql_query($sql)) > 0;
}
?>

<form action="index-sin-estilos.php" method="GET">
    <input type="hidden" name="accion" value="agregar">
 <input style="width:150px;" type="text" name="codigo" placeholder="Codigo del producto" autocomplete="off" autofocus required>  
 <input type="submit" value="ENTER">
</form>

<form action="index-sin-estilos.php" method="GET">
    <input type="hidden" name="accion" value="idescuento">
 <input style="width:150px;" type="text" name="descuento" min="0" max="100" placeholder="0" value="<?php echo "$descuento"; ?>" autocomplete="off" required>  
 <input type="submit" value="ENTER">
</form>
<a style="float: right;" href="index-sin-estilos.php?accion=vaciar" onclick="return confirm('Estas seguro?');">Borrar todo</a>
<br>

<?php   

    if($_SESSION['venta']) {

        echo "<table>";
        echo '
        <tr>
            <td><b><center>Codigo</center></b></td>
            <td><b><center>Descripcion</center></b></td>
            <td><b><center>Precio</center></b></td>
            <td><b><center>Cantidad</center></b></td>
            <td><b><center>Importe</center></b></td>
        </tr>
    ';

            foreach($_SESSION['venta'] as $product_id => $quantity) {   

                $sql = sprintf("SELECT codigo, descripcion, venta FROM productos WHERE codigo = %d;",$product_id); 

                $result = mysql_query($sql);

                if(mysql_num_rows($result) > 0) {

                    list($codigo, $descripcion, $venta) = mysql_fetch_row($result);

                 //CALCULAMOS EL IMPORTE
                    $line_cost = $venta * $quantity;
                    //CALCULAMOS EL TOTAL
                    $total = $total + $line_cost;

                    //CALCULAMOS DESCUENTO
                    $descuento = $_GET[descuento];
                    $des = $total-(($total*$descuento)/100);
                    $porcentaje = $total - $des;

                    echo "<tr>";
                        //MOSTRAMOS LOS DATOS EN LA TABLA
                        echo "<td>$codigo</td>";
                        echo "<td>$descripcion</td>";
                        echo "<td align=right>$venta</td>";
                        echo "<td align=center>$quantity ( <a href=$_SERVER[PHP_SELF]?accion=restar&codigo=$product_id>-</a> / <a href=$_SERVER[PHP_SELF]?accion=agregar&codigo=$product_id>+</a> / <a href=$_SERVER[PHP_SELF]?accion=eliminar&codigo=$product_id>X</a>)</td>";
                        echo "<td align=right>$line_cost</td>";
                    echo "</tr>";

                }

            }

            echo "</table>";

            //MOSTRAMOS EL TOTAL
            echo "<table>";
                echo "<tr>";
                    echo "<td colspan=1 align=right><b>Sub-Total</b></td>";
                    echo "<td style='text-align: right;'><b>$total</b></td>";
                echo "</tr>";

                echo "<tr>";
                    echo "<td colspan=1 align=right><b>Descuento ($descuento%)</b></td>";
                    echo "<td style='text-align: right;'><b>$porcentaje</b></td>";
                echo "</tr>";

                echo "<tr>";
                    echo "<td colspan=1 align=right><b>Total</b></td>";
                    echo "<td style='text-align: right;'><b>$des</b></td>";
                echo "</tr>";
            echo "</table>";

    }else{
        //SI LA SESION ESTA VACIA MOSTRAMOS LO SIGUIENTE
        echo "AGREGA UN CODIGO PARA INICIAR";
    }
?>
</body>
</html>

非常感谢您提供给我的帮助...在代码中使用西班牙语单词的道歉,但我来自墨西哥。

在视频中显示另一个产品放弃折扣被删除。这就是我想要避免的...... http://youtu.be/QfjA-cUVL3Y

3 个答案:

答案 0 :(得分:3)

您应该更好地调试代码,问题可能不会来自$discounto变量。

我认为您计算折扣的公式不正确。

尝试此代码,看看这是否有所不同。如果它有效,我会解释。

    <!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Vender</title>
 <style>
    body {
        width: 80%;
        margin: 0 auto;
        padding: 20px;
    }
    table {
        width:100%;
        margin: 0 auto;
        border: 1px solid black;
        border-collapse: collapse;
        padding: 3px;
    }

    td {
        border: 1px solid black;
        border-collapse: collapse;
    }

    form {
        display: inline-block;
        margin-right: 10px;
        margin-bottom: 10px;
    }

    table {
        margin-bottom: 10px;
    }
 </style>
</head>
<body>
<?php
//INICIAMOS SESION
session_start();

//CONECTAMOS A LA DB
require 'config/conectar.php';


$total = 1000;

//CALCULAMOS DESCUENTO
$descuento = floatval($_GET['descuento']);

//RECUPERAMOS VALORES DE LA URL
$product_id = intval($_GET['codigo']);      //ID DE PRODUCTO
$accion     = trim($_GET['accion']);        //ACCION


$porcentaje = $total - (( $total * $descuento ) /100 );


//SI EL PRODUCTO NO EXISTE MOSTRAMOS UNA ALERTA
    if($product_id && !productExists($product_id)) {
        die('<script type="text/javascript">alert("El producto no existe!");window.location.href="index-sin-estilos.php";</script>');
    }

//DECIDIMOS QUE HAREMOS
$currentVal = 0;
if(isset($_SESSION['venta'][$product_id])){
    $currentVal = intval($_SESSION['venta'][$product_id]);
}
switch($accion) {
    case "agregar":
        $_SESSION['venta'][$product_id] = $currentVal + 1; //SUMAMOS UNO 
    break;

    case "restar":
        $_SESSION['venta'][$product_id] = $currentVal - 1; //RESTAMOS UNO
        if($_SESSION['venta'][$product_id] == 0){
            unset($_SESSION['venta'][$product_id]); //SI LA CANTIDAD LLEGA A CERO BORRAMOS PRODUCTO
        }
    break;

    case "vaciar":
        unset($_SESSION['venta']); //DESTRUIMOS LA SESION Y BORRAMOS TODO 
    break;

    case "eliminar":
        unset($_SESSION['venta'][$product_id]); //BORRAMOS EL PRODUCTO SELECCIONADO
    break;

    case "idescuento":
        $_SESSION['venta'][$descuento]; //BORRAMOS EL PRODUCTO SELECCIONADO
    break;

}

//USAMOS SPRINTF PARA ASEGURARSE DE QUE $PRODUCT_ID SE INSERTA EN LA CONSULTA COMO UN NÚMERO - PARA EVITAR LA INYECCIÓN SQL
function productExists($product_id) {
        $sql = sprintf("SELECT * FROM productos WHERE codigo = %d;",
                        $product_id); 
        return mysql_num_rows(mysql_query($sql)) > 0;
}
?>

<form action="index-sin-estilos.php" method="GET">
    <input type="hidden" name="accion" value="agregar">
 <input style="width:150px;" type="text" name="codigo" placeholder="Codigo del producto" autocomplete="off" autofocus required>  
 <input type="submit" value="ENTER">
</form>

<form action="index-sin-estilos.php" method="GET">
    <input type="hidden" name="accion" value="idescuento">
 <input style="width:150px;" type="text" name="descuento" min="0" max="100" placeholder="0" value="<?php echo "$descuento"; ?>" autocomplete="off" required>  
 <input type="submit" value="ENTER">
</form>
<a style="float: right;" href="index-sin-estilos.php?accion=vaciar" onclick="return confirm('Estas seguro?');">Borrar todo</a>
<br>

<?php   

    if(isset($_SESSION['venta']) ) {

        echo "<table>";
        echo '
        <tr>
            <td><b><center>Codigo</center></b></td>
            <td><b><center>Descripcion</center></b></td>
            <td><b><center>Precio</center></b></td>
            <td><b><center>Cantidad</center></b></td>
            <td><b><center>Importe</center></b></td>
        </tr>
    ';

            foreach($_SESSION['venta'] as $product_id => $quantity) {   

                $sql = sprintf("SELECT codigo, descripcion, venta FROM productos WHERE codigo = %d;",$product_id); 

                $result = mysql_query($sql);

                if(mysql_num_rows($result) > 0) {

                    list($codigo, $descripcion, $venta) = mysql_fetch_row($result);

                 //CALCULAMOS EL IMPORTE
                    $line_cost = $venta * $quantity;
                    //CALCULAMOS EL TOTAL
                    $total = $total + $line_cost;

                    //CALCULAMOS DESCUENTO
                    $descuento = $_GET[descuento];
                    $des = $total-(($total*$descuento)/100);
                    $porcentaje = $total - $des;

                    echo "<tr>";
                        //MOSTRAMOS LOS DATOS EN LA TABLA
                        echo "<td>$codigo</td>";
                        echo "<td>$descripcion</td>";
                        echo "<td align=\"right\">$venta</td>";
                        echo "<td align=\"center\">$quantity ( <a href=\"$_SERVER[PHP_SELF]?accion=restar&codigo=$product_id\">-</a> / <a href=\"$_SERVER[PHP_SELF]?accion=agregar&codigo=$product_id\">+</a> / <a href=\"$_SERVER[PHP_SELF]?accion=eliminar&codigo=$product_id\">X</a>)</td>";
                        echo "<td align=\"right\">$line_cost</td>";
                    echo "</tr>";

                }

            }

            echo "</table>";

            //MOSTRAMOS EL TOTAL
            echo "<table>";
                echo "<tr>";
                    echo "<td colspan=1 align=right><b>Sub-Total</b></td>";
                    echo "<td style='text-align: right;'><b>$total</b></td>";
                echo "</tr>";

                echo "<tr>";
                    echo "<td colspan=1 align=right><b>Descuento ($descuento %)</b></td>";
                    echo "<td style=\"text-align: right;\"><b>$porcentaje</b></td>";
                echo "</tr>";

                echo "<tr>";
                    echo '<td colspan="1" align="right"><b>Total</b></td>';
                    echo '<td style="text-align: right;"><b>'.$des.'</b></td>';
                echo "</tr>";
            echo "</table>";

    }else{
        //SI LA SESION ESTA VACIA MOSTRAMOS LO SIGUIENTE
        echo "AGREGA UN CODIGO PARA INICIAR";
    }
?>
</body>
</html>

答案 1 :(得分:1)

移动:

//INICIAMOS SESION
session_start();

到文档顶部:

<?php
    //INICIAMOS SESION
    session_start();
?>

所以你的文件应该以:

开头
<?php
    //INICIAMOS SESION
    session_start();
?>
<!DOCTYPE html>
<html>
<head>

希望这有帮助! :-D

答案 2 :(得分:0)

这可以像将session_start()移动到文档顶部一样简单。它应该在您的页面上发生任何其他事件之前调用,任何输出或标题集。

您是否在错误日志中看到了这一点的警告?