28106 sujets

CSS et mise en forme, CSS3

Bonjour à tous,
Merci pour votre accueil sur ce forum.
Mon problème est le suivant :
Mon formulaire php n'affiche pas mes checkbox bootstrap. Je ne peux donc pas enregistrer de données ni savoir si elles seront retenues dans ma bdd.
Voici mon formulaire :
<?php
include '../lib/includes.php';

/**
* La Sauvegarde
**/
if(isset($_POST['name']) && isset($_POST['slug'])){
	checkCsrf();
		$name = $db->quote($_POST['name']); 
		$tarif_id = $db->quote($_POST['tarif_id']);

		/**
		* SAUVEGARDE DE LA REALISATION
		**/

		if(isset($_GET['id'])){
			$id = $db->quote($_GET['id']);
			$db->query("UPDATE soirees SET name=$name, tarif_id=$tarif_id WHERE id=$id");
		}else{
			$db->query("INSERT INTO soirees SET name=$name, tarif_id=$tarif_id");
			$_GET['id'] = $db->lastInsertId();
		}
		setFlash('La soirée a bien été ajoutée.');

}

/**
* On récupère une réalisation
**/
if(isset($_GET['id'])){
	$id = $db->quote($_GET['id']);
	$select = $db->query("SELECT * FROM soirees WHERE id=$id");
	if($select->rowCount() == 0){
		setFlash("Il n'y a pas de soirée avec cet ID", "danger");
		header('Location:soiree.php');
		die();
	}
	$_POST = $select->fetch();
}

/**
* On récupère la liste des tarifs
**/
$select = $db->query('SELECT id, name FROM tarifs');
$tarifs = $select->fetchAll();
$tarifs_list = array();
foreach($tarifs as $tarif){
	$tarifs_list[$tarif['id']] = $tarif['name'];
}

include '../partials/admin_header.php';

?>

<h1>Editer une soirée</h1>
<div class="row">
	<div class="col-sm-8">
		<form action="#" method="post" enctype="multipart/form-data">
			<div class="form-group">
				<label for="name">Nom de la soirée :</label>
				<?= input("name"); ?>
			</div>
			<div class="form-group">
				<label for="tarif">Tarif :</label>
				<div class="checkbox">
					<label><?= checkbox("tarif_id", $tarifs_list); ?></label>
				</div>
  			</div>

			<?= csrfInput(); ?>
			
			<button type="submit" class="btn btn-default">Enregistrer</button>
		</form>

	</div>
</div>

<?php $script = ob_get_clean(); ?>

<?php include '../partials/footer.php'; ?>


Voici mon traitement :
<?php
function input($id){
	$value = isset($_POST[$id]) ? $_POST[$id] : '';
	return "<input type='text' class='form-control' id='$id' name='$id' value='$value'>";
}

function checkbox($id, $options = array()){
	$return = "<checkbox class='checkbox' id='$id' name='$id'>";
	foreach($options as $k => $v){
		$checkboxed = '';
		if(isset($_POST[$id]) && $k == $_POST[$id]){
			$checkboxed = 'checkboxed="checkboxed"';
		}
		$return .="<option value='$k' $checkboxed>$v</option>";
	}
	$return .='</checkbox>';
	return $return;
}


Les checkbox n'apparaissent pas. Je ne peux donc pas tester ce qui est envoyé en bdd.

Je vous remercie par avance pour votre bienveillance et votre aide.

Cordialement,
Cynthia
Merci Safina pour ta réponse !

J'utilise cette ligne qui t'a surprise
<label><?= checkbox("tarif_id", $tarifs_list); ?></label>
suite à un tutoriel. Ça fonctionne très bien par ailleurs (input ou select) Mais pour le checkbox, je ne comprends pas ce qui me manque pour que ça marche.

Merci pour les "checked" ! J'ai procédé aux modifications.

Cordialement,

Cynthia
Oui effectivement, cette ligne m'a surpris...

Peux tu nous indiquer le lien de ce tutoriel ?


Best regards,
Serge

