Forum |  HardWare.fr | News | Articles | PC | Prix | S'identifier | S'inscrire | Aide | Shop Recherche
1851 connectés 

  FORUM HardWare.fr
  Programmation
  Javascript/Node.js

  Ajout nouveau module+sauvegarde en BD

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Précédente
Auteur Sujet :

Ajout nouveau module+sauvegarde en BD

n°2304261
mecano31
Posté le 08-08-2017 à 17:50:21  profilanswer
 

Bonjour à tous,
 
Je suis en train de réaliser un système d'édition de newsletter en ligne. J'aurais la possibilité de rajouter des nouveaux modules, les supprimer, gérer l'ordre des éléments et les sauvegarder. J'ai deux blocs : bloc_1 et bloc_2. Le bloc_1 contient les modules à ajouter au bloc_2. Le bloc_2 contient l'ensemble des modules : les anciens et les nouveaux. J'ai la possibilité d'organiser mes modules (blocs) et les sauvegarder dans le bloc_2. Le bloc menu sert d'affichage des éléments sous forme d'image en miniature. Le bloc dropdown affiche l'élément au survole correspondant au module.
 
Je mets un lien qui illustre ce que je souhaiterais faire : [url] https://topol.io/editor/5984cdb91dc32/edit[/url]. Dans ce lien c'est par glisser-déposer pour ajouter un élément mais dans mon cas l'élément est ajouté lorsqu'on le survole et clique sur "Insert".
 
Pour l'insertion d'un nouveau module (DIV) ça marche, la réorganisation (glisser-déplacer) marche aussi. Le problème c'est quand je rajoute un nouveau module je ne pourrai pas le sauvegarder. Pour infos mes modules sont enregistrés en base de données mais ils n'ont pas la même constitution des éléments (c-à-d structure différente). Je veux afficher mes éléments dans l'ordre du 1er au dernier. Hors quand je rajoute un nouveau élément dans le bloc_2, il casse l'ordre puisqu'il n'existait pas dans la boucle.
 
Merci
Cdlt,
 
Exemple ci-dessous traite juste la partie ajout de module. Une fois ajouté je n'ai pas réussi à sauvegarder l'ajout et la réorganisation :  

Code :
  1. // connexion BD
  2. require_once('db.php');
  3. $sql = 'SELECT * FROM maTable ORDER BY position';
  4. $req = $db->prepare($sql);
  5. $req->execute($q) or die(print_r($req->errorInfo()));
  6. $rows = $req->fetchAll();


Code :
  1. <div id="modules">
  2.     <div id="menu">
  3.         <div id="mod01"><img src="image-mod01.jpg"></div>
  4.         <div id="mod02"><img src="image-mod02.jpg"></div>
  5.         <div id="mod03"><img src="image-mod03.jpg"></div>
  6.     </div>
  7.     <div id="dropdown">
  8.         <div class="div_mod" data-type="mod01" data-id="1">nouveau contenu 1</div>
  9.         <div class="div_mod" data-type="mod02" data-id="2">nouveau contenu 2</div>
  10.         <div class="div_mod" data-type="mod03" data-id="3">nouveau contenu 3</div>
  11.     </div>   
  12. </div>
  13. <div id="container">
  14.     <div id="bloc_1">
  15.         <div id="div_mod01" class="row" data-id="1">contenu div 1</div>
  16.         <div id="div_mod02" class="row" data-id="2">contenu div 2</div>
  17.         <div id="div_mod03" class="row" data-id="3">contenu div 3</div>
  18.     </div>
  19.     <div id="bloc_2">
  20.         foreach ($rows as $row){
  21.             switch ($row['id']) {
  22.                 case 1:
  23.                     <div id="div_1">contenu_div1</div>
  24.                 break;
  25.                 case 2:
  26.                     <div id="div_2">contenu_div2</div>
  27.                 break;
  28.                 case 3:
  29.                     <div id="div_3">contenu_div3</div>
  30.                 break;
  31.                     ...
  32.                 default:
  33.                     echo '';
  34.             }
  35.         }
  36.     </div>
  37. </div>


Code :
  1. (function(){
  2.                 $("#mod01" ).hover(function() {
  3.                     $(".div_mod[data-type='mod01']" ).show();
  4.                     $(".div_mod[data-type='mod02']" ).hide();
  5.                     $(".div_mod[data-type='mod03']" ).hide();
  6.                 });   
  7.                 $("#mod02" ).hover(function() {
  8.                     $(".div_mod[data-type='mod01']" ).hide();
  9.                     $(".div_mod[data-type='mod02']" ).show();
  10.                     $(".div_mod[data-type='mod03']" ).hide();
  11.                 });   
  12.                 $("#mod03" ).hover(function() {
  13.                     $(".div_mod[data-type='mod01']" ).hide();
  14.                     $(".div_mod[data-type='mod02']" ).hide();
  15.                     $(".div_mod[data-type='mod03']" ).show();
  16.                 });   
  17.        
  18.                 $(".div_mod" ).hover(
  19.                     function() {
  20.                         $(this).append('<div class="add"><i class="fa fa-plus"></i>Insert</div>');
  21.                         $('.add').click(function() {
  22.                             $("#div_1" ).prepend($("#bloc_1 .row[data-id='"+$(this).parent().attr("data-id" )+"']" ).clone());
  23.                             $("#dropdown" ).fadeOut(200);
  24.                         });
  25.                       }, function() {
  26.                         $(this).children(".add" ).remove();
  27.                       }
  28.                 );
  29.         })();


Code :
  1. $parametres = array('div_1','div_3','div_2');
  2. for($i=1;$i<count($parametres);$i++){
  3.   UPDATE maTable  SET position = $i WHERE id = $parametres[$i];
  4. }


Message édité par mecano31 le 08-08-2017 à 17:59:52
mood
Publicité
Posté le 08-08-2017 à 17:50:21  profilanswer
 

n°2304355
MaybeEijOr​Not
but someone at least
Posté le 09-08-2017 à 19:56:44  profilanswer
 

Bonjour,
 
Pas certain d'avoir saisi le problème ni d'ailleurs le fonctionnement exact. Il suffit de calculer à quelle position est ajouté le module puis de décaler dans la bdd tous les modules suivants d'une place et enfin insérer le nouveau module à sa place. :??:  
Si on veut limiter les décalages on peut toujours opter pour les positionnements à trous : module_1 en position 1, module_2 en position 101, on ajoute un module_3 entre les deux, on récupère la position du module précédent et suivant, on fait la moyenne ([1 + 101]/2 = 51) et on insert le nouveau module à la position calculée (51).


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
n°2304365
mecano31
Posté le 09-08-2017 à 22:15:47  profilanswer
 

Bonjour @MaybeEijOrNot
 
Merci d'avoir pris le temps de me répondre.
 
En effet, j'ai 2 blocs :
 
- un bloc de gauche qui contient les modules à ajouter.
- un bloc de droite qui contient les modules par défaut et les nouveaux rajoutés.  
 
Dans le bloc de gauche on retrouve 3 éléments permettant au survol d'afficher en bas les modules correspondant pour l'ajout. Chaque élément dispose d'un bouton "Insert" permettant de l'insérer dans le bloc de droite au tout début des éléments existants. Dans le bloc de droite on a la possibilité réorganiser les éléments par glisser-déplacer en cliquant sur le bouton "Modifier la position des éléments" pour changer la position d'un élément et la sauvegarder.  
 
Mon problème se résume en 2 points :
 
1. Pouvoir sauvegarder un module après l'avoir ajouté dans le bloc de droite et même après rechargement de la page le nouveau élément reste dans la liste.
2. Pouvoir sauvegarder la réorganisation et récupérer cet ordre après chargement.
 
Vous trouverez le lien de l'exemple avec la partie ajout de nouveau module et la partie réorganisation : https://jsfiddle.net/mecano/cdq07mjb/7/ . Merci !
 
Cdlt,

n°2304513
MaybeEijOr​Not
but someone at least
Posté le 11-08-2017 à 20:02:58  profilanswer
 

Désolé je ne vois pas où ça bloque, c'est côté serveur ou client ton problème?

 

Parce qu'une fois l'élément ajouté, quand la personne veut sauvegarder, tu envoies une requête avec les nouvelles données (nouveaux blocs et positions), tu ajoutes dans la bdd et quand la page est de nouveau chargée alors la requête qui lit la bdd prend en compte les nouveaux éléments.


