下午好,我希望你可以帮我处理我的代码,我有四个小时的搜索时间,找不到错误,我正在进行交换,变量存储在一个会话中,问题是那个我每次添加,删除,删除或更新产品时都会清除$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
答案 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()移动到文档顶部一样简单。它应该在您的页面上发生任何其他事件之前调用,任何输出或标题集。
您是否在错误日志中看到了这一点的警告?