IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Update d'une checkbox [MySQL]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de StephBretagne
    Femme Profil pro
    Inscrit en
    Mars 2012
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 147
    Par défaut Update d'une checkbox
    Bonjour à tous,

    Sur mon site de présentation de films documentaires, je propose aux administrateurs de saisir et d'éditer les docs via des formulaires qui contiennent, entre autres, des checkboxes qui prennent leurs informations dans la BDD.

    Ci-dessous les informations utiles à la construction d'une de ces checkboxes, celle concernant le format d'un doc.


    Tables :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    -- --------------------------------------------------------
    --
    -- Structure de la table documentaire 
    --
     
    CREATE TABLE IF NOT EXISTS documentaire (
      idDoc int (3) NOT NULL AUTO_INCREMENT, 
      ...
      CONSTRAINT pk_documentaire
    		PRIMARY KEY (idDoc),
      ...
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
     
    -- --------------------------------------------------------
    --
    -- Structure de la table formaDoc 
    --
     
    CREATE TABLE IF NOT EXISTS formaDoc (
      idFormDoc varchar(4) NOT NULL,
      nomFormDoc_fr varchar(255) NOT NULL,
      nomFormDoc_en varchar(255) NOT NULL,
      CONSTRAINT pk_formaDoc
    		PRIMARY KEY (idFormDoc)
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8;
     
    --
    -- Contenu de la table formaDoc
    --
     
    INSERT INTO formaDoc (idFormDoc, nomFormDoc_fr, nomFormDoc_en) VALUES
    ('fbsp' , 'Beta SP', 'Beta SP'),
    ('fbnu' , 'Beta numérique' , 'Digital betacam'),
    ('fthd' , 'THDVD' , 'THDVD'),
    ('fs16' , 'Super 16 mm' , 'Super 16 mm'),
    ('fv16' , 'Vidéo et 16 mm' , 'Video and 16 mm'),
    ('fdvc' , 'DV Cam' , 'DV Cam'),
    ('f16m' , '16 mm' , '16mm'),
    ('fhdc' , 'HD Cam' , 'HD Cam');
     
    --
    -- Structure de la table `docDisposeFormat`
    --
     
    CREATE TABLE IF NOT EXISTS `docDisposeFormat` (
      `idDoc` int(3) NOT NULL DEFAULT '0',
      `idFormDoc` varchar(4) NOT NULL DEFAULT '',
      PRIMARY KEY (`idDoc`,`idFormDoc`),
      KEY `fk_docDisposeFormat_idFormDoc` (`idFormDoc`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
     
    --
    -- Contenu de la table `docDisposeFormat`
    --
     
    INSERT INTO `docDisposeFormat` (`idDoc`, `idFormDoc`) VALUES
    (38, 'f16m'),
    ...
    (90, 'fbsp'),
    (90, 'fv16');
    php pour l'insert de la checkbox format :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    <?php
    // ***** récup checbox formaDoc ***** 	
    $idDocumentaire=mysql_insert_id(); // La valeur de l'index attribué au document.
     
    $choixFormaDoc=Array();
    if(isset($_POST['formaDoc'])) { // Envoie du formulaire...
    	$choixFormaDoc=$_POST['formaDoc'];
    	$sql="INSERT INTO docDisposeFormat (idDoc,idFormDoc) VALUES";
     
    	foreach($choixFormaDoc AS $choix) $sql.="(".$idDocumentaire.",'".$choix."'),"; // On enregistre chaque choix dans la table en indiquant l'idDoc du choix
    	if(mysql_query(substr($sql,0,strlen($sql)-1)))
    		echo "Enregistré!";
    	else echo "Non enregistré: (".$sql.") ".mysql_error();
    }
     
    function coche($val)
    { // Retourne checked si la valeur a été coché... :
    	global $choixFormaDoc;
    	return (in_array($val,$choixFormaDoc)?"checked":"");
    }
    et maintenant, le php qui ne fonctionne pas pour l'update de cette satanée checkbox :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    <?php
    // ***** update checkbox formaDoc ***** 
    $choixFormaDoc=Array();
    if(isset($_POST['formaDoc'])) { // Envoie du formulaire...
    	$choixFormaDoc=$_POST['formaDoc'];
    	//$idFormDoc=$_POST['idFormDoc'];
     
    	$sqlUpdateFormat=("
    	UPDATE docDisposeFormat SET
    	idDoc = '',
    	idFormDoc = ''
    	");
     
    	echo 'idDoc='.$idDoc.'<br/>';
     
    	foreach($choixFormaDoc AS $choix) $sqlUpdateFormat.="(".$idDoc.",'".$choix."'),"; // On enregistre chaque choix dans la table en indiquant l'idDoc du choix
    	if(mysql_query(substr($sqlUpdateFormat,0,strlen($sqlUpdateFormat)-1)))
    		echo "Enregistré!";
    	else echo "Non enregistré: (".$sqlUpdateFormat.") ".mysql_error();
    }
     
    function coche($val)
    { // Retourne checked si la valeur a été coché... :
    	global $choixFormaDoc;
    	return (in_array($val,$choixFormaDoc)?"checked":"");
    }
    Voici ce que ça m'affiche pour le doc 78 pour lequel j'ai coché les cases f16m et fs16 :
    idDoc=78
    Non enregistré: ( UPDATE docDisposeFormat SET idDoc = '', idFormDoc = '' (78,'f16m'),(78,'fs16'),) You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(78,'f16m'),(78,'fs16')' at line 4
    C'est donc manifestement la syntaxe de ma requête SQL qui merdouille...

    Merci d'avance de vos conseils.

  2. #2
    Membre expérimenté
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    152
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2003
    Messages : 152
    Par défaut
    Ca ne peut pas marcher pour 2 raison.

    1- la syntaxe de ton update est mauvaise
    2- on ne peut pas faire un update dans ton cas

    En effet un update se fait sur une ligne identifiable. Or dans ton cas, si j'ai bien tout suivi docDisposeFormat contient pour un même docs plusieurs couples (idDoc,idFormDoc)

    La meilleure solution que je vois sans y réfléchir plus de 30 secondes sera sur un update de supprimer les entrées correspondants à l'idDoc concerné, puis de ré-inserer les couple (idDoc,idFormDoc) à jour.

  3. #3
    Membre confirmé Avatar de StephBretagne
    Femme Profil pro
    Inscrit en
    Mars 2012
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 147
    Par défaut
    Merci pour ta réponse très complète Djibxav

    J'avais pas pensé à ton 2... mais bien sûr, tu as raison, ça ne pouvait pas marcher.

    Merci pour la solution qui fonctionne parfaitement
    (ça m'ennerve que certains mettent moins de 30 secondes pour trouver une solution à laquelle je n'avais pensé en plusieurs heures, ah ah ah )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    <?php
    // ************** update checkbox formaDoc **************** 
    // 1. suppression des anciens choix 
    $sqlDeleteFormat=mysql_query("
    DELETE FROM docDisposeFormat 
    WHERE idDoc = '".$idDoc."'
    ");
    if(!$sqlDeleteFormat) 
    	echo "Non enregistré: (".$sqlDeleteFormat.") ".mysql_error();
    else echo "enregistré";
     
    //2. insert des nouveaux choix 
    $choixFormaDoc=Array(); 
    if(isset($_POST['formaDoc'])){ // Envoie du formulaire...
    	$choixFormaDoc=$_POST['formaDoc'];
    	$sql="INSERT INTO docDisposeFormat (idDoc,idFormDoc) VALUES";
     
    	foreach($choixFormaDoc AS $choix) $sql.="(".$idDoc.",'".$choix."'),"; // On enregistre chaque choix dans la table en indiquant l'idDoc du choix
    	if(mysql_query(substr($sql,0,strlen($sql)-1)))
    		echo "Enregistré!";
    	else echo "Non enregistré: (".$sql.") ".mysql_error();
    }
     
    function coche($val) { // Retourne checked si la valeur a été coché... :
    	global $choixFormaDoc;
    	return (in_array($val,$choixFormaDoc)?"checked":"");
    }
    Encore merci et bonne soirée !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] Update d'une colonne avec valeur de checkbox
    Par Equinoxe5 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 14/04/2012, 08h34
  2. UPDATE d'une table avec test d'un champ d'une autre table
    Par delphim dans le forum Langage SQL
    Réponses: 2
    Dernier message: 03/05/2004, 12h30
  3. [struts] mémorisation d'une checkbox avec cookie
    Par rocco dans le forum Struts 1
    Réponses: 3
    Dernier message: 22/04/2004, 12h39
  4. update d'une colonne texte
    Par todd dans le forum Requêtes
    Réponses: 2
    Dernier message: 02/10/2003, 13h12
  5. Pb d'update dans une DataGrid
    Par bidson dans le forum XMLRAD
    Réponses: 11
    Dernier message: 27/05/2003, 14h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo