Проблема с повторением той же переменной в 'fputcsv' - PullRequest
0 голосов
/ 14 октября 2018

Я пытался отправить данные из переменных массива в файл .txt.Переменные работают так, как задумано, поскольку iv уже удалось кодировать 3 продукта, из которых пользователь может выбрать, затем использовать форму для отправки количества, и все они отображаются отдельно с названием фильма и количеством отдельно.Но когда я не могу понять, как fputcsv отправляет названия и количество фильмов для каждого фильма отдельно, я просто повторяю последний фильм и количество для каждой строки, а затем, когда я отправляю следующий фильм и количество, оно переопределяет последнийone.

Мой код для страницы корзины (не показывает весь код, так как большинство из них - css, операторы if / else просто отчаянно пытались хотя бы вывести 2-е название фильма)

<?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 голосов
/ 14 октября 2018

Так много мелочей в этом коде кажутся неправильными или просто не понимают.Некоторые могут быть из-за «образца» кода.

В любом случае, позвольте мне пройтись по нему кусками.

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

Закрытие и открытие нового блока PHP просто бессмысленно.Это может быть связано с примером кода для вопроса (или нет).В любом случае это должно быть просто:

<?php
session_start();

// debug
var_dump ($_POST);

Ничего действительно плохого в следующем фрагменте.Лично мне это не нравится (т.е. я создаю новую переменную для чего-то, что уже существует, даже со ссылкой), но для каждого из них.

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;
}

Если 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);
...