Ir para conteúdo
Fórum Script Brasil
  • 0

Meu PHP não recebe os dados do formulário e do input checkbox


santiagvs

Pergunta

Estou com uma aplicação PHP que lista, cadastra e também deleta múltiplos produtos. O problema é que a remoção dos produtos não está funcionando, pois o form não é enviado ao PHP (não chega na superglobal $_POST ou $_REQUEST). O que estou tentando fazer é que o id dos produtos seja enviado ao PHP para ser tratado no controller para fazer a remoção em massa dos produtos selecionados. O que acontece é que quando faço o submit do form, o log do php -S mostra que fez uma request, com o código 302. Daí nenhum dado é enviado.

Olhando na aba Network do navegador lá no Inspecionar Elemento, o payload mostra que até consegue selecionar os ids dos respectivos inputs checkbox, porém não são enviados ao PHP.


products-list.php:
 

<?php
  $this->layout('layout');
?><header class="bg-dark">
    <nav class="navbar">
      <h1 id="page_name"><a href="/">Product List<span>.</span></a></h1>
      <ul class="navbar-nav flex-row">
        <li class="nav-item">
          <a id="product_adder" class="nav-link" href="/add-product">Add product</a>
        </li>
        <li class="nav-item">
          <button
            class="btn btn-danger"
            id="submit-button"
            form="delete_form"
            >
            Mass Delete
          </button>
        </li>
      </ul>
    </nav>
  </header>

<main>
  <form action="" id="delete_form" method="POST" enctype="multipart/form-data">
    <div class="row w-100 mx-0 justify-content-center">
      <?php foreach($productList as $product): ?>
        <div class="card mx-2 mt-3" style="width: 18rem;">
          <div class="card-body mt">
            <input type="checkbox" name="deleteId[]" value=<?= $product['id'];?> >
            <ul class="list-group list-group-flush">
              <li class="list-group-item text-center"><?= $product['sku']; ?></li>
              <li class="list-group-item text-center"><?= $product['name']; ?></li>
              <li class="list-group-item text-center"><?= $product['price']; ?></li>
              <li class="list-group-item text-center"><?= $product['attribute']; ?></li>
            </ul>
          </div>
        </div>
      <?php endforeach; ?>
    </div>
  </form>
</main>

 

script.js (para fazer o envio do form) :

 

$(function () {
  selectInputCheckboxValues();
});

function selectInputCheckboxValues() {
  $("#delete_form").submit(function (event) {
    event.preventDefault();

    const options = [];
    $("input[type='checkbox']:checked").each(function () {
      options.push($(this).val());
    });

    const optionsChecked = options;
    console.log(optionsChecked);

    $.ajax({
      url: "/delete",
      type: "POST",
      data: { deleteId: optionsChecked },
      success: function (response) {
        console.log(response);
      },
    });
  });
}


index.php:

 

<?php

require_once __DIR__ . '/../vendor/autoload.php';

$config = require_once __DIR__ . '/../credentials.php';

$routes = require_once __DIR__ . '/../config/routes.php';

/** @var \Psr\Container\ContainerInterface $diContainer */

$diContainer = require_once __DIR__ . '/../config/dependencies.php';

$pathInfo = $_SERVER['PATH_INFO'] ?? '/';
$httpMethod = $_SERVER['REQUEST_METHOD'];

$key = "$httpMethod|$pathInfo";

if (array_key_exists($key, $routes)) {
  $controllerClass = $routes[$key];

  $controller = $diContainer->get($controllerClass);
}

$psr17Factory = new \Nyholm\Psr7\Factory\Psr17Factory();

$creator = new \Nyholm\Psr7Server\ServerRequestCreator(
    $psr17Factory, // ServerRequestFactory
    $psr17Factory, // UriFactory
    $psr17Factory, // UploadedFileFactory
    $psr17Factory  // StreamFactory
);

$request = $creator->fromGlobals();

$response = $controller->handle($request);

http_response_code($response->getStatusCode());
foreach ($response->getHeaders() as $name => $values) {
    foreach ($values as $value) {
        header (sprintf('%s: %s', $name, $value), false);
    }
}

echo $response->getBody();

routes.php:

 

<?php

use App\Product\Controller\{
  ListProductController,
  ProductFormController,
  NewProductController,
  DeleteProductController,
};

return [
  'GET|/' => ListProductController::class,
  'GET|/add-product' => ProductFormController::class,
  'POST|/add-product' => NewProductController::class,
  'POST|/delete' => DeleteProductController::class,
];

 

Link para o comentário
Compartilhar em outros sites

6 respostass a esta questão

Posts Recomendados

  • 0

Copiei todo o repositório no meu notebook.

Como ele parece com o Laravel, tentei executar php artisan serve, e recebi a mensagem que não dava para abrir.

Então usei o navegador: localhost/astudy/public/index e ai apareceu um monte de mensagem afirmando que está faltando os arquivos da pasta vendor.

Agora fiquei curioso: como você executa o código no seu micro?

Link para o comentário
Compartilhar em outros sites

  • 0
1 hora atrás, Frank K Hosaka disse:

Agora fiquei curioso: como você executa o código no seu micro?

Não uso Artisan nem uso o XAMPP, e esse código é PHP puro, sem frameworks. Simplesmente rodo `php -S 0.0.0.0:8080 -t public/` pra subir o server do PHP e funciona.

Ah, recomendo dar um git pull no código aí. Subi algumas coisas que estavam faltando.

Editado por santiagvs
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,5k
×
×
  • Criar Novo...