Page 1 sur 1

php pdo : insertion multiple dans la base de données

Posté : 09 juin 2015, 17:55
par bob60
Je n'arrive pas à faire une insertion multiple dans la base de données.
Voici le code :
<?php

try
{
	$connexion_base_de_donnees = new PDO('coonexion à la base de données');
	$connexion_base_de_donnees->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING); 
	$connexion_base_de_donnees->exec('SET NAMES utf8');
}
catch (Exception $e)
{
	die(sprintf('%s dans %s &agrave; la ligne %d : %s', get_class($e), $e->getFile(), $e->getLine(), $e->getMessage()));
}

	$connexion = $connexion_base_de_donnees->prepare("SELECT id, nom_page, description, level FROM acces");

	$connexion->execute();

	 while ($valeurs = $connexion->fetch())
		{
		?>
		<tr>
			<td><?php echo $valeurs['nom_page']; ?></td>
			<td><?php echo $valeurs['description']; ?></td>
			<td><input type="checkbox" name="perm[<?php echo $valeurs['nom_page']; ?>][]" value="voir" /></td>
			<td><input type="checkbox" name="perm[<?php echo $valeurs['nom_page']; ?>][]" value="ajouter" /></td>
			<td><input type="checkbox" name="perm[<?php echo $valeurs['nom_page']; ?>][]" value="mettre_a_jour" /></td>
			<td><input type="checkbox" name="perm[<?php echo $valeurs['nom_page']; ?>][]" value="supprimer" /></td>
		</tr>
		
		<?php
		}
		
	
	if(isset($_POST['envoie']))
	{
		if (isset($_POST['perm']))
		{
			foreach($_POST['perm'] as $oui => $ok)
			{
				if (is_array($_POST['perm'][$oui]))
				{
					$ok = implode(', ', $ok);
				}
				
				
					
					$ajouter = $connexion_base_de_donnees->prepare("UPDATE acces SET level = :level WHERE id = :id");
					$ajouter->bindParam(':level', $a);
					$ajouter->bindParam(':id', $page_n);
			
					$ajouter->execute();
				
				
				
				 echo 'Vous avez choisit ' .$oui. ' pour valeur ' .$ok. ' et pour acces ' .$a. '<br />';
				
			}
		}
	}
		
		
		
$connexion_base_de_donnees = null;

Voici le résultat de la boucle while :
<form action="index.php" method="post">
	<table>
		<tr>
			<th rowspan="2">Pages</th>
			<th rowspan="2">Titre / Code / Nom</th>
			<th colspan="4" class="titre_tableau">Droits Attribués</th>
		</tr>
		<tr>
			<th class="sous_titre_tableau">Voir</th>
			<th class="sous_titre_tableau">Ajouter</th>
			<th class="sous_titre_tableau">Metrre à jour</th>
			<th class="sous_titre_tableau">Supprimer</th>
		</tr>
		
				<tr>
			<td>page1</td>
			<td>page numéro 1</td>
			<td><input type="checkbox" name="perm[page1][]" value="voir" /></td>
			<td><input type="checkbox" name="perm[page1][]" value="ajouter" /></td>
			<td><input type="checkbox" name="perm[page1][]" value="mettre_a_jour" /></td>
			<td><input type="checkbox" name="perm[page1][]" value="supprimer" /></td>
		</tr>
		
				<tr>
			<td>page2</td>
			<td>page numéro 2</td>
			<td><input type="checkbox" name="perm[page2][]" value="voir" /></td>
			<td><input type="checkbox" name="perm[page2][]" value="ajouter" /></td>
			<td><input type="checkbox" name="perm[page2][]" value="mettre_a_jour" /></td>
			<td><input type="checkbox" name="perm[page2][]" value="supprimer" /></td>
		</tr>
		
				<tr>
			<td>page3</td>
			<td>page numéro 3</td>
			<td><input type="checkbox" name="perm[page3][]" value="voir" /></td>
			<td><input type="checkbox" name="perm[page3][]" value="ajouter" /></td>
			<td><input type="checkbox" name="perm[page3][]" value="mettre_a_jour" /></td>
			<td><input type="checkbox" name="perm[page3][]" value="supprimer" /></td>
		</tr>
		
		Vous avez choisit page1 pour valeur voir et pour acces <br />Vous avez choisit page2 pour valeur voir et pour acces <br />Vous avez choisit page3 pour valeur voir et pour acces <br />		
	</table>
	
	<input type="submit" name="envoie" value="Envoyer" />
</form>
Structure de la base de données:
id nom_page
1 page1
2 page2
3 page3
Ce que je veux faire, c'est quand je clique sur un des checkbox de la page1, le resultat se retrouve avec l'id correspondant.
Actuellement quand je coche un des checkbox de la page1 et/ou page2 ça me renvoit toujours le résultat dans l'id 3

Re: php pdo : insertion multiple dans la base de données

Posté : 10 juin 2015, 08:57
par Ryle
Hello !

A priori je dirais que le problème vient de là :
$ajouter->bindParam(':id', $page_n);
$page_n ne correspond à rien dans ton code... peut être que cette variable a été utilisée précédemment et a conservé sa valeur... Ne serait-ce pas plutôt $oui que tu devrais utiliser ici ?

Re: php pdo : insertion multiple dans la base de données

Posté : 10 juin 2015, 17:18
par bob60
Normalement $page_n devrait corresponde aux id des pages.
Au niveau de la boucle while quand je fais cela :
$page_n = $valeurs['id'];
var_dump($page_n);
Le var_dump me ressort bien les id 1,2,3...

Par contre quand je l'utilise dans le foreach, var_dump($page_n); me ressort toujours le dernier id de la base de données.
J'ai aussi essayé un for pour $page_n = $valeurs['id']; il me sort aussi le dernier id

Voilà ce qu j'ai déjà essayé.

Re: php pdo : insertion multiple dans la base de données

Posté : 10 juin 2015, 17:32
par Ryle
Normalement $page_n devrait corresponde aux id des pages.
Ben c'est pas le cas dans le code que tu nous a montré plus haut... dans cette boucle, $page_n n'est pas définie ou modifiée à aucun moment pour prendre la valeur d'une autre page :
foreach($_POST['perm'] as $oui => $ok)
{
	if (is_array($_POST['perm'][$oui]))
	{
		$ok = implode(', ', $ok);
	}
				
			
	$ajouter = $connexion_base_de_donnees->prepare("UPDATE acces SET level = :level WHERE id = :id");
	$ajouter->bindParam(':level', $a);
	$ajouter->bindParam(':id', $page_n);

	$ajouter->execute();
			
	echo 'Vous avez choisit ' .$oui. ' pour valeur ' .$ok. ' et pour acces ' .$a. '<br />';
}
Ton code n'indique pas non plus à quoi correspond $a... difficile de savoir ce qu'elles contiennent ou pourquoi elles n'ont pas les bonnes valeurs. Elles sont donc définies quelque part ailleurs dans ton code, et gardent sans doute la dernière valeur qui leur a été affectée au lieu reprendre celles du formulaire :(

Re: php pdo : insertion multiple dans la base de données

Posté : 10 juin 2015, 17:46
par bob60
Voici le code pour $a :
function IsChecked($chkname,$name,$value)
    {
        if(!empty($_POST[$chkname][$name]))
        {
            foreach($_POST[$chkname][$name] as $chkval)
            {
                if($chkval == $value)
                {
                    return true;
                }
            }
        }
        return false;
    }

$v = [$oui];
$b = count($v);
for ($i=0; $i<$b; $i++)
{
$page = $v[$i];
}

/* si tout est coché $a = 15 */
if (IsChecked('perm',$page,'voir') && IsChecked('perm',$page,'ajouter') && IsChecked('perm',$page,'mettre_a_jour') && IsChecked('perm',$page,'supprimer'))
				{
					$a = 15;
				}
/* si voir, ajouter et mettre_a_jour sont coché $a = 14 */
if (IsChecked('perm',$page,'voir') && IsChecked('perm',$page,'ajouter') && IsChecked('perm',$page,'mettre_a_jour') && !IsChecked('perm',$page,'supprimer'))
				{
					$a = 14;
				}
/* si voir, ajouter et supprimer sont coché $a = 13 */
if (IsChecked('perm',$page,'voir') && IsChecked('perm',$page,'ajouter') && !IsChecked('perm',$page,'mettre_a_jour') && IsChecked('perm',$page,'supprimer'))
				{
					$a = 13;
				}
La variable $page_n ne contient rien dans le code car je n'arrive pas à lui attribuer les valeurs des id.
Si elle existe c'est parce que j'ai fait des essais manuellement : si $page_n = 1, dans la base de données, level = $a

Re: php pdo : insertion multiple dans la base de données

Posté : 10 juin 2015, 19:36
par Ryle
Ok... et est-ce que si tu fais cette modification ça ne fonctionne pas mieux :
$ajouter->bindParam(':level', $ok);
	$ajouter->bindParam(':id', $oui);

Re: php pdo : insertion multiple dans la base de données

Posté : 10 juin 2015, 19:57
par bob60
Non ça ne fonctionne pas mieux. Il y a aucune données qui s'enregistre dans la base.

Re: php pdo : insertion multiple dans la base de données

Posté : 10 juin 2015, 20:11
par bob60
Je viens de trouvé Ryle.

J'ai changé m'a requete préparé :
L'ancienne :
$ajouter = $connexion_base_de_donnees->prepare("UPDATE acces SET level = :level WHERE id = :id");
$ajouter->bindParam(':level', $a);
$ajouter->bindParam(':id', $page_n);
La nouvelle :
$ajouter = $connexion_base_de_donnees->prepare("UPDATE acces SET level = :level WHERE nom_page = :nom_page");
$ajouter->bindParam(':level', $a);
$ajouter->bindParam(':nom_page', $page);
Comme j'utilise déjà $page dans un for et dans ma fonction pour récupérer les checkbox cochés, je me suis dit pourquoi ne serait-ce pas plus simple d'utilisé nom_page dans ma requete préparé.
J'ai fait un essai est ca fonctionne.