'fputcsv'重复相同变量的问题

时间:2018-10-14 01:26:05

标签: php html arrays fputcsv

我一直试图将数组变量中的数据发送到.txt文件中。变量已按预期方式工作,因为iv已成功编写了可供用户选择的3种产品的代码,然后使用表格提交了数量,并且它们都分别与电影名称和数量一起出现。但是,当我似乎找不到办法分别发送每个电影的电影名称和数量时,我只是重复每行的最后一个电影和数量,那么当我提交下一个电影和数量时,它会覆盖最后一个电影一个。

我在购物车页面上的代码(由于大多数代码都是css,因此未显示所有代码,if / else语句只是我拼命尝试至少使第二部电影的名字消失)

<?php
session_start();
?>
<?php
var_dump ($_POST);
if(!isset($_SESSION['cart'])) {
$_SESSION['cart']=[];
}
$cart = &$_SESSION['cart'];
$movieName = $_POST['movie_name'];
$quantity = $_POST['qty'];

if(isset($movieName)) {
$currentQuantity = $cart[$movieName];
$cart[$movieName] = $currentQuantity + $quantity;
} else {
$cart[$movieName] = $quantity;

}
var_dump($_SESSION);
?>

<?php
$list = array
(
"$movieName,$quantity",
"$movieName,$quantity",
"$movieName,$quantity",
);

$file = fopen("orders.txt","w");

foreach ($list as $line)
if ($movieName = 'Game of Thrones: Season 1') {

}
 else if ($movieName = 'Friends Season 1') {

  }
 else  if ($movieName = 'Inception') {

    }

  {
  fputcsv($file,explode(',',$line));
  }

fclose($file); ?>

提交数据的表单之一

<form action="cart.php" method="post">
<input type="hidden" name="movie_name" value= "Game of Thrones: Season 1" />
   <input type = "hidden" name = "id" value = "M01" />
   <br>

<div class="widthc">
   <button class="prod" id="minus">−</button>
<input type="number" name="qty" value="0" id="qty" min="0" max="15"/>
<button class="prod" id="plus">+</button>
<br><br>
<button class="prod" type="submit">  Submit</button>
</form>

如果您希望/需要查看其他任何代码,请让我知道,请修改我的帖子以包含它。感谢您抽出宝贵的时间阅读。

1 个答案:

答案 0 :(得分:2)

此代码中的许多小问题似乎是错误的,或者只是缺乏理解。有些可能是由于“样本”代码造成的。

无论哪种方式,让我逐一讨论。

<?php
session_start();
?>
<?php
var_dump ($_POST);

关闭并打开一个新的PHP块只是没有意义的。这可能是由于该问题的示例代码(或不是)。无论哪种方式都应该是:

<?php
session_start();

// debug
var_dump ($_POST);

下一块没有什么大不了的。我个人不喜欢它(即为一个已经存在的东西创建一个新的var,甚至带有引用),但每个人都有自己的个性。

if(! isset($_SESSION['cart'])) {
    $_SESSION['cart']=[];
}
$cart = &$_SESSION['cart'];
$movieName = $_POST['movie_name'];
$quantity = $_POST['qty'];

接下来的一点我不是100%自信的。您已经根据$movieName的值创建了$_POST['movie_name']。我相信即使该值是一个空字符串,您的isset()也会返回true。无论哪种方式,结果都仍然可以按预期工作。

if(isset($movieName)) {
    $currentQuantity = $cart[$movieName]; 
    $cart[$movieName] = $currentQuantity + $quantity;
} else {
    $cart[$movieName] = $quantity;
}

如果听上去好听,那么下面的行更改将删除无意义的变量。

//$currentQuantity = $cart[$movieName]; 
$cart[$movieName] += $quantity;

另一个可以打开和关闭的PHP块

var_dump($_SESSION);
?> 
<?php

现在是真正的问题。您正在创建具有重复元素的数组:

$list = array (
    "$movieName,$quantity",
    "$movieName,$quantity",
    "$movieName,$quantity",
);

上面的代码块将使数组中的3个元素具有相同的值-它们将是当前$movieName$quantity的所有相同值。

我认为您真正想做的事更像是:

foreach($_SESSION['cart'] as $k => $v) {
    if ($v > 0) {
         $list[] = array($k,$v);
    }
}

由于错误,下一部分很有趣。第一个问题是为什么要对变量名进行硬编码?

接下来的问题是,您真的要在=语句中使用==而不是if吗?

$file = fopen("orders.txt","w");

foreach ($list as $line) {
    if ($movieName = 'Game of Thrones: Season 1') {
        // do nothing? Really?
    } else if ($movieName = 'Friends Season 1') {
        // do nothing? Really?
    } else  if ($movieName = 'Inception') {
        // do nothing? Really?
    }
}

fputcsv($file,explode(',',$line));
fclose($file);

我认为您想要的更像是

// To overwrite, use 'w'
$fp = fopen('orders.csv', 'w');
// Or (as noted by Rob) to append to the file, use 'a'
//$fp = fopen('orders.csv', 'a');
// For other options see: http://php.net/manual/en/function.fopen.php

foreach ($list as $fields) {
    fputcsv($fp, $fields);
}

fclose($fp);