PHP получить значение флажка через запятую - PullRequest
0 голосов
/ 08 мая 2018

У меня есть контактная форма с парой флажков. Всякий раз, когда я отправляю форму, я хочу, чтобы выбранные значения печатались через запятую.

<form  method="POST">
  <input type="checkbox" id="product1" name="product1" value="12">
  <input type="checkbox" id="product2" name="product1" value="13">
  <input type="checkbox" id="product3" name="product1" value="14">
  <button type="submit">Subscribe</button>
</form>

Я использую эту форму. Допустим, продукт 1 и 2 выбран. Тогда следует напечатать 12,13 < Каков наилучший способ сделать это? Это вообще возможно?

Спасибо заранее.

ИСПОЛЬЗОВАНИЕ:

Так что я подумал, что полезно написать, зачем мне это нужно.

Позже, когда я смогу получить значения, я сделаю что-то вроде этого:

header("Location: http://test.com/$myvalues");

Таким образом, эта ссылка может быть test.com/12,13 после того, как пользователь отправит форму.

Не работает:

Так что я использую этот код

<?php
  if(isset($_POST['product'])){
    $values =  implode(',',$_POST['product']);
    // header("Location: https://test.com/?add-to-cart=$values");
  }
  ?>

Всякий раз, когда я нажимаю кнопку отправки, я перехожу на страницу, которая не существует. Так что я получаю страницу 404. Даже с заголовком местоположение закомментировано. Местоположение заголовка, кажется, не работает вообще.

Ответы [ 3 ]

0 голосов
/ 08 мая 2018
<form  method="POST" action="upload.php" >
  <input type="checkbox" id="product1" name="product[]" value="12">
  <input type="checkbox" id="product2" name="product[]" value="13">
  <input type="checkbox" id="product3" name="product[]" value="14">
  <button type="submit" name="products" >Subscribe</button>
</form>

в upload.php

$a=$_POST['product'];
$prodt=implode(',',$a);

$ prodt имеет значение

0 голосов
/ 08 мая 2018

Чтобы объединить ответ от Alive to Die и комментарии о XSS от hanshenrik;

Использовать массивоподобный синтаксис в атрибуте имени входа:

<form method="POST">
  <input type="checkbox" id="product1" name="product[]" value="12">
  <input type="checkbox" id="product2" name="product[]" value="13">
  <input type="checkbox" id="product3" name="product[]" value="14">
  <button type="submit">Subscribe</button>
</form>

Если вы отметите первые два флажка и отправите заявку, вы должны получить:
$POST['product'] == ["12", "13"];

Конечно, любой ввод должен быть проверен и экранирован перед выводом в ответе. Для конкретного случая использования, который вы упомянули, вы получите что-то вроде этого:

$products = [];
if (isset($POST['product'])) {
    foreach ($POST['product'] as $product) {
        if (!is_numeric($product)) {
            die("invalid product value.");
        }
        $products[] = intval($product);
    }
}

if (empty($products)) {
    die("no products selected.");
}

header("Location: https://test.com/" . implode(",", $products);

Разъяснение по подтверждению ввода:

Если вы пропустите проверку ввода, можно будет предоставить следующие данные: product[]="admin.php" и получите перенаправление на https://test.com/admin.php. Конечно, это не то, что вы хотели, чтобы этот сценарий делал, поэтому одним только этим принципом вы должны рассмотреть возможность ограничения возможного поведения вашего кода. Но могло быть и хуже:

Если вы решите echo implode(",", $POST['product']) где-то на вашем сайте, кто-то может отправить: product[]="<script>alert(\"vuln\");</script>", который добавит JavaScript на ваш сайт. Предупреждение не опасно, но этот сценарий может быть чем угодно. От отправки ваших сеансовых куки до запуска криптоминера в вашем браузере. В принципе, если вы можете alert(), вы можете делать что угодно.

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

Это много «если», и для простого локального веб-сайта или сценария PHP вам не нужно беспокоиться о большинстве этих проблем. Однако, если вы решите сделать любой свой код доступным для Интернета, вы никогда не должны доверять вводу пользователя.

0 голосов
/ 08 мая 2018

Поскольку вы присвоили каждому флажку один и тот же атрибут name, вы не можете. Дайте им отдельные имена, и вы легко сможете работать с этим клиентом и / или сервером.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...