Edite: Grilled
"euh... tuto ou pas, <checkbox> n'existe pas" Oui mais si elle modifie le DOCTYPE ^^ et qu'elle utilise du javascript en plus : ca tourne!
Modifié par Safina (13 Oct 2015 - 15:30)
Merci Jencal pour ta réponse. J'ai fait évoluer mon code en
function checkbox($id, $options = array()){
	$return = "<input type='checkbox' class='checkbox' id='$id' name='$id'>";
	foreach($options as $k => $v){
		$checked = '';
		if(isset($_POST[$id]) && $k == $_POST[$id]){
			$checked = 'checked="checked"';
		}
		$return .="<option value='$k' $checked>$v</option>";
	}
	$return .='</input>';
	return $return;
}


Le résultat n'est pas encore tout à fait là mais c'est mieux en effet ! Une seule checkbox apparaît et ne semble pas liée à la liste qu'elle doit retourner (ou non) à la bdd.

Merci pour ton aide.

Cordialement,

Cynthia
Merci Serge/Safina Smiley cligne

Voici le lien vers le tuto que j'ai suivi : https://www.youtube.com/watch?v=7KcQFceoxKM

Le checkbox n'y est pas développé. C'est moi qui en ai besoin par ailleurs.

J'ai fait évoluer mon code en ceci, suite à tes remarques (et celles de Jencal) :
function checkbox($id, $options = array()){
	$return = "<input type='checkbox' class='checkbox' id='$id' name='$id'>";
	foreach($options as $k => $v){
		$checked = '';
		if(isset($_POST[$id]) && $k == $_POST[$id]){
			$checked = 'checked="checked"';
		}
		$return .="<option value='$k' $checked>$v</option>";
	}
	$return .='</input>';
	return $return;
}


Une seule checkbox apparaît. Elle ne répercute pas le click dans la bdd.

Merci beaucoup pour ton aide.

Cordialement,

Cynthia
après fait gaffe :

$return = "<input type='checkbox' class='checkbox' id='$id' name='$id'>";


id='$id' doit être id=".$id."

$id c'est du php, tu dois le concaténer au html. et sa vaut pour tout tes appel de variable

pareil ici :
$return .="<option value='$k' $checked>$v</option>
";

'$k' ----> ".$k."

si c'est du string les simple quotes sont en dehors des doubles quotes.
Pendant que le tuto défile ... Je te propose un élément de réponse que je viens de codé à la volé.

function checkbox($id, $options = array()){
	$return = "";
	foreach($options as $k => $v){
		$checked = empty($_POST[$k]) ? '' : 'checked="checked"';
		$return .= "<input type='checkbox' class='checkbox' id='$id' name='$id' " . $checked . " />";
	}
	return $return;
}


Je pense que tu as raté quelque chose dans le fonctionnement d'un input de type checkbox.
Il faudrai que tu obtienne quelques chose de cette forme:

<label for="tarif_1">Tarif 1</label> : <input type="checkbox" id="tarif_1" name="tarif_1" />
<label for="tarif_2">Tarif 2</label> : <input type="checkbox" id="tarif_2" name="tarif_2" />
<label for="tarif_3">Tarif 3</label> : <input type="checkbox" id="tarif_2" name="tarif_3" />

C'est pourquoi la ligne suivante m'as surpri<s>e</s> Smiley cligne
<label><?= checkbox("tarif_id", $tarifs_list); ?></label>


@JENCAL:
$r = "<input type='checkbox' class='checkbox' id='$id' name='$id'>";// OK
$r = "<input type='checkbox' class='checkbox' id='".$id."' name='".$id."'>";// OK
$r = '<input type="checkbox" class="checkbox" id="'.$id.'" name="'.$id.'">';// OK - Best practice
$r = '<input type="checkbox" class="checkbox" id="$id" name="$id">';// ERROR $id n'est pas interprété
$r = <<<XXX
<input type="checkbox" class="checkbox" id="$id" name="$id">
XXX;// OK
$r = "<input type='checkbox' class='checkbox' id='{$id}' name='{$id}'>";//OK


edit: petite correction sur $_POST[$id] => $_POST[$k]
Modifié par Safina (13 Oct 2015 - 16:38)
Merci Serge,

Je viens de tester ton code. Deux checkbox apparaissent mais pas le choix en face. Je vais chercher dans ce sens.

Le tuto que je t'ai indiqué ne mentionne pas les checkbox (ne va pas jusqu'au bout, il est en 5 parties, assez longues). C'est parce que j'en ai besoin que je suis arrivée à vous...

Merci encore pour ton aide.

Cordialement,

Cynthia
Merci Jencal !

Ces précisions sont importantes. Ça ne change rien à mon affichage (toujours une checkbox en face de mon premier choix) ni à mon enregistrement en bdd.

Ça me donne pas mal de fil à retordre...

Merci encore pour ton aide.

Cordialement,

Cynthia
JENCAL je t'en prie Smiley biggrin

J'ai mis à jour mon dernier post avec d'autre façon de faire... Mais il en existe d'autre comme le printf("id='%s'", $id);
Tu n'as pas tords quand tu dis : "tu dois le concaténer au html. et sa vaut pour tout tes appel de variable " si ce n'est que "il est préférable" est plus approprié que "tu dois"

Cynthia1301, j'ai corrigé une erreur dans mon code.

Bon allé, moi je me sauve. Bonne aprem,
T'chüss
Modifié par Safina (13 Oct 2015 - 16:37)
Bonjour,

Merci encore pour votre aide Serge et Jencal !!!

Grâce à vos conseils, voici où j'en suis : mes checkbox apparaissent bien en face de mes options.
Voici le code :
function checkbox($id, $options = array()){
	$return = "";
	foreach($options as $k => $v){
		$checked = '';
		if(isset($_POST[$id]) && $k == $_POST[$id]){
			$checked = 'checked="checked"';
		}
		$return .="<input type='checkbox' class='checkbox' id='.$id.' name='$id'><option value='.$k.' $checked>$v</option>";
	}
	$return .='</input>';
	return $return;
}


Les données sont récupérées depuis la base de données. Elles sont générées par un premier formulaire.
Elles se répercutent dans la page d'un deuxième formulaire sous forme de checkbox. L'utilisateur fait son choix pour que seules les données sélectionnées se répercutent en front.

Il me reste donc à faire que ces liens (formulaire1 -> bdd ->formulaire2 ->bdd ->front) fonctionnent...

Merci encore pour votre aide précieuse !!!

Bien cordialement,

Cynthia
Bonjour à tous,
Pour ceux que ça intéresse. Je réussis maintenant à récupérer les données en bdd, à faire un choix parmi les checkbox et à renvoyer ce choix dans la bdd.

Page formulaire :
		<form action="soiree_edit_checkbox2.php" method="post" enctype="multipart/form-data">
			<div class="form-group">
				<label for="name">Nom de la soirée :</label>
				<?= input("name"); ?>				
			</div>
			<div class="form-group">
					<label for="tarif">Tarif :	</label>			
				<div class="checkbox">
					<?php foreach ($tarifs as $k =>$tarif): ?>
						<?php echo'<input type="checkbox" name="checkbox[]" value="'.$tarif['id'].'" />'.$tarif['name'].'
						<br />'; ?>
					<?php endforeach ?>
				</div>
  			</div>			
			<button type="submit" class="btn btn-default">Enregistrer</button>
		</form>


Le traitement :
/**
* On récupère la liste des tarifs
**/
$select = $db->query('SELECT id, name FROM tarifs');
$tarifs = $select->fetchAll();
$tarifs_list = array();
foreach($tarifs as $tarif){
	$tarifs_list[$tarif['id']] = $tarif['name'];
}

/**
*RECUPERATION DONNEES CHECKBOX POUR ENVOI MYSQL
**/
if(!empty($_POST['checkbox'])){
	$sql=implode(',',$_POST["checkbox"]);
	//$db->query("UPDATE soirees SET tarif_id='".$sql."'") ;
	}

/**
*ENREGISTREMENT DANS LA BDD
**/

	if(!empty($_POST['name'])){
		$name = $db->quote($_POST['name']);
		$theme_id = $db->quote($_POST['theme_id']);
		$datepicker = $db->quote($_POST['datepicker']);
		$content = $db->quote($_POST['content']);
		$db->query("INSERT INTO soirees SET name=$name, theme_id=$theme_id, datepicker=$datepicker, content=$content, tarif_id='".$sql."'");

						}


Merci encore pour votre aide !

Bonne journée !