【问题标题】:Problem with 'fputcsv' repeating the same variable'fputcsv' 重复相同变量的问题
【发布时间】:2018-10-14 01:26:04
【问题描述】:

我一直试图将我的数组变量中的数据发送到 .txt 文件中。这些变量按预期工作,因为 iv 已经设法在用户可以选择的 3 种产品中进行编码,然后使用表单提交数量,它们都单独显示为电影名称和数量。但是当我似乎无法找到一种方法来 fputcsv 分别发送每部电影的电影名称和数量时,我只是重复每一行的最后一部电影和数量,然后当我提交下一部电影和数量时,它会覆盖最后一部电影一个。

我的购物车页面代码(没有显示所有代码,因为大多数是 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>

如果您想/需要查看任何其他代码,请告诉我,我会编辑我的帖子以包含它。感谢您花时间阅读。

【问题讨论】:

  • 您能解释一下业务流程是什么吗?看起来您正在将商品添加到购物车,但还将购物车保存到文本文件中。在这里而不是在结帐过程中这样做的目的是什么?每次将某些东西添加到购物车时,是否打算将购物车转储到文件中,并且该文件应始终代表购物车的状态?文件是在站点的所有用户之间共享,还是特定于会话的实际文件路径?我无法想象这将如何在现实世界中发挥作用。
  • 最上面的代码目前在 cart.php 页面中,但经过考虑后我决定将其移至 checkout.php (它们具有相同的数组代码,所以它不应该有太大变化只需要移动 fputscv 代码)。目的是让它将每个订单写入 txt 文件,如果它将每个用户订单写入该文件会很好,但只要它一次写入 1 个用户,现在就足够了。抱歉,我应该更详细地介绍

标签: php html arrays fputcsv


【解决方案1】:

这段代码中有很多小东西似乎是错误的,或者只是缺乏理解。有些可能是由于“示例”代码。

不管怎样,让我分块回顾一下。

<?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% 有信心的。您已经根据$_POST['movie_name'] 的值在上面创建了$movieName。我相信即使该值是一个空白字符串,您的isset() 也会返回true。无论哪种方式,结果仍然可以按预期工作。

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

如果逻辑合理,则以下行更改将删除无意义的 var 创建。

//$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);

【讨论】:

  • 这几乎就是我写的答案。我唯一要补充的是,您可能需要检查文件打开的模式——“w”将截断文件。如果要附加到现有文件,请使用“a”。
  • 我刚看完你的帖子,首先感谢你抽出时间回复这么详细。我还没有尝试过代码,但我想我至少可以回答你关于错误的一些问题。大多数错误都如您所说,它是由于只是使用示例代码并玩弄它们,直到我发现它适用于我的网站,有些只是因为我仍然在我的 IT 第一年,这些概念是新的对我来说,我一直无法理解其中的一些事情。再次感谢您的详细回复,我需要更多地研究这些主题。
猜你喜欢
  • 2020-08-29
  • 2018-06-10
  • 1970-01-01
  • 2011-12-19
  • 2021-05-18
  • 1970-01-01
  • 2012-12-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多