8768 sujets

Développement web côté serveur, CMS

Bonjour,

J'ai pour projet d'améliorer un système de liste de course.

Actuellement, il me suffit de cocher un ou plusieurs checkbox, pour ensuite valider traditionnellement un bouton pour enregistrer tout cela en BDD.

J'aimerais, que lorsque l'on coche un checkbox, on rajoute deux champs, dont un de type "number" et l'autre de type "select" afin de définir la quantité et le type qui sera inséré sur la même ligne en BDD.
La partie JS permettant d'intégré ses champs sont déjà existant, et me permet aussi, en cas d'affichage, de les maintenir visibles.
Mon soucis, est que je n'arrives pas à récupérer les valeurs des champs "number" et "select" et les traiter, car, vu comment j'ai fais, si je vais un var_dump($_POST) ça m'affiche tous les champs rajoutés, même les vides (car je joue en JS sur le display:none ou inline).

Comment, puis-je procéder pour récupérer uniquement les valeurs sélectionnées pour les insérées en BDD (donc, Article (checkbox. Ceci est déjà réalisé) , la quantité (fournie par le champ de type "number" et le type (fourni par le champ "select") ?

Voici le code que j'ai actuellement. Je précise que ce n'est que le code usuel en question, et pas toutes mes pages.

Page qui liste les articles, avec les checkbox (qui eux sont opérationnels depuis longtemps) et les deux champs rajoutés via JS (possiblement améliorable si besoin, n'hésitez pas svp Smiley cligne )

<form action="" method="post">
<?php
$articles = recuperer_articles();
$shelf_id   	    = null;
$article_id   	    = null;
$listeOuverte		= false;
$sousListeOuverte	= false;
$nbl = count($articles);
	if($nbl == 0)
	{
    $listeHtml = <<<HTML
					<div class="alert border-bottom-danger text-center" role="alert">
						<span class="font-weight-bold font-weight-light">Il y'a aucun article enregistré.</span>
					</div>

HTML;
	}
	else
	{
    $listeHtml = <<<HTML
	<div class="card-columns">

HTML;
		
		foreach($articles as $v)
		{
			// $nbr = $i++;
			// On vérifie que l'article est le premier de la liste, SACHANT qu'on sait qu'il y 'en a.
			if ($shelf_id != $v['shelf_id'])
			{
				// Si la liste des menus est ouverte
				if(true === $listeOuverte)
				{
					// Si la liste des sous-menus est ouverte
					if (true === $sousListeOuverte)
					{
						// on la ferme la liste des sous-menus en définissant $sousListeOuverte sur FALSE
						$sousListeOuverte = false;
						// on ferme la balise </ul> de sousmenu
						$listeHtml .= <<<HTML
					</div>
				</div>
			</div>
		</div>

HTML;
					}
					//on la ferme la liste des menus en définissant $listeouverte sur FALSE
					$listeOuverte = false;
				}
				$listeHtml .=<<<HTML
		<div class="border-success">
			<div class="card card-widget mb-4 shadow-sm">
				<div class="card-header bg-success text-white text-center">{$v['shelf_name']}</div>
				<div class="card-body">
					<div class="form-group">
				
HTML;
				$shelf_id = $v['shelf_id'];
				$listeOuverte = true;
				//Si il y a des sousmenus
				if (!is_null($v['shelf_id']))
				{
					//on définit $souslisteouverte sur TRUE
					$sousListeOuverte = true;
				}
			}
			if (!is_null($v['shelf_id']))
			{
				$true = comparer_articles($v['article_id']);
				// var_dump($true);exit;
				$checked = ($true)?'checked="checked"':'';
				$display = ($true)?'style="display:inline;"':'style="display:none;"';
				$listeHtml .=<<<HTML
				<div class="form-check mb-3">
					<label class="form-check-label" >
						<input type="checkbox" class="form-check-input" name="articles[]" id="Check{$v['article_id']}" value="{$v['article_id']}" {$checked} onclick="affNumberCache('Number{$v['article_id']}');affTypeCache('Type{$v['article_id']}');">{$v['article_name']}
					</label>
					<div style="display:block;">
						<input type="number" name="count[{$v['article_id']}]" class="w-25 h-25 ml-1 form-control" id="Number{$v['article_id']}" {$display}>
						<select name="type[{$v['article_id']}]" class="w-25 h-25 ml-1 form-control" id="Type{$v['article_id']}" {$display}>
							<optgroup label="Type">
								<option value="pcs">Pièce(s)</option>
								<option value="grm">Gramme(s)</option>
								<option value="ltr">Litre(s)</option>
							</optgroup>
						</select>
					</div>
				</div>
				<script type="text/javascript">
					function affNumberCache(Number{$v['article_id']}) {
						var div = document.getElementById(Number{$v['article_id']});
						if (div.style.display == "inline"){
							div.style.display = "none";
						}
						else{
							div.style.display = "inline";
						}
					}
					function affTypeCache(Type{$v['article_id']}) {
						var div = document.getElementById(Type{$v['article_id']});
						if (div.style.display == "inline"){
							div.style.display = "none";
						}
						else{
							div.style.display = "inline";
						}
					}
				</script>
				
HTML;
			}
			
		}
		// si la liste de menu est ouverte
		if (true === $listeOuverte)
		{
			$listeHtml .= <<<HTML
				</div>
			</div>
		</div>
		</div>

HTML;
		}
			$listeHtml .= <<<HTML
	</div>

HTML;
	}
	echo $listeHtml;
?>
	<button type="submit" name="insert_articles" class="btn btn-success btn-small offset-md-10 mb-4"><i class="<?= $valid_icon ?>"></i> Enregistrer la liste</button>
</form>
<?php
}
?>


Page de traitement des données, avec mon var_dump, et le traitement des checkbox (uniquement eux, car tant que je n'arrives pas dans le var_dump à récupérer toutes les valeurs souhaitées, je ne modifierais pas l’insertion en BDD.)

if (isset($_POST['insert_articles'])){
	var_dump($_POST);exit();
	$articles = isset($_POST['articles'])?$_POST['articles']:null;
	if (!empty($articles)){
		$deletid=$cnx->prepare('TRUNCATE TABLE t_courses');
		try {
			$deletid->execute();
		}
		catch(PDOException $e){
			echo '<div id="alert" class="alert alert-error">
				Erreur : La requête à un problème, merci de contacter un administrateur ou le webmaster!
				</div>';
			exit;
		}
		$deletid->CloseCursor();
		$query = $cnx->prepare("INSERT INTO t_courses (article_id) VALUES (:article_id)");
		foreach($articles as $article_id)
		{
			$query->bindValue(':article_id',$article_id,PDO::PARAM_INT);
			$query->execute();
		}
		$query->CloseCursor();
		list_export_html();
		header('Location: ./index.php?p=courses');
	}else{
		$deletid=$cnx->prepare('TRUNCATE TABLE t_courses');
		try {
			$deletid->execute();
		}
		catch(PDOException $e){
			echo '<div id="alert" class="alert alert-error">
				Erreur : La requête à un problème, merci de contacter un administrateur ou le webmaster!
				</div>';
			exit;
		}
		$deletid->CloseCursor();
		list_export_html();
		header('Location: ./index.php?p=courses');
	}
}


Code SQL pour la table

CREATE TABLE IF NOT EXISTS `t_courses` (
  `courses_id` int(11) NOT NULL AUTO_INCREMENT,
  `article_id` int(11) DEFAULT NULL,
  `courses_number` int(11) NOT NULL DEFAULT '0',
  `courses_type` enum('pcs','g','l') NOT NULL DEFAULT 'pcs',
  `courses_statut` enum('0','1') NOT NULL DEFAULT '0',
  PRIMARY KEY (`courses_id`),
  KEY `article_id` (`article_id`),
  KEY `article_id_2` (`article_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


Je vous remercie d'avance, en espérant que tout est claire de ma part, et n'hésitez pas à me dire, si ce n'est pas le cas.

Bien cordialement.

EDIT: Voici une image du visuel que ça donne, pour peut être, mieux aider à comprendre le contexte et mon souhait.
upload/1598799576-48627-aidephp.png
Modifié par Fre3z69 (30 Aug 2020 - 17:00)
Modérateur
Et l'eau Fre3z69,

Désolé, mais ton code est difficilement lisible.
- tu mélanges php/js;
- tu utilises des styles en ligne;
- tu mélanges guillemets simples/doubles;
- ta syntaxe JS est douteuse;
- tes name dans tes champs sont obscures;
- tu utilises mal la syntaxe heredoc en php;
- etc.
Bonjour,

Merci pour ta réponse qui ne m'aide pas sur le problème mais soulève quand même des soucis. Voici pour ma part une partie de ses réponses je précise que je ne cherche pas a descriditer toute aide mais juste à tenter d'aller au plus vide sur l'aide pour mon problème. On verra l'optimisation si nécessaire je penses car gênant le script ou à la fin une fois le problème résolu mais j'ai conscience que le code là n'est pas propre.

Le code est pris sur une partie c'est pas toutes la page.
Le code heredoc est pas utilisé en vain, il me sert à traiter les données et ensuite les placer dans un certain ordre au sein de la page d'où les variables devant. C'est la meilleure solution pour garder l'indentation html dans le code source et ne pas me soucier de l'ordre de traitement. On a parfois besoin d'un résultat pour en traiter un autre. Bref...
Pour le JS avec php je rappel que c'est un test. Je le mets là pour le modifier rapidement. Puis dans le heredoc ça passe bien. Pour celui dans la page de traitement il sert à faire une redirection car le header php ne peut pas être placé si du code existe déjà hors c'est mon cas (je vais placer les traiments php dans une page inclue en premier après mes fichiers importants pour palier à ça mais ce n'est pas urgent.
Pour le js je ne m'y connais pas du tout. Donc normal si c'est bancale je n'utilise JS que pour rendre la navigation plus fluide mais on pourrait s'en passer logiquement.
Je ne comprends pas "des styles en ligne".
Pour les noms des champs c'est un test j'ai simplement rajouté l'id avec le nom et ce pour faire des tests c'est sûrement pas optimal mais j'ai tenté avant de venir poster j'ai pas remis le code au clair navré de cela.
Pour le mélange ' et " c'est sûrement posé vu que je test je n'ai pas fais attention mais logiquement à terme je n'utilise pas php les " vu que HTML utilise cela pour les attributs des balises.

Tout ça pour dire que finalement ça m'aide a optimiser tes commentaires et merci mais ça ne m'aide pas sur le problème rencontré. Puis c'est un projet personnel pour faire un script qui ne sera jamais sur internet mais qui va m'aider à comprendre certaines logiques dont celle d'ajouter des champs si on coche une checkbox et ensuite les traiter pour insertion en bdd.

Merci de ton temps et de ton aide je vais, en attendant une réponse sur Le problème, revoir le code pour éliminer ce dont tu m'as cité.

Cordialement.
Modifié par Fre3z69 (02 Sep 2020 - 14:23)
Modérateur
Comme je t'ai dit, ton code est illisible. En outre, regarde ceci :

<?php
    $products = [
        [
            "id" => 1,
            "name" => "eau gazeuse",
            "quantity" => 0
        ],
        [
            "id" => 2,
            "name" => "bicuit",
            "quantity" => 0
        ],
    ];

    if(!empty($_POST)){
        echo '<pre>';
        print_r($_POST);
        echo '</pre>';

        foreach ($products as $v) {
            $key_isset = sprintf('product_label_%s', $v['id']);
            $key_insert = sprintf('product_qte_%s', $v['id']);
            if(!empty($_POST[ $key_isset ]) && intval($_POST[ $key_isset ]) === 1){
                $sql = "
                    INSERT INTO
                        matable(quantity)
                    VALUES('".$_POST[ $key_insert ]."');
                ";
                echo $sql;
                echo '<br />';
                //etc.
            }
        }
        die;
    }
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <form action="<?= $_SERVER['PHP_SELF'] ?>" method="post">
        <?php foreach($products as $row): ?>
        <div class="input checkbox">
            <input type="checkbox" name="product_label_<?= $row['id'] ?>" value="<?= $row['id'] ?>" id="product_label_<?= $row['id'] ?>">
            <label for="product_label_<?= $row['id'] ?>"><?= $row['name'] ?></label>
        </div>
        <div class="input checkbox">
            <input type="number" name="product_qte_<?= $row['id'] ?>" value="<?= $row['quantity'] ?>" id="product_qte_<?= $row['id'] ?>">
        </div>
        <?php endforeach; ?>
        <div class="input submit">
            <button type="submit">envoyer</button>
        </div>
    </form>
</body>
</html>

Modifié par niuxe (04 Sep 2020 - 00:04)
Edit: J'ai réussi, ce message n'a plus lieux d'être, je vais mettre en résolu.

Un grand merci à toi!

Cordialement.
Modifié par Fre3z69 (06 Sep 2020 - 17:25)