Message édité par MaybeEijOrNot le 11-08-2017 à 20:03:51

---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
n°2304729
mecano31
Posté le 18-08-2017 à 13:36:55  profilanswer
 

Bonjour @MaybeEijOrNot
 
Oui c'est côté serveur que ça bloque.
 
Ce qui me bloque toujours c'est la sauvegarde du nouveau module ajouté. Le problème est que mes modules sont dans une boucle or ceux que je rajoute ne le sont pas. C'est ce qui me cause de souci pour la sauvegarde en base de données et l'affichage une fois enregistré.  
 
J'ai modifié mon code dans le lien suivant : https://jsfiddle.net/mecano/cdq07mjb/11/
 
Merci
Cdlt,
 
Voici la partie PHP:
 

Code :
  1. // connexion à la bd
  2. require_once('db.php');
  3. $sql = 'SELECT * FROM newsletter ORDER BY position';
  4. $req = $db->prepare($sql);
  5. $req->execute() or die(print_r($req->errorInfo()));
  6. $rows = $req->fetchAll();
  7. // Bloc 1
  8. <div id="bloc_1" style="display:none;">
  9.         <div class="div_mod01 row drag-drop" data-id="1" data-position="1">
  10.               <img src="http://zupimages.net/up/17/32/bgot.jpg" width="240" height="70">
  11.         </div> 
  12.         <div class="div_mod02 row drag-drop" data-id="2" data-position="2">
  13.                <div class="margin-elt float-elt"><img src="http://zupimages.net/up/17/32/bgot.jpg" width="50" height="50"></div>
  14.                <div class="size-paragraphe">Oportunum est, ut arbitror, explanare nunc causam, quae ad exitium praecipitem.</div>
  15.        </div>
  16.        <div class="div_mod03 row drag-drop" data-id="3" data-position="3">
  17.                <p class="size-paragraphe margin-elt">Oportunum est, ut arbitror, explanare nunc causam, quae ad exitium praecipitem.</p>
  18.        </div> 
  19. </div> 
  20. <div id="msg"></div>
  21. // Bloc 2
  22. <div id="bloc_2">
  23.      <?php foreach ($rows as $row) {
  24.             switch ($row['id']) {   
  25.             case 4:
  26.             ?>
  27.                 <div id="div_1" class="drag-drop" data-id="<?=$row['id'];?>" data-position="<?=$row['position'];?>">
  28.                     <img src="<?=$row['image'];?>" width="120" height="70">
  29.                     <img src="<?=$row['image_2'];?>" width="120" height="70">
  30.                 </div>
  31.             <?php
  32.                break;
  33.            case 5:
  34.             ?>
  35.                 <div id="div_2" class="drag-drop" data-id="<?=$row['id'];?>" data-position="<?=$row['position'];?>">
  36.                     <div class="size-paragraphe margin-elt"><?=$row['texte'];?></div>
  37.                     <div><img src="<?=$row['image'];?>" width="50" height="50"></div>
  38.                 </div>
  39.             <?php
  40.                 break;
  41.             case 6:
  42.             ?>   
  43.                 <div id="div_3" class="drag-drop" data-id="<?=$row['id'];?>" data-position="<?=$row['position'];?>">
  44.                     <p class="size-paragraphe"><?=$row['texte'];?></p>
  45.                     <p class="size-paragraphe"><?=$row['texte'];?></p>
  46.                 </div>
  47.             <?php
  48.                 break;
  49.                default:
  50.                    echo '';
  51.              }   
  52.            }
  53.       ?>   
  54. </div>


Code :
  1. $error = true;
  2.     $msg = array('status'=>!$error, 'msg'=>'Echec lors de l\'enregistrement !');
  3.     if(isset($_POST)) {
  4.         if (isset($_POST['id']) && !empty($_POST['id']) && $error) {
  5.             $id = $_POST['id'];
  6.             $error = false;
  7.         } else {
  8.             $error = true;
  9.         }
  10.         if (isset($_POST['rang']) && !empty($_POST['rang']) && $error) {
  11.             $rang = $_POST['rang'];
  12.             $error = false;
  13.         } else {
  14.             $error = true;
  15.         }
  16.         if (isset($_POST['text']) && !empty($_POST['text']) && $error) {
  17.             $text = $_POST['text'];
  18.             $error = false;
  19.         } else {
  20.             $error = true;
  21.         }
  22.         if (isset($_POST['img']) && !empty($_POST['img']) && $error) {
  23.             $img = $_POST['img'];
  24.             $error = false;
  25.         } else {
  26.             $error = true;
  27.         }
  28.         if (!$error) {
  29.             $sql = "INSERT INTO newsletter (texte, image, position) VALUES (:texte, :img, :rang)";
  30.             $datas = array(":texte"=>$text, ":img"=>$img, ":rang"=>$rang);
  31.             $req = $db->prepare($sql);
  32.             $res = $req->execute($datas);
  33.             $msg = array('status'=>!$error, 'msg'=>'Saisie enregistrée avec success !');
  34.             print_r($res);
  35.             print_r($req);
  36.         }   
  37.     }
  38.     // send data as json format
  39.     echo json_encode($msg);

n°2304730
MaybeEijOr​Not
but someone at least
Posté le 18-08-2017 à 14:21:17  profilanswer
 

Je n'ai pas bien compris ta structure de base de données mais dans cete requête :
 

Code :
  1. $sql = "INSERT INTO newsletter (texte, image, position) VALUES (:texte, :img, :rang)";


 
Tu ne spécifies pas d'id, or tu affiches ensuite avec un "switch case" en fonction d'un id donc si tu n'en as pas ça te passe dans le cas "default" de ton "switch case" qui est chez toi un simple echo vide.


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
n°2304734
mecano31
Posté le 18-08-2017 à 15:16:57  profilanswer
 

Voici les infos de ma base de données :
 

