Page 1 sur 1

update sql avec case à cocher

Posté : 17 févr. 2014, 16:34
par cris84
Bonjour à tous,
j'ai un souci avec l'update de ma table avec checkbox, j'ai une erreur que je n'arrive pas à résoudre :
Warning: Invalid argument supplied for foreach()....../admin_membres_valide.php on line 26

Je vous joins les deux codes correspondants .
Merci de votre aide...
voici celui du formulaire :
<?php
 $reponse = mysql_query('SELECT * FROM '.$prefix.'membres WHERE valide="0"') or die(mysql_error()); 
 if ($donnees = mysql_fetch_array($reponse))
{


?>
<form method='POST' action='admin_membres_valide.php'>
<?php
$_SESSION['pseudo'] = $donnees['pseudo'];
$_SESSION['email'] = $donnees['email'];
 	?>
<table width="100%" border="1">
<tr>
<td width='18%'><div align="center">Date d'inscription </div></td>
<td width='20%'><div align="center">pseudo</div></td>
<td width='18%'><div align="center">email</div></td>
<td width='10%'>Valider / <a href="admin_modifier_profil.php?id=<?php echo $donnees['id']; ?>">Modifier</a> </td>
<tr><td><?php echo date('d/m/Y', $donnees['date_inscription']); ?></td>

  <td><a href="profil.php?id=<?php echo $donnees['id']; ?>"><?php echo $donnees['pseudo']; ?></a></td>
<td><?php echo $donnees['email']; ?></td>
<td><input type='checkbox' name='update[]' value="<?php echo $donnees['id'] ; ?>" /></tr>
</table>
<div align="right"><input accesskey="S" name="valider" value="valider" type="submit"></div><br />


</form>

<?php 
}
else
{
echo '<h8>Il n\'y a plus de membre à valider</h8><p>';
}
?>
Et celui de la validation :
<?php

	$update = isset($_POST['update']) ? $_POST['update'] : array(); 
	$id = isset($_POST['id']) ? $_POST['id'] : array();
	
		if (sizeof($update)==0){
echo '<div class="alert alert-error">Vous n\'avez pas selectionné de membre à valider !</div>';
echo'<p>';
echo'<a href="admin_validation_membres.php">Retour à la validation des membres</a>';
exit;
}
else
{

foreach ($_POST['update'] as $id){
$sql='UPDATE membres SET valide="1" WHERE membres.id='.$id;
}
?>

Re: update sql avec case à cocher

Posté : 17 févr. 2014, 18:25
par moogli
salut,

le message d'erreur indique que $_POST['update'] n'est pas un tableau (tu n'as pas coché la case ?)

au vu de ton code pourquoi utiliser une tableau ? Et même pourquoi ramener x lignes de résultats depuis la base de donnée pour n'en traiter qu'un seul ?

je pense que tu as oublié une boucle (while généralement) pour l'affichage des checkbox).

@+

Re: update sql avec case à cocher

Posté : 17 févr. 2014, 19:48
par cris84
J'utilise un tableau pas pure esthétique, et if au lieu de while simplement par confort, validation un par un.

J'ai bien coché la case, car l'erreur est gérée par ceci :
<?php
if (sizeof($update)==0){
echo '<div class="alert alert-error">Vous n\'avez pas selectionné de membre à valider !</div>';
echo'<p>'; ?>
j'ai rajouté print_r($_POST);

voici le message retourné : Array ( [update] => Array [valider] => valider )

merci encore de votre aide :D

Re: update sql avec case à cocher

Posté : 17 févr. 2014, 22:00
par moogli
Tu contre dit le message d'erreur de ton 1er message ....

Re: update sql avec case à cocher

Posté : 18 févr. 2014, 05:25
par cris84
j'avoue que je m'y perds.
En t'autres termes ça veut dire quoi ?

Re: update sql avec case à cocher

Posté : 18 févr. 2014, 08:05
par moogli
Le message indique qu'au moment du foreach $_POST['update'] n'est pas un tableau.

Le print_r($_POST); tu l'as mis avant le if ?


@+

Re: update sql avec case à cocher

Posté : 18 févr. 2014, 17:36
par cris84
Bonjour,
oui de cette manière :
<?php
$update = isset($_POST['update']) ? $_POST['update'] : array(); 
	$id = isset($_POST['id']) ? $_POST['id'] : array();
	print_r($_POST);
		if (sizeof($update)==0){
echo '<div class="alert alert-error">Vous n\'avez pas selectionné de membre à valider !</div>';
echo'<p>';
echo'<a href="admin_validation_membres.php">Retour à la validation des membres</a>';
exit; ?>
et voici le résultat : Array ( [update] => valider )
Warning: Invalid argument supplied for foreach() in /homepages.......admin_membres_valide.php on line 26

Re: update sql avec case à cocher

Posté : 18 févr. 2014, 18:14
par moogli
ben voila php a toujours raison :)

si tu nous donne le code complet (et pas des brides) on y verras plus clair.
masque seulement les données de connexions que tu peux utiliser (sgbd etc etc).

@+

Re: update sql avec case à cocher

Posté : 18 févr. 2014, 19:19
par cris84
Oui je l'ai pas remis car c'est le même que plus haut en ajoutant simplement print_r

merci encore
<?php

	$update = isset($_POST['update']) ? $_POST['update'] : array(); 
	$id = isset($_POST['id']) ? $_POST['id'] : array();
	print_r($_POST);
		if (sizeof($update)==0){
echo '<div class="alert alert-error">Vous n\'avez pas selectionné de membre à valider !</div>';
echo'<p>';
echo'<a href="admin_validation_membres.php">Retour à la validation des membres</a>';
exit;
}
else
{

foreach ($update as $id){
$sql='UPDATE membres SET valide="1" WHERE membres.id='.$id;

echo '<div class="alert alert-success">Le membre a bien été validé</div><p><a href="admin_validation_membres.php">Retour à la validation des membres</a>';
$req= mysql_query($sql);
}
 ?>

Re: update sql avec case à cocher

Posté : 18 févr. 2014, 23:17
par moogli
Warning: Invalid argument supplied for foreach() in /homepages.......admin_membres_valide.php on line 26
y a 20 lignes dans le code que tu fournis, je conclus donc que :
- soit tu ne fournit pas le code complet
- soit ce n'est pas le bon code.

voila comment tu peux faire (note l'utilisation de mysqli plutôt que mysql qui est dépréciée et vouée à la suppression dans une future version)
<?php
//connexion mysql
$conn = mysqli_connect('localhost', 'user', 'password', 'la base');

if (!empty($_POST['update']) && is_array($_POST['update']) && count($_POST['update']) > 0) {
    // utilise mysqli_real_escape_string  http://fr2.php.net/manual/fr/mysqli.real-escape-string.php
    // sinon tu t'expose à une faille type injection sql
    $sql = 'UPDATE membres SET valide=1 WHERE membres.id in(' . implode(',', $_POST['update']) . ')';

    $ret = mysqli_query($conn, $sql);
    if ($ret !== false) {
        // erreur
        $err = mysqli_error($conn);
    }
}
?>
<!Doctype html>
<html>
<head>
    <title>Validation membre</title>
</head>
<body>
<h1>Liste des membres à valider</h1>
<?php
if (!empty($err)) {
    // affiche un beau qui va bien pour les gens
    echo $err;
}
?>
<form method="post" action="">
    <table>
        <thead>
        <tr>
            <th>Pseudo</th>
            <th>Email</th>
            <th>Date d'inscription</th>
            <th>profil</th>
            <th>Modifier</th>
            <th>Valider</th>
        </tr>
        </thead>
        <tbody>
        <?php
        $sql = 'select id,date_inscription,pseudo, email from membres where valide=0';
        $result = mysqli_query($conn, $sql);
        while ($data = mysqli_fetch_array($result)) {
            echo '<tr>';
            echo '<td>', $data['pseudo'], '</td>';
            echo '<td>', $data['email'], '</td>';
            echo '<td>', date('d/m/Y', $data['date_inscription']), '</td>';
            echo '<td><a href="profil.php?id=', $data['id'], '">Voir le profil</a></td>';
            echo '<td><a href="admin_modifier_profil.php?id=', $data['id'], '">Modifier le profil</a></td>';
            echo '<td><input type="checkbox" name="update[]" value="', $data['id'], '"</td>';
            echo '<td></td>';
            echo '</tr>';
        }
        mysqli_free_result($result);
        mysqli_close($conn);
        ?>
        </tbody>
    </table>
    <input type="submit" name="validation" value="Valider"/>
</form>
</body>
</html>
@+

Re: update sql avec case à cocher

Posté : 19 févr. 2014, 22:08
par cris84
Ah oui effectivement tout fonctionne...
J'ai adapté le code avec l'erreur si la ou les cases ne sont pas cochées :
<?php 
if (empty($_POST['update'])) {
echo'<p><div class="alert alert-error">Vous n\'avez pas cochez de case !</div><p><a href="admin_validation_membres.php">Retour à la validation des membres</a></div>';
?>
Un grand merci pour votre aide toujours précieuse pour avancer quand on est débutant =D>