'fputcsv' 重复相同变量的问题
Problem with 'fputcsv' repeating the same variable
我一直在尝试将数组变量中的数据发送到 .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>
如果您 want/need 要查看任何其他代码,请告诉我,我会编辑我的 post 以包含它。感谢您花时间阅读。
此代码中的许多细节似乎都是错误的,或者只是缺乏理解。有些可能是由于 "sample" 代码。
不管怎样,让我分块过一遍。
<?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()
也会 return true
。无论哪种方式,结果可能仍会按预期工作。
if(isset($movieName)) {
$currentQuantity = $cart[$movieName];
$cart[$movieName] = $currentQuantity + $quantity;
} else {
$cart[$movieName] = $quantity;
}
如果 lodgic 是正确的,则以下行更改将删除无意义的变量创建。
//$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);
我一直在尝试将数组变量中的数据发送到 .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>
如果您 want/need 要查看任何其他代码,请告诉我,我会编辑我的 post 以包含它。感谢您花时间阅读。
此代码中的许多细节似乎都是错误的,或者只是缺乏理解。有些可能是由于 "sample" 代码。
不管怎样,让我分块过一遍。
<?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()
也会 return true
。无论哪种方式,结果可能仍会按预期工作。
if(isset($movieName)) {
$currentQuantity = $cart[$movieName];
$cart[$movieName] = $currentQuantity + $quantity;
} else {
$cart[$movieName] = $quantity;
}
如果 lodgic 是正确的,则以下行更改将删除无意义的变量创建。
//$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);