Code :
  1. // Structure de la table `newsletter`
  2. CREATE TABLE IF NOT EXISTS `newsletter` (
  3.   `id` int(11) NOT NULL AUTO_INCREMENT,
  4.   `texte` varchar(Max) NULL,
  5.   `image` varchar(255) NULL,
  6.   `position` int(11) NULL,
  7.   PRIMARY KEY (`id`)
  8. ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;
  9. // Contenu de la table `newsletter`
  10. INSERT INTO `newsletter` (`id`, `texte`, `image`, `position`) VALUES
  11. (4, 'NULL', 'http://zupimages.net/up/17/32/bgot.jpg', '4'),
  12. (5, 'Oportunum est, ut arbitror, explanare nunc causam, quae ad exitium praecipitem.', 'http://zupimages.net/up/17/32/bgot.jpg', '5'),
  13. (6, 'Oportunum est, ut arbitror, explanare nunc causam, quae ad exitium praecipitem.', 'NULL', '6');


 
Par Default, le nouveau module à ajouter n'est pas stocké en base de données. C'est une fois ajouté et lorsqu'on clique sur sauvegarder que je l'enregistre. Donc il n'y a pas d'ID pour l'ajout du module, il s'auto-incrémente. La boucle Switch() permet l'affichage des modules déjà existants.  
 
J'ai mis le code complet HTML et JS dans ce lien : https://jsfiddle.net/mecano/cdq07mjb/11/ pour que tu puisses comprendre le fonctionnement. Dans jsfiddle je ne pouvais pas mettre la partie PHP c'est pour ça je l'ai mis séparément.
 
Merci
Cdlt,

n°2304738
MaybeEijOr​Not
but someone at least
Posté le 18-08-2017 à 16:13:48  profilanswer
 

Le problème c'est bien que tu ajoutes un nouveau module, tu sauvegardes, tu recharges la page et il n'apparaît pas?
 
Mais c'est normal car comme tu le dis, tu ne boucles dans ton php que sur les anciens puisque tu ne décides d'afficher que ceux qui ont pour id 4, 5 ou 6. De ce que je comprends de ton switch c'est que c'est pour afficher une structure différente en fonction du type de données mais dans ce cas là tu devrais faire un champ différent dans ta bdd avec le datatype. Ainsi quand tu ajoutes un nouveau module et que tu vas sur "sauvegarder" tu mets à jour ta bdd en continuant l'auto-incrémentation sur l'id, la position du module et son datatype. Ensuite lors du nouveau chargement de la page, le php va boucler sur tous les id (en triant par position) et gérer l'affichage en fonction du datatype.
 
 
Pour moi, tu devrais gérer ça comme ça :
- 1er chargement, le php charge ta bdd et affiche les modules de base en fonction de leur position et leur datatype
- l'utilisateur ajoute des modules
- l'utilisateur appuie sur "sauvegarder"
- tu update les positions des anciens modules
- tu insert les nouveaux modules à la bonne position avec le datatype qui va bien et le contenu
- 2ème chargement de la page, ben le php fait pareil qu'avant sauf que cette fois-ci il y'a plus de lignes dans la bdd à charger.
 
 
Donc en correctif il faut ajouter un champ datatype à ta bdd, faire le switch sur le datatype. Faire un update des positions des anciens modules. Faire un insert des nouveaux modules avec le datatype qui va bien.


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
n°2304744
mecano31
Posté le 18-08-2017 à 18:46:09  profilanswer
 

Le champ datatype correspond à quel type de données ?
Son data type à lui ?
 
Dans ma table chaque ligne correspond à un module.


Message édité par mecano31 le 18-08-2017 à 19:03:35
n°2304749
MaybeEijOr​Not
but someone at least
Posté le 18-08-2017 à 21:19:37  profilanswer
 

Code :
  1. // Bloc 2
  2. <div id="bloc_2">
  3.      <?php foreach ($rows as $row) {
  4.             switch ($row['id']) { 
  5.             case 4:
  6.             ?>
  7.                 <div id="div_1" class="drag-drop" data-id="<?=$row['id'];?>" data-position="<?=$row['position'];?>">
  8.                     <img src="<?=$row['image'];?>" width="120" height="70">
  9.                     <img src="<?=$row['image_2'];?>" width="120" height="70">
  10.                 </div>
  11.             <?php
  12.                break;
  13.            case 5:
  14.             ?>
  15.                 <div id="div_2" class="drag-drop" data-id="<?=$row['id'];?>" data-position="<?=$row['position'];?>">
  16.                     <div class="size-paragraphe margin-elt"><?=$row['texte'];?></div>
  17.                     <div><img src="<?=$row['image'];?>" width="50" height="50"></div>
  18.                 </div>
  19.             <?php
  20.                 break;
  21.             case 6:
  22.             ?> 
  23.                 <div id="div_3" class="drag-drop" data-id="<?=$row['id'];?>" data-position="<?=$row['position'];?>">
  24.                     <p class="size-paragraphe"><?=$row['texte'];?></p>
  25.                     <p class="size-paragraphe"><?=$row['texte'];?></p>
  26.                 </div>
  27.             <?php
  28.                 break;
  29.                default:
  30.                    echo '';
  31.              } 
  32.            }
  33.       ?> 
  34. </div>


 
Dans ton PHP tu fais un switch, ce switch il te sert bien à afficher un module en fonction que c'est du texte, des images ou les deux. C'est ça que j'appelle "datatype", pour l'instant tu gères le contenu de ton module en fonction de l'id. Et là je te propose d'ajouter un champ "datatype" pour que tu puisses gérer ça proprement. Tu aurais 3 valeurs possibles : images, textes, texteimage ce qui permettrait de faire :
 

Code :
  1. // Bloc 2
  2. <div id="bloc_2">
  3.      <?php foreach ($rows as $row) {
  4.             switch ($row['datatype']) { 
  5.             case "images":
  6.             ?>
  7.                 <div id="div_1" class="drag-drop" data-id="<?=$row['id'];?>" data-position="<?=$row['position'];?>">
  8.                     <img src="<?=$row['image'];?>" width="120" height="70">
  9.                     <img src="<?=$row['image_2'];?>" width="120" height="70">
  10.                 </div>
  11.             <?php
  12.                break;
  13.            case "texteimage":
  14.             ?>
  15.                 <div id="div_2" class="drag-drop" data-id="<?=$row['id'];?>" data-position="<?=$row['position'];?>">
  16.                     <div class="size-paragraphe margin-elt"><?=$row['texte'];?></div>
  17.                     <div><img src="<?=$row['image'];?>" width="50" height="50"></div>
  18.                 </div>
  19.             <?php
  20.                 break;
  21.             case "textes":
  22.             ?> 
  23.                 <div id="div_3" class="drag-drop" data-id="<?=$row['id'];?>" data-position="<?=$row['position'];?>">
  24.                     <p class="size-paragraphe"><?=$row['texte'];?></p>
  25.                     <p class="size-paragraphe"><?=$row['texte'];?></p>
  26.                 </div>
  27.             <?php
  28.                 break;
  29.                default:
  30.                    echo '';
  31.              } 
  32.            }
  33.       ?> 
  34. </div>


 
Ainsi tu ne limites plus la récupération des modules aux id 4, 5 et 6 et donc tu pourras avoir les nouveaux modules enregistrés.


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
mood
Publicité
Posté le 18-08-2017 à 21:19:37  profilanswer
 

n°2304759
mecano31
Posté le 20-08-2017 à 16:56:52  profilanswer
 

Re @MaybeEijOrNot
 
J'ai modifié le code comme tu l'avais mentionné en ajoutant un champ datatype dans ma table.
J'ai fait le traitement côté php en faisant un update des positions des anciens modules ensuite un insert des nouveaux modules avec le datatype.
 Mais lors de la sauvegarde j'ai un message d'erreur : "Erreur !". J'ai l'impression que je ne récupère pas bien mes variables en $_POST car dans la console je ne vois rien de tel : {status: false, msg: "Erreur ! ", debug: []}.
 
J'ai rajouté un attribut : data-type sur chaque module.
 
Je mets le code de la partie JS et php modifiées:
 

Code :
  1. // Partie JS :
  2.            var maxId = 3;
  3.             (function() {
  4.                 $("#modules" ).hover(
  5.                     function() {
  6.                         $("#dropdown" ).fadeIn(200);
  7.                     },
  8.                     function() {
  9.                         $("#dropdown" ).fadeOut(200);
  10.                     }
  11.                 );
  12.                 $("#mod01" ).hover(function() {
  13.                     $(".div_mod[data-type='mod01']" ).show();
  14.                     $(".div_mod[data-type='mod02']" ).hide();
  15.                     $(".div_mod[data-type='mod03']" ).hide();
  16.                 });
  17.                 $("#mod02" ).hover(function() {
  18.                     $(".div_mod[data-type='mod01']" ).hide();
  19.                     $(".div_mod[data-type='mod02']" ).show();
  20.                     $(".div_mod[data-type='mod03']" ).hide();
  21.                 });
  22.                 $("#mod03" ).hover(function() {
  23.                     $(".div_mod[data-type='mod01']" ).hide();
  24.                     $(".div_mod[data-type='mod02']" ).hide();
  25.                     $(".div_mod[data-type='mod03']" ).show();
  26.                 });
  27.                 $(".div_mod" ).hover(
  28.                     function() {
  29.                         $(this).append('<div class="add"><i class="fa fa-plus"></i>Insert</div>');
  30.                         $('.add').click(function() {
  31.                             maxId += 1;
  32.                             $("#bloc_2" )
  33.                             .prepend(
  34.                                 $("#bloc_1 .row[data-id='" + $(this).parent().attr("data-id" ) + "']" )
  35.                                 .clone()
  36.                                 .attr('id','div_'+maxId)
  37.                                 .attr('data-id',maxId)
  38.                                 .attr('data-position','1'))
  39.                             .find("div.drag-drop" ).each(function(){
  40.                                 // On calcule sa position
  41.                                 index = parseInt($(this).index()+1);
  42.                                 // On met le data à jour
  43.                                 $(this).attr("data-position",index);
  44.                             });
  45.                         });
  46.                     },
  47.                     function() {
  48.                         $(this).children(".add" ).remove();
  49.                     }
  50.                 );
  51.                 // draggable & save module
  52.                 $('#btn_update').on('click', '#update', function(e) {
  53.                     e.preventDefault();
  54.                     $(this).fadeOut('slow', function() {
  55.                         $(this).siblings().fadeIn('slow').css("display", "inline-block" );
  56.                     });
  57.                     $('#bloc_2').sortable({
  58.                         stop: function(event, ui){
  59.                             // Pour chaque item de liste
  60.                             $(this).find("div.drag-drop" ).each(function(){
  61.                                 // On actualise sa position
  62.                                 index = parseInt($(this).index()+1);
  63.                                 // On la met à jour dans la page
  64.                                 $(this).attr("data-position",index);
  65.                             });
  66.                         }
  67.                     }).disableSelection();
  68.                 }).on('click', '#save', function() {
  69.                     var ordre = [];
  70.                     var me = $(this);
  71.                     $('#bloc_2').children('.drag-drop').each(function(){
  72.                         var img = null;
  73.                         var text = null;
  74.                         var my = $(this);
  75.                         if (my.hasClass("row" )){ //Nouveau module   
  76.                             if (my.find('.size-paragraphe').length  >0) text = my.find('.size-paragraphe').text();
  77.                             if (my.find('img').length > 0) img = my.find('img').attr('src');
  78.                         }
  79.                         ordre.push({
  80.                             id: my.data("id" ),
  81.                             rang: my.data('position'),
  82.                             datatype: my.data('type'),
  83.                             img: img,
  84.                             text: text
  85.                         });
  86.                     });
  87.                     console.log(ordre);
  88.                     var datas = JSON.stringify(ordre);
  89.                     $.post("saveModule.php", datas, function(response) {
  90.                         if(response.status) {
  91.                             $("#msg" ).removeClass('error');
  92.                             $("#msg" ).addClass('success').html(response.msg);
  93.                         } else {
  94.                             $("#msg" ).removeClass('success');
  95.                             $("#msg" ).addClass('error').html(response.msg);
  96.                         }
  97.                     }, 'json');
  98.                    
  99.                 });
  100.             })();


Code :
  1. // Partie PHP : saveModule.php
  2. // include connection file
  3.     require_once('db.php');
  4.     //récupération "propre" des variable)
  5.     $id = !empty($_POST['id']) ? $_POST['id'] : NULL;
  6.     $rang = isset($_POST['rang']) ? $_POST['rang'] : "";
  7.     $text = isset($_POST['text']) ? $_POST['text'] : "";
  8.     $img = isset($_POST['img']) ? $_POST['img'] : "";
  9.     $datatype = isset($_POST['datatype']) ? $_POST['datatype'] : "";
  10.     function update_module($id,$rang){
  11.         $sql = "UPDATE test_newsletter SET position = :rang WHERE id = :id";
  12.         $datas = array(":id"=>$id, ":rang"=>$rang);
  13.         return queryExec($sql,$datas); 
  14.     }
  15.     function insert_module($text,$img,$rang,$datatype){
  16.         $sql = "INSERT INTO test_newsletter SET texte = :texte, image = :img, position = :rang, datatype = :type WHERE id = :id";
  17.         $datas = array(":texte"=>$text, ":img"=>$img, ":rang"=>$rang, ":type"=>$datatype);
  18.         return queryExec($sql,$datas);
  19.     }
  20.     function queryExec($sql,$datas){
  21.      global $db;
  22.      try {
  23.         $req = $db->prepare($sql);
  24.         $res = $req->execute($datas);
  25.         $result = array(
  26.             'status'=> $res,
  27.             'msg'=>'Saisie enregistrée avec success !',
  28.             'debug'=>array("requete"=>$sql, "datas"=>$datas)
  29.         );
  30.       } catch (Exception $e) {
  31.         //erreur dans la requete
  32.         $result = array(
  33.             'status'=>false,
  34.             'msg'=>'Erreur ! '.$e->getMessage(),
  35.             'debug'=>array("requete"=>$sql, "datas"=>$datas)
  36.         );
  37.       }
  38.       return $result;
  39.     }
  40.     if ($id && $rang) {
  41.        $msg = update_module($id, $rang);
  42.     } else if ($text && $img && $rang && $datatype){
  43.         $msg = insert_module($text,$img,$rang,$datatype);
  44.     } else {
  45.       //pas d'ID
  46.       $msg = array( 'status'=>false,
  47.         'msg'=>"Erreur ! ",
  48.         'debug'=>$_POST
  49.       );
  50.     }     
  51.     // send data as json format
  52.     echo json_encode($msg);


Message édité par mecano31 le 20-08-2017 à 17:00:38
n°2304763
MaybeEijOr​Not
but someone at least
Posté le 20-08-2017 à 19:31:56  profilanswer
 

Dans le PHP, si j'ai bien suivi :
 

Code :
  1. function insert_module($text,$img,$rang,$datatype){
  2.         $sql = "INSERT INTO test_newsletter SET texte = :texte, image = :img, position = :rang, datatype = :type WHERE id = :id";
  3.         $datas = array(":texte"=>$text, ":img"=>$img, ":rang"=>$rang, ":type"=>$datatype);
  4.         return queryExec($sql,$datas);
  5.     }


 
Il n'y a pas de clause WHERE lors d'un INSERT, d'ailleurs ce n'est pas non plus un SET mais un VALUES qu'il faut alors utiliser. Tu es parti sur le schéma d'une requête UPDATE. Au passage le nombre de données ne correspond pas à celui précisé dans la requête. Tu prépares une requête qui attend un tableau de 5 valeurs et tu n'en communiques que 4. Bref la requête est totalement foirée.


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
n°2304764
mecano31
Posté le 20-08-2017 à 20:26:44  profilanswer
 

Je viens de corriger la requête.
Mais le problème demeure. Au niveau de la requête d'insertion je n'ai besoin que de 4 paramètres puisque l'ID est auto-incrémenté.
Le SET avec INSERT INTO marche aussi sauf qu'il n'y a pas de clause WHERE comme tu l'as dit.
 

Code :
  1. function insert_module($text,$img,$rang,$datatype){
  2.         $sql = "INSERT INTO test_newsletter (texte, image, position, datatype) VALUES (:texte, :img, :rang, :type)";
  3.         $datas = array(":texte"=>$text, ":img"=>$img, ":rang"=>$rang, ":type"=>$datatype);
  4.         return queryExec($sql,$datas);
  5. }


Message édité par mecano31 le 20-08-2017 à 20:30:48
n°2304765
MaybeEijOr​Not
but someone at least
Posté le 20-08-2017 à 21:15:24  profilanswer
 

Je pense que ça déconne parce que tu envoies en Json, il faudrait donc du côté PHP "deserializer". Je pense que côté serveur tu obtiens juste un $_POST['datas'] avec toutes tes données sous forme Json.
 
Mais tu n'as pas besoin de serializer en Json tes données pour les envoyer avec une requête post.


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
n°2304768
mecano31
Posté le 21-08-2017 à 10:04:18  profilanswer
 

J'ai modifié mon code JS et PHP pour déserializez.
Mais en sauvegardant voici ci-dessous ce que j'obtiens dans la console :
 
Notice: Undefined index: id in \orderUpdate.php on line 4.
 
Array
(
    [0] => Array
        (
            [0] => Array
                (
                    [id] => 4
                    [rang] => 1
                    [datatype] => images
                    [img] => http://zupimages.net/up/17/32/bgot.jpg
                    [text] =>  
                )
 
            [1] => Array
                (
                    [id] => 4
                    [rang] => 2
                    [datatype] => images
                    [img] =>  
                    [text] =>  
                )
 
            [2] => Array
                (
                    [id] => 5
                    [rang] => 3
                    [datatype] => texte-image
                    [img] =>  
                    [text] =>  
                )
 
            [3] => Array
                (
                    [id] => 6
                    [rang] => 4
                    [datatype] => textes
                    [img] =>  
                    [text] =>  
                )
        )
)
{"status":false,"msg":"Erreur !","debug":{"datas":"[{\"id\":4,\"rang\":1,\"datatype\":\"images\",\"img\":\"http:\/\/zupimages.net\/up\/17\/32\/bgot.jpg\",\"text\":null},{\"id\":4,\"rang\":2,\"datatype\":\"images\",\"img\":null,\"text\":null},{\"id\":5,\"rang\":3,\"datatype\":\"texte-image\",\"img\":null,\"text\":null},{\"id\":6,\"rang\":4,\"datatype\":\"textes\",\"img\":null,\"text\":null}]"}}
 
Pour le nouveau module que je souhaite insérer il récupère l'ID du premier module existant (duplication) et l'insertion n'a pas lieu ni la mise à jour.
 

Code :
  1. // Partie modifiée côté js :
  2. $.post("orderUpdate.php", {datas:JSON.stringify(ordre)}, function(response) {
  3.      if(response.status) {
  4.           $("#msg" ).removeClass('error');
  5.           $("#msg" ).addClass('success').html(response.msg);
  6.      } else {
  7.           $("#msg" ).removeClass('success');
  8.           $("#msg" ).addClass('error').html(response.msg);
  9.      }
  10. }, 'json');

 

Code :
  1. // Partie modifiée côté php
  2. if (isset($_POST['datas'])) {
  3.    parse_str($_POST['datas'], $datas);
  4.     echo $datas['id'];
  5.     //récupération "propre" des variable)
  6.     $id = !empty($datas['id']) ? $datas['id'] : NULL;
  7.     $rang = isset($datas['rang']) ? $datas['rang'] : "";
  8.     $text = isset($datas['text']) ? $datas['text'] : "";
  9.     $img = isset($datas['img']) ? $datas['img'] : "";
  10.     $datatype = isset($datas['datatype']) ? $datas['datatype'] : "";
  11. }


Message édité par mecano31 le 21-08-2017 à 12:15:59
n°2304772
MaybeEijOr​Not
but someone at least
Posté le 21-08-2017 à 14:40:06  profilanswer
 

Il y a un truc que je ne comprends pas, du côté JS tu envoies en Json et du côté PHP tu fais un parse_str() mais a priori parse_str() sert à déserializer une requête GET. Tu as json_decode() du côté PHP pour normalement déserializer du Json.
 
Bon néanmoins ça a l'air de fonctionner un minimum mais pour débuguer tu devrais plutôt utiliser var_dump() que echo. Là il te dit que $datas['id'] n'existe pas et c'est normal car dans tous les cas tu dois obtenir au final un tableau multidimensionnel du genre :
 
$datas[0]['id']
$datas[0]['image']
$datas[0]['datatype']
$datas[0]['img']
$datas[0]['text']
$datas[1]['id']
$datas[1]['image']
$datas[1]['datatype']
$datas[1]['img']
$datas[1]['text']
...
 
En effet dans ta requête tu passes des données pour plusieurs modules : ceux à updater et ceux à ajouter.
 
Essaye comme j'ai dit json_decode qui me semble plus approprié et ensuite il faudra que dans ton code php tu boucles sur ton tableau $datas afin de gérer la mise à jour de chaque module.


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
n°2304775
mecano31
Posté le 21-08-2017 à 15:37:02  profilanswer
 

J'ai rectifié. Ça marche maintenant pour la mise à jour.
Comment dois-je procéder pour l'insertion ?
Sachant que quand je rajoute un nouveau module je ne récupère pas l'ID du dernier mais l'ID du premier module existant.
Et ainsi je pourrai faire uniquement de la mise à jour ou uniquement de l'insertion d'un nouveau module ou bien les deux en même temps.
 
Merci
 

Code :
  1. // partie php modifiée :
  2. if (isset($_POST['datas'])){
  3.         $datas = json_decode($_POST['datas']);
  4.         var_dump($datas);
  5.         foreach ($datas as $val) {
  6.             $id = !empty($val->id) ? $val->id : NULL;
  7.             $rang = isset($val->rang) ? $val->rang : "";
  8.             $text = isset($val->text) ? $val->text : "";
  9.             $img = isset($val->img) ? $val->img : "";
  10.             $datatype = isset($val->datatype) ? $val->datatype : "";
  11.             $q = array(":id"=>$id, ":rang"=>$rang);
  12.             $sql = "UPDATE newsletter SET position = :rang WHERE id = :id";
  13.             $req = $db->prepare($sql);
  14.             $req->execute($q) or die(print_r($req->errorInfo()));
  15.         }
  16.     }


Message édité par mecano31 le 21-08-2017 à 16:07:44
n°2304781
MaybeEijOr​Not
but someone at least
Posté le 21-08-2017 à 17:00:20  profilanswer
 

Normalement quand tu ajoutes un nouveau module tu n'es pas censé récupérer d'id puisqu'il va s'auto-incrémenter. C'est ce qui permet de différencier un module à updater et un module à ajouter.
 
C'est ce qu'on retrouvait dans ton php ici, non?

Code :
  1. if ($id && $rang) {
  2.        $msg = update_module($id, $rang);
  3.     } else if ($text && $img && $rang && $datatype){
  4.         $msg = insert_module($text,$img,$rang,$datatype);
  5.     } else {


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
n°2304783
mecano31
Posté le 21-08-2017 à 17:39:57  profilanswer
 

Oui c'est ce que j'ai mis dans mon code mais ça ne marche pas.
Quand j'ajoute un nouveau module (par exemple le 2eme dans le bloc_1) : texte-image, le module ajouté prend l'ID du 1er ancien module dans le bloc_1. Ce qui m'affiche ceci dans la console :  
 
array (size=4)
  0 =>  
    object(stdClass)[2]
      public 'id' => int 4
      public 'rang' => int 1
      public 'datatype' => string 'text-image' (length=10)
      public 'img' => string 'http://zupimages.net/up/17/32/bgot.jpg' (length=38)
      public 'text' => string 'Oportunum est, ut arbitror, explanare nunc causam, quae ad exitium praecipitem.' (length=79)
  1 =>  
    object(stdClass)[3]
      public 'id' => int 4
      public 'rang' => int 2
      public 'datatype' => string 'images' (length=6)
      public 'img' => null
      public 'text' => null
  2 =>  
    object(stdClass)[4]
      public 'id' => int 5
      public 'rang' => int 3
      public 'datatype' => string 'texte-image' (length=11)
      public 'img' => null
      public 'text' => null
  3 =>  
    object(stdClass)[5]
      public 'id' => int 6
      public 'rang' => int 4
      public 'datatype' => string 'textes' (length=6)
      public 'img' => null
      public 'text' => null
 
Et l'insertion ne marche pas ni la mise à jour avec l'ancien code que j'ai mis avec les fonctions : update_module et insert_module. Mais quand j'enlève les fonctions et que je mette les requêtes directement dans la boucle ça marche. Mais, pour l'ajout du nouveau module, au lien d’insérer ce module, il m'insérer celui avec l'ID correspond soit l'ancien premier module.

n°2304788
MaybeEijOr​Not
but someone at least
Posté le 21-08-2017 à 19:01:41  profilanswer
 

Euh tu aurais un fiddle à jour? Je pense que le problème vient de ta variable maxId qui ne colle pas mais là je mélange plusieurs codes alors difficile d'y voir clair.


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
n°2304794
mecano31
Posté le 21-08-2017 à 22:07:11  profilanswer
 

Voici le lien jsfiddle à jour :
 
https://jsfiddle.net/mecano/cdq07mjb/18/

n°2304800
MaybeEijOr​Not
but someone at least
Posté le 21-08-2017 à 23:03:40  profilanswer
 

Et si tu enlèves tout ce qui utilises le maxId :
 

Code :
  1. var maxId = 3;


Code :
  1. maxId += 1;


Code :
  1. .attr('id','div_'+maxId)
  2.                                 .attr('data-id',maxId)


 
Est-ce que ça pose problème et est-ce que tu penses que ça pourrait te poser des problèmes? Sachant qu'après nouveau chargement de la page, les modules auraient automatiquement ces données puisqu'issues de la bdd.
Comme dit avant, l'id est auto-incrémenté par la bdd il n'y a donc pas de raison de s'en préoccuper.
D'ailleurs ton css est généré dynamiquement? Parce que tu fais référence à des div_1, div_2 et div_3 mais à terme tu en auras d'autres, peut-être gérer ça sur les classes plutôt que les id.


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
n°2304810
mecano31
Posté le 22-08-2017 à 09:47:45  profilanswer
 

C'est bien ça qui est à l'origine du problème.
J'ai corrigé. Je récupère le bon ID maintenant.  
Au niveau CSS je vais remplacer les ID par des class comme tu l'avais préconisé.
 
Mais la sauvegarde ne marche toujours pas.
Quand j'essaye ceci :

Code :
  1. if (isset($_POST['datas'])){
  2.         $datas = json_decode($_POST['datas']);
  3.         var_dump($datas);
  4.         foreach ($datas as $val) {
  5.             $id = !empty($val->id) ? $val->id : NULL;
  6.             $rang = isset($val->rang) ? $val->rang : "";
  7.             $text = isset($val->text) ? $val->text : "";
  8.             $img = isset($val->img) ? $val->img : "";
  9.             $datatype = isset($val->datatype) ? $val->datatype : "";
  10.             $q = array(":id"=>$id, ":rang"=>$rang);
  11.             $sql = "UPDATE test_newsletter SET position = :rang WHERE id = :id";
  12.             $req = $db->prepare($sql);
  13.             $req->execute($q) or die(print_r($req->errorInfo()));
  14.             /*$qi = array(":texte"=>$text, ":img"=>$img, ":rang"=>$rang, ":type"=>$datatype);
  15.             $sqli = "INSERT INTO test_newsletter (texte, image, position, datatype) VALUES (:texte, :img, :rang, :type)";
  16.             $reqi = $db->prepare($sqli);
  17.             $reqi->execute($qi) or die(print_r($reqi->errorInfo()));*/
  18.         }
  19. }


Ça marche pour la mise à jour mais pour l'insertion j'enregistre plusieurs lignes vides en plus du module (ce qui est normale quand c'est dans une boucle).
 
Mais avec mon précédent code ça ne marche pas. Je n'envoie rien en base de données :

Code :
  1. if (isset($_POST['datas'])){
  2.         $datas = json_decode($_POST['datas']);
  3.         var_dump($datas);
  4.         foreach ($datas as $val) {
  5.             $id = !empty($val->id) ? $val->id : NULL;
  6.             $rang = isset($val->rang) ? $val->rang : "";
  7.             $text = isset($val->text) ? $val->text : "";
  8.             $img = isset($val->img) ? $val->img : "";
  9.             $datatype = isset($val->datatype) ? $val->datatype : "";
  10.         }
  11.        
  12.         function update_module($id,$rang){
  13.             $sql = "UPDATE test_newsletter SET position = :rang WHERE id = :id";
  14.             $datas = array(":id"=>$id, ":rang"=>$rang);
  15.             return queryExec($sql,$datas);
  16.         }
  17.         function insert_module($text,$img,$rang,$datatype){
  18.             $sql = "INSERT INTO test_newsletter (texte, image, position, datatype) VALUES (:texte, :img, :rang, :type)";
  19.             $datas = array(":texte"=>$text, ":img"=>$img, ":rang"=>$rang, ":type"=>$datatype);
  20.             return queryExec($sql,$datas);
  21.         }
  22.         function queryExec($sql,$datas){
  23.             global $db;
  24.             try {
  25.                 $req = $db->prepare($sql);
  26.                 $res = $req->execute($datas);
  27.                 $result = array(
  28.                     'status'=> $res,
  29.                     'msg'=>'Module enregistré avec success !',
  30.                     'debug'=>array("requete"=>$sql, "datas"=>$datas)
  31.                 );
  32.             } catch (Exception $e) {
  33.                 //erreur dans la requete
  34.                 $result = array(
  35.                     'status'=>false,
  36.                     'msg'=>'Erreur ! '.$e->getMessage(),
  37.                     'debug'=>array("requete"=>$sql, "datas"=>$datas)
  38.                 );
  39.             }
  40.             return $result;
  41.         }
  42.         if ($id && $rang) {
  43.            $msg = update_module($id, $rang);
  44.         } else if ($text && $img && $rang && $datatype){
  45.             $msg = insert_module($text,$img,$rang,$datatype);
  46.         } else {
  47.             //pas d'ID
  48.             $msg = array( 'status'=>false,
  49.                 'msg'=>"Erreur !",
  50.                 'debug'=>$_POST
  51.             );
  52.         } 
  53. }


Message édité par mecano31 le 22-08-2017 à 09:57:51
n°2304816
MaybeEijOr​Not
but someone at least
Posté le 22-08-2017 à 15:53:15  profilanswer
 

Dans ton code tu ne passes pas tes appels dans la boucle donc tu n'en fais qu'un mais du coup tu devrais avoir au moins un appel de fait...
Donc si tu boucles vraiment dessus ça ne va toujours pas?
 

Code :
  1. if (isset($_POST['datas'])){
  2.   $datas = json_decode($_POST['datas']);
  3.   var_dump($datas);
  4.  
  5.   function update_module($id,$rang){
  6.      $sql = "UPDATE test_newsletter SET position = :rang WHERE id = :id";
  7.      $datas = array(":id"=>$id, ":rang"=>$rang);
  8.      return queryExec($sql,$datas);
  9.   }
  10.   function insert_module($text,$img,$rang,$datatype){
  11.      $sql = "INSERT INTO test_newsletter (texte, image, position, datatype) VALUES (:texte, :img, :rang, :type)";
  12.      $datas = array(":texte"=>$text, ":img"=>$img, ":rang"=>$rang, ":type"=>$datatype);
  13.      return queryExec($sql,$datas);
  14.   }
  15.  
  16.   function queryExec($sql,$datas){
  17.      global $db;
  18.      try {
  19.         $req = $db->prepare($sql);
  20.         $res = $req->execute($datas);
  21.         $result = array(
  22.            'status'=> $res,
  23.            'msg'=>'Module enregistré avec success !',
  24.            'debug'=>array("requete"=>$sql, "datas"=>$datas)
  25.         );
  26.      } catch (Exception $e) {
  27.         //erreur dans la requete
  28.         $result = array(
  29.            'status'=>false,
  30.            'msg'=>'Erreur ! '.$e->getMessage(),
  31.            'debug'=>array("requete"=>$sql, "datas"=>$datas)
  32.         );
  33.      }
  34.      return $result;
  35.   }
  36.  
  37.   foreach ($datas as $val) {
  38.      $id = !empty($val->id) ? $val->id : NULL;
  39.      $rang = isset($val->rang) ? $val->rang : "";
  40.      $text = isset($val->text) ? $val->text : "";
  41.      $img = isset($val->img) ? $val->img : "";
  42.      $datatype = isset($val->datatype) ? $val->datatype : "";
  43.  
  44.      if ($id && $rang) {
  45.         $msg = update_module($id, $rang);
  46.      } else if ($text && $img && $rang && $datatype){
  47.         $msg = insert_module($text,$img,$rang,$datatype);
  48.      } else {
  49.         //pas d'ID
  50.         $msg = array( 'status'=>false,
  51.            'msg'=>"Erreur !",
  52.            'debug'=>$_POST
  53.         );
  54.      }
  55.   }
  56.  
  57. }


 
Par contre faudra revoir le système de messages d'erreurs puisque maintenant tu peux en avoir plusieurs.


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
n°2304819
mecano31
Posté le 22-08-2017 à 17:30:02  profilanswer
 

J'ai testé mais ça ne marche pas.
Pourtant il n'y a pas de message d'erreur ni de message de succès et rien dans la BD.  
Je récupères bien les infos.

n°2304839
MaybeEijOr​Not
but someone at least
Posté le 23-08-2017 à 12:53:57  profilanswer
 

Pas d'idée non plus, je n'ai pas de serveur php d'installé, essaye de débuguer à ce niveau voir ce qui se passe :
 

Code :
  1. $debug_count = 0;
  2.       if ($id && $rang) {
  3.          $debug_count += 1;
  4.          $msg = update_module($id, $rang);
  5.       } else if ($text && $img && $rang && $datatype){
  6.          $debug_count += 100;
  7.          $msg = insert_module($text,$img,$rang,$datatype);
  8.       } else {
  9.          //pas d'ID
  10.          $debug_count += 10000;
  11.          $msg = array( 'status'=>false,
  12.             'msg'=>"Erreur !",
  13.             'debug'=>$_POST
  14.          );
  15.       }


 
Vu que tu as des messages d'erreurs ou de succès partout, si tu ne vois rien c'est qu'a priori tu ne passes même pas le premier if ais tu me dis que tu récupères bien les données. :pt1cable:  
Il reste la possibilité de passer le premier if et de ne pas rentrer dans la boucle foreach mais je ne vois pas plus de raisons...


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
n°2304978
mecano31
Posté le 28-08-2017 à 12:05:09  profilanswer
 

Bonjour @MaybeEijOrNot
 
J'ai fait les modifications que tu as demandé mais toujours rien.
Je pense que je ne passes même pas dans la boucle.  
 
La console m'affiche ceci pour exemple de rajout d'un texte mais sinon rien d'autre :
 
array (size=4)
  0 =>  
    object(stdClass)[2]
      public 'id' => int 3
      public 'rang' => int 1
      public 'datatype' => string 'textes' (length=6)
      public 'img' => null
      public 'text' => string 'Oportunum est, ut arbitror, explanare nunc causam, quae ad exitium praecipitem.' (length=79)
  1 =>  
    object(stdClass)[3]
      public 'id' => int 4
      public 'rang' => int 2
      public 'datatype' => string 'images' (length=6)
      public 'img' => null
      public 'text' => null
  2 =>  
    object(stdClass)[4]
      public 'id' => int 6
      public 'rang' => int 3
      public 'datatype' => string 'textes' (length=6)
      public 'img' => null
      public 'text' => null
  3 =>  
    object(stdClass)[5]
      public 'id' => int 5
      public 'rang' => int 4
      public 'datatype' => string 'texte-image' (length=11)
      public 'img' => null
      public 'text' => null
 
Je mets le code complet partie PHP :

Code :
  1. // include connection file
  2.     require_once('db.php');
  3.     if (isset($_POST['datas'])){
  4.         $datas = json_decode($_POST['datas']);
  5.         var_dump($datas);
  6.    
  7.         function update_module($id,$rang){
  8.             $sql = "UPDATE newsletter SET position = :rang WHERE id = :id";
  9.             $datas = array(":id"=>$id, ":rang"=>$rang);
  10.             return queryExec($sql,$datas);
  11.         }
  12.         function insert_module($text,$img,$rang,$datatype){
  13.             $sql = "INSERT INTO newsletter (texte, image, position, datatype) VALUES (:texte, :img, :rang, :type)";
  14.             $datas = array(":texte"=>$text, ":img"=>$img, ":rang"=>$rang, ":type"=>$datatype);
  15.             return queryExec($sql,$datas);
  16.         }
  17.    
  18.         function queryExec($sql,$datas){
  19.             global $db;
  20.             try {
  21.                 $req = $db->prepare($sql);
  22.                 $res = $req->execute($datas);
  23.                 $result = array(
  24.                     'status'=> $res,
  25.                     'msg'=>'Module enregistré avec success !',
  26.                     'debug'=>array("requete"=>$sql, "datas"=>$datas)
  27.                 );
  28.             } catch (Exception $e) {
  29.                 //erreur dans la requete
  30.                 $result = array(
  31.                     'status'=>false,
  32.                     'msg'=>'Erreur ! '.$e->getMessage(),
  33.                     'debug'=>array("requete"=>$sql, "datas"=>$datas)
  34.                 );
  35.             }
  36.             return $result;
  37.         }
  38.    
  39.         foreach ($datas as $val) {
  40.             $id = !empty($val->id) ? $val->id : NULL;
  41.             $rang = isset($val->rang) ? $val->rang : "";
  42.             $text = isset($val->text) ? $val->text : "";
  43.             $img = isset($val->img) ? $val->img : "";
  44.             $datatype = isset($val->datatype) ? $val->datatype : "";
  45.            
  46.             $debug_count = 0;
  47.             if ($id && $rang) {
  48.                 $debug_count += 1;
  49.                 $msg = update_module($id,$rang);
  50.             } else if ($text && $img && $rang && $datatype) {
  51.                 $debug_count += 100;
  52.                 $msg = insert_module($text,$img,$rang,$datatype);
  53.             } else if ($id && $text && $img && $rang && $datatype) {
  54.                 $debug_count += 10000;
  55.                 $msg = update_module($id,$rang);
  56.                 $msg = insert_module($text,$img,$rang,$datatype);
  57.             } else {   
  58.                 $debug_count += 100000;
  59.                 $msg = array( 'status'=>false,
  60.                     'msg'=>"Erreur ! Echec de mise à jour !",
  61.                     'debug'=>$_POST
  62.                 );
  63.             }
  64.         }
  65.     }

n°2304997
MaybeEijOr​Not
but someone at least
Posté le 28-08-2017 à 19:37:11  profilanswer
 

La variable $debug_count était là pour voir si on entrait dans la boucle et si oui ce qu'il se passait. Mais faut faire un var_dump dessus après la boucle sinon ça ne m'avance pas à grand chose. :pt1cable:  
 
Si le var_dump te sort que la variable n'est pas définie c'est que tu n'es pas entré dans la boucle, si la valeur reste à 0 c'est que tu ne passes pas le if.
Si la valeur reste sur 0 je pense que le problème est lié à ta méthode pour récupérer les valeurs via le foreach. Franchement je ne me rappelle plus le foreach sur un tableau multidimensionnel. Peut-être tester un :
 
$id = !empty($val['id']) ? $val['id'] : NULL;


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
n°2305020
mecano31
Posté le 29-08-2017 à 09:42:05  profilanswer
 

@MaybeEijOrNot,
 
Un var_dump de $debug_count me renvoie ceci :
 
int 0
 
int 1
 
int 0
 
int 1
 
int 0
 
int 1
 
int 0
 
int 1
 
Je rentre dans la boucle et dans le premier If mais pas la suite. Ce que je ne comprends pas logiquement.

n°2305022
MaybeEijOr​Not
but someone at least
Posté le 29-08-2017 à 11:19:44  profilanswer
 

De toute façon oui ça colle avec ce que tu avais donné dans ton précédent message, on retrouve bien un id à chaque fois.
 
Le problème est donc côté JS :

Code :
  1. ordre.push({
  2.     id: my.data("id" ),
  3.     rang: my.data('position'),
  4.     datatype: my.data('type'),
  5.     img: img,
  6.     text: text
  7. });


 
Tu passes l'id quelque soit le cas, quelque chose comme ça devrait peut-être faire l'affaire :

Code :
  1. if (my.hasClass("row" )){ //Nouveau module   
  2.    if (my.find('.size-paragraphe').length  >0) text = my.find('.size-paragraphe').text();
  3.    if (my.find('img').length > 0) img = my.find('img').attr('src');
  4.    ordre.push({id: my.data("id" )});
  5. }
  6. ordre.push({
  7.    rang: my.data('position'),
  8.    datatype: my.data('type'),
  9.    img: img,
  10.    text: text
  11. });


 
 
 
[EDIT]
Au passage c'était ça que je voulais faire :

Code :
  1. $debug_count = 0;
  2.         foreach ($datas as $val) {
  3.             $id = !empty($val->id) ? $val->id : NULL;
  4.             $rang = isset($val->rang) ? $val->rang : "";
  5.             $text = isset($val->text) ? $val->text : "";
  6.             $img = isset($val->img) ? $val->img : "";
  7.             $datatype = isset($val->datatype) ? $val->datatype : "";
  8.          
  9.             if ($id && $rang) {
  10.                 $debug_count += 1;
  11.                 $msg = update_module($id,$rang);
  12.             } else if ($text && $img && $rang && $datatype) {
  13.                 $debug_count += 100;
  14.                 $msg = insert_module($text,$img,$rang,$datatype);
  15.             } else if ($id && $text && $img && $rang && $datatype) {
  16.                 $debug_count += 10000;
  17.                 $msg = update_module($id,$rang);
  18.                 $msg = insert_module($text,$img,$rang,$datatype);
  19.             } else
  20.                 $debug_count += 100000;
  21.                 $msg = array( 'status'=>false,
  22.                     'msg'=>"Erreur ! Echec de mise à jour !",
  23.                     'debug'=>$_POST
  24.                 );
  25.             }
  26.         }
  27.         var_dump($debug_count);


Mais ce n'est pas grave, on n'a quand même la réponse.


Message édité par MaybeEijOrNot le 29-08-2017 à 11:22:24

---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
n°2305027
mecano31
Posté le 29-08-2017 à 14:25:29  profilanswer
 

Si on met l'ID uniquement pour l'ajout du nouveau, il n' y auras pas d'ID pour la mise à jour.
J'ai besoin de ce dernier pour la mise à jour car pour l'insertion j'en n'ai pas besoin. L'ID doit être passé que pour la mise à jour parce qu'il est auto-incrémenté pour l'insertion.

n°2305029
MaybeEijOr​Not
but someone at least
Posté le 29-08-2017 à 14:55:12  profilanswer
 

Ah oui au temps pour moi j'ai inversé les deux cas, donc tu as juste à mettre la ligne de l'id dans un "else".


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
n°2305030
mecano31
Posté le 29-08-2017 à 15:36:09  profilanswer
 

J'ai le mis dans le else mais toujours. L'enregistrement (insertion uniquement) a marché une fois et plus rien après  :pt1cable:  :pt1cable:
 
J'enlève aussi le deuxième "else if" dans ce cas puisque qu'il n'y a plus de raison de laisser la condition dans les deux cas de figure (mise à jour + enregistrement).
 
Le var_dump passe bien ici :
 
array (size=8)
  0 =>  
    object(stdClass)[2]
      public 'id' => int 6
  1 =>  
    object(stdClass)[3]
      public 'rang' => int 1
      public 'datatype' => string 'textes' (length=6)
      public 'img' => null
      public 'text' => null
  2 =>  
    object(stdClass)[4]
      public 'id' => int 4
  3 =>  
    object(stdClass)[5]
      public 'rang' => int 2
      public 'datatype' => string 'images' (length=6)
      public 'img' => null
      public 'text' => null
  4 =>  
    object(stdClass)[6]
      public 'id' => int 5
  5 =>  
    object(stdClass)[7]
      public 'rang' => int 3
      public 'datatype' => string 'texte-image' (length=11)
      public 'img' => null
      public 'text' => null
  6 =>  
    object(stdClass)[8]
      public 'id' => int 14
  7 =>  
    object(stdClass)[9]
      public 'rang' => int 4
      public 'datatype' => string 'texte-image' (length=11)
      public 'img' => null
      public 'text' => null
 
int 800000


Message édité par mecano31 le 29-08-2017 à 16:17:07
n°2305031
MaybeEijOr​Not
but someone at least
Posté le 29-08-2017 à 17:15:27  profilanswer
 

Là je vois deux problèmes :
 
1- Tes données avec 'id' n'ont pas le rang, ces cas sont donc traités par la partie 'else' du php.
2- Tes données sans 'id' n'ont ni texte ni image, ils sont donc de même traités par la partie 'else' du php.
 
Du côté JS il faut en fait (mea culpa) :

Code :
  1. if (my.hasClass("row" )){ //Nouveau module   
  2.        if (my.find('.size-paragraphe').length  >0) text = my.find('.size-paragraphe').text();
  3.        if (my.find('img').length > 0) img = my.find('img').attr('src');
  4.        ordre.push({
  5.               rang: my.data('position'),
  6.               datatype: my.data('type'),
  7.               img: img,
  8.               text: text
  9.        });
  10.     } else {
  11.        ordre.push({
  12.               id: my.data('id'),
  13.               rang: my.data('position'),
  14.        });
  15.     }


 
Et côté php tu dois avoir (en effet le deuxième 'else if' ne servait à rien et en plus faisait deux requêtes) :

Code :
  1. $debug_count = 0;
  2.             foreach ($datas as $val) {
  3.                 $id = !empty($val->id) ? $val->id : NULL;
  4.                 $rang = isset($val->rang) ? $val->rang : "";
  5.                 $text = isset($val->text) ? $val->text : "";
  6.                 $img = isset($val->img) ? $val->img : "";
  7.                 $datatype = isset($val->datatype) ? $val->datatype : "";
  8.            
  9.                 if ($id && $rang) {
  10.                     $debug_count += 1;
  11.                     $msg = update_module($id,$rang);
  12.                 } else if ($text && $img && $rang && $datatype) {
  13.                     $debug_count += 100;
  14.                     $msg = insert_module($text,$img,$rang,$datatype);
  15.                 } else {
  16.                     $debug_count += 1000;
  17.                     $msg = array( 'status'=>false,
  18.                         'msg'=>"Erreur ! Echec de mise à jour !",
  19.                         'debug'=>$_POST
  20.                     );
  21.                 }
  22.             }
  23.             var_dump($debug_count);


 
Bon on devrait finir par y arriver. :D


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
n°2305032
mecano31
Posté le 29-08-2017 à 17:57:23  profilanswer
 

Oui on va finir par y arriver.
Côté mise à jour ça marche bien mais il reste que le côté insertion qui ne fonctionne pas (else if).
 
C'est toujours le If qui passe même quand je rajoute un nouveau module et je l'enregistre.  
 
Voici le résultat de la requête d'insertion d'un nouveau module :  
 
{"status":true,"msg":"Module enregistr\u00e9 avec success !","debug":{"requete":"UPDATE test_newsletter SET position = :rang WHERE id = :id","datas":{":id":6,":rang":4}}}


Message édité par mecano31 le 29-08-2017 à 18:13:17
n°2305034
MaybeEijOr​Not
but someone at least
Posté le 29-08-2017 à 18:33:20  profilanswer
 

Pour l'instant le résultat ne renvoie que la dernière requête effectuée car tu ne cumules pas les messages à chaque tour de boucle.
 
Du coup je veux bien les var_dump sur les variables $datas et $debug_count, mais je pense que le problème est toujours du côté JS dans les données envoyées.


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
n°2305048
mecano31
Posté le 30-08-2017 à 09:38:36  profilanswer
 

Voici les var_dump($datas) et var_dump($debug_count) :
array (size=4)
  0 =>  
    object(stdClass)[2]
      public 'rang' => int 1
      public 'datatype' => string 'images' (length=6)
      public 'img' => string 'http://zupimages.net/up/17/32/bgot.jpg' (length=38)
      public 'text' => null
  1 =>  
    object(stdClass)[3]
      public 'id' => int 4
      public 'rang' => int 2
  2 =>  
    object(stdClass)[4]
      public 'id' => int 5
      public 'rang' => int 3
  3 =>  
    object(stdClass)[5]
      public 'id' => int 6
      public 'rang' => int 4
 
int 1003 (var_dump($debug_count)
 
J'ai essayé de modifier les conditions et ça marche de cette façon :

Code :
  1. if ($id && $rang) {
  2.       $debug_count += 1;
  3.       $msg = update_module($id,$rang);
  4. } else {
  5.       $debug_count += 100;
  6.       $msg = insert_module($text,$img,$rang,$datatype);
  7. }


Ce qui est juste embêtant on ne peut pas faire la mise à jour en même que l'insertion. Il faut le faire à chaque fois un après l'autre.


Message édité par mecano31 le 30-08-2017 à 10:37:06
n°2305056
MaybeEijOr​Not
but someone at least
Posté le 30-08-2017 à 13:35:48  profilanswer
 

Pour la condition le problème vient du fait que tu as la valeur de $text qui est nulle.
Il faudrait donc plus quelque chose comme :

Code :
  1. else if ($rang && $datatype && ($img || $text))


 
Qu'est-ce que tu appelles "on ne peut pas faire la mise à jour en même temps que l'insertion" ?


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
n°2305062
mecano31
Posté le 30-08-2017 à 15:18:13  profilanswer
 

Ça très bien avec cette condition : else if ($rang && $datatype && ($img || $text)).
 
Ce que j' appelle "on ne peut pas faire la mise à jour en même temps que l'insertion" c-à-d faire en sorte quand on ajoute un nouveau module, on modifie l'ordre puis on les enregistre en même temps (insertion + mise à jour). D’où l'idée du 2eme 'else if' que j'ai mis précédemment.
 
Merci beaucoup pour ton aide et surtout le précieux temps que tu as consacré pour m'aider.


Message édité par mecano31 le 30-08-2017 à 15:45:54
n°2305065
MaybeEijOr​Not
but someone at least
Posté le 30-08-2017 à 16:10:02  profilanswer
 

Normalement si ça devrait le faire, qu'est-ce qui se passe quand tu le fais? Sinon faut revoir le JS si ça ne va pas.


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Précédente

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Javascript/Node.js

  Ajout nouveau module+sauvegarde en BD

 

Sujets relatifs
ajout d'une valeur dans résultat d'une requête d'une autre tablepython installation module
Pb ajout contact outlookJ'ai besoin d'aide pour mon nouveau projet
module ngramsModule Emailing pour Mailjet
Comment exporter une feuille dans un nouveau fichierImport module ou module.truc ou import*
BD EBPCakeBox ajout d'une fonction renommer
Plus de sujets relatifs à : Ajout nouveau module+sauvegarde en BD



Copyright © 1997-2016 Hardware.fr SARL (Signaler un contenu illicite) / Groupe LDLC / Shop HFR