Ajout dans un tableau

pinkettee Messages postés 36 Date d'inscription mercredi 7 mars 2012 Statut Membre Dernière intervention 10 février 2013 - 21 août 2012 à 23:21
TychoBrahe Messages postés 1309 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 5 juin 2013 - 30 août 2012 à 14:19
Salut à tous,
J'ai un souci concernant un code d'ajout dans un tableau en phpmysql.
j'ai fait un model de tableau qui me fait l'affichage des differents tabeaux selon leur nombre de ligne, leur titre, nombre de cellule...(tout ca est dans la base de données)
A chaque appel de la meme fonction avec un parametre different j'ai un affichage de tableau different d'apres ce que j'ai dans le contenu de la base. le tableau est affiché d'apres la bd

le probleme qui se pose c'est quand je veux remplir le tableau et ajouter le contenu dans la base
l'ajout ne s'effectue pas, je sais pas comment y procédér

Voila mes tables :
cellule(idcellule, nom_cell, taillcel)
nom_cell: c'est le nom de la cellule du tableau exp (diplomes obtenus, annee, ecole..)
tailcel : c'est la taille de la cellule sa longueur

titre(idtitre, nomtitre, nbrligne, numtitre)
nomtitre : c'est l'entete du tableau exp(formation academique)
nbrligne : c'est le nombre de ligne qu'ilfaut remplir dans un tableau

titre_cellule(titre_idtitre, cellule_idcellule)
information(idinformation,idcellule,idmembre,contenu)
contenu: c'est les champs qu'on doit remplir dans un tableau,c'est le contenu du tableau.
Voila le code :
<?php
class Connexion{
    static function Connect(){
        $Base= new PDO("mysql:host=localhost;dbname=gestioncv","root","");
        $Base->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        return $Base;
    }
}
class Model{
    function base($titre){
        $req = Connexion::Connect()->prepare("SELECT *FROM titre_cellule, titre, cellule 
                    WHERE titre.idtitre     = titre_cellule.titre_idtitre     AND
                    cellule.idcellule       = titre_cellule.cellule_idcellule AND
                    titre.idtitre = :titre ");
        $req->execute(array('titre' => $titre));
        $res = $req->fetchAll();
        return $res;
    }
    function AjoutTableau($idtitre){
$titre = $this->base($idtitre);
      ?>
<form name="form" method="post" action="#">	  
        
<?php
        echo '';
echo '----
';
foreach ($this->base($idtitre) as $valeur){

echo ''.$valeur['nom_cell'].', ';

}
echo '';
$nbrligne = $this->base($idtitre);
for($i=1; $i<= $nbrligne[0]['nbrligne']; $i++ ){
echo '----
';
foreach ($this->base($idtitre) as $valeur){
echo '';
echo'';

echo ', ';
}
echo '';

}
echo ''.$titre[0]['numtitre'].'-'.$titre[0]['nomtitre'].'
' ;

echo '
'; ?>


    </form>
<?php
    }
}
?>


<?php
$c = new Model();
$c->AjoutTableau(1);
?>



    <?php        
if(isset($_POST['submit']))
{

$cellule=trim($_POST['cellule']);

$inscpt=mysql_query("INSERT INTO information VALUES('','1','2','2','$cellule')");

die('Ajout terminé');

}
 
?>



Je sais pas comment faire l'ajout dans un tableau qui a plusieurs champs de meme nom :/ Si quelqu'un pourrait m'aider Svp ^^

9 réponses

TychoBrahe Messages postés 1309 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 5 juin 2013 12
22 août 2012 à 18:22
Salut,

Pourquoi diable est-ce que tu veux utiliser mysql_query() alors que tu utilises PDO ? Vire le donc et utilises PDO tout du long ! J'en profite pour te dire que ta classe Connexion est très mal fichue… si encore ça avait été un singleton je dis pas, mais là c'est pas cool quoi, c'est vraiment pas adapté à ton cas. Sinon juste comme ça, fermer le pseudo-balise php, mettre du html puis la ré-ouvrir… non quoi, c'est franchement dégueu ! Les echo de html c'est super moche aussi mais ça passe encore, il faudrait sérieusement que tu te mettes aux templates.

Bref, quelques conseils :
- Dégage la création de ton objet PDO de cette "classe" et met ça dans une super-globale (genre $GLOBALS['my_app']['db']). Je sais, certains gueuleront sur les globales, mais ici ça se justifie.
- Utilises les prepared statements de PDO afin de faire ton insert.
- Enlève tous ce qui ferme et réouvre la pseudo-balise php, c'est franchement hideux et on ne s'y retrouve plus. Limite continue à faire des echo pour le moment, mais à l'avenir fais des templates.
0
Iwoks Messages postés 11 Date d'inscription mercredi 18 octobre 2006 Statut Membre Dernière intervention 27 août 2012 1
24 août 2012 à 17:11
Bonjour,

Je ne veux pas passer pour en remettre une couche. Mais je suis assez d'accord avec TychoBrahe. Après c'est peut-être une question de goût mais essaye plutôt les boucles while au foreach. Et plutôt que d'utiliser des echos. Mets ce que tu veux <> dans des variables.

Et oui, ton problème est que tu utilise mysql_query au lieu de
 $req = Connexion::Connect()->prepare("INSERT INTO information VALUES('','1','2','2','$cellule')");
$req->execute();


Enfin quelques choses comme ça.
0
TychoBrahe Messages postés 1309 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 5 juin 2013 12
24 août 2012 à 17:18
Salut,

$req =  Connexion::Connect()->prepare("INSERT INTO information VALUES('','1','2','2','$cellule')");
$req->execute();

Heu, c'est à ne surtout pas faire ! Tu perd tout l’intérêt des prepared statement, du coup c'est la porte ouverte aux injections sql et compagnie. Sérieux, ne fais JAMAIS ça. Et en plus, si on conserve cette méthode statique naze on va rappeler la connexion à chaque fois…

La bonne solution est la suivante :
<?php
$req  = $GLOBALS['my_app']['db']->prepare("INSERT INTO information VALUES('','1','2','2',:cell)");
$req->bindParam(':cell', $cellule, PDO::PARAM_STR);
$req->execute();

Et encore on devrais rajouter la gestion des erreurs après.
0
Iwoks Messages postés 11 Date d'inscription mercredi 18 octobre 2006 Statut Membre Dernière intervention 27 août 2012 1
26 août 2012 à 23:43
Salut,

Oui, tu as raisons, de souligner le problème XSS.
De plus, je ne connaissais pas cette écriture.
Intéressant, il faudrait donc que je me mette à PDO.

Cordialement.
F.THERET
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
TychoBrahe Messages postés 1309 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 5 juin 2013 12
26 août 2012 à 23:52
Salut,

Le XSS c'est encore un autre problème, en effet il serait bon de le préciser. Il y a pas mal d'autres choses sur lesquelles faire attention, voici quelques bases : PHP, MySQL Et La Sécurité.
0
pinkettee Messages postés 36 Date d'inscription mercredi 7 mars 2012 Statut Membre Dernière intervention 10 février 2013
28 août 2012 à 02:12
Salut,
Merci pour vos réponses, mais j'ai toujours le probleme de l'ajout mais cette fois-ci au niveau de l'affichage dans la base de données, l'operation d'ajout ne se fait pas comme il le faut..

Chaque colonne du tableau est identifié par un "idcellule"
lorsque je remplie toutes les champs(colonnes) du tableau de la meme ligne
il y'a un ajout dans la table de la base de données mais juste le dernier "element" (le dernier champs de chaque ligne) qui est affiché plusieurs fois aux nombre d'idcellule qui existe
j'ai pas l'ajout du contenu de chaque champ remplie au tableau :/

Voila le code que j'ai fait :
 function add($idtitre){
        
        if(isset($_POST['valider'])){
    
    
        $nbrligne = $this->base($idtitre);
        for($i=1; $i<= $nbrligne[0]['nbrligne']; $i++ ){
                foreach ($this->base($idtitre) as $valeur){
$idmembre = $_SESSION['idmembre'];
$contenu   = $_POST[''.$valeur['idtitre'].$i];
                    //print_r($contenu);
                    $idcellule = $valeur['cellule_idcellule'];
                    Connexion::Connect()->exec("INSERT INTO informations VALUES('','$idcellule','$idmembre','$i','$idtitre','$contenu')");	
                     }     
        }
        
    }
}


Si vous pouvez m'aider svp ^^
0
TychoBrahe Messages postés 1309 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 5 juin 2013 12
28 août 2012 à 09:55
Salut,

Connexion::Connect()->exec("INSERT INTO informations VALUES('','$idcellule','$idmembre','$i','$idtitre','$contenu')");

NON !!!

Lis mes messages précédent, c'est à ne surtout pas faire ! Jamais au grand jamais tu ne dois faire ça, c'est exactement la raison pour laquelle il ne faut pas utiliser les fonctions mysql_*. Avec PDO on fais des prepared statement, comme dans mon exemple plus haut.

Sinon, explique donc un peu plus ce que tu voullais faire stp, et montre nous ton code modifié. Perso j'ai pas très bien compris ce que viens faire l'insert si tu veux afficher quelque chose.
0
pinkettee Messages postés 36 Date d'inscription mercredi 7 mars 2012 Statut Membre Dernière intervention 10 février 2013
28 août 2012 à 13:18
$req = $GLOBALS['my_app']['db']->prepare("INSERT INTO information VALUES('','1','2','2',:cell)");
$req->bindParam(':cell', $cellule, PDO::PARAM_STR);
$req->execute();


J'ai pas su quoi mettre dans " my_app" dans cette ligne $req = $GLOBALS['my_app']

Sinon pour mon code j'ai pas changé grand chose, j'ai ajouté la fonction add() que je viens de vous faire passer le code ^^

n'empeche voila tout le code :
<?php
session_start();
class Model{
    function base($titre){
        $req = Connexion::Connect()->prepare("SELECT *FROM titre_cellule, titre, cellule 
                    WHERE titre.idtitre     = titre_cellule.titre_idtitre     AND
                    cellule.idcellule       = titre_cellule.cellule_idcellule AND
                    titre.idtitre = :titre ");
        $req->execute(array('titre' => $titre));
        $res = $req->fetchAll();
        return $res; 
    }
    function AjoutTableau($idtitre){
$titre = $this->base($idtitre);
        
        
        echo '';
echo '----
';
foreach ($this->base($idtitre) as $valeur){

echo ''.$valeur['nom_cell'].', ';

}
echo '';
$nbrligne = $this->base($idtitre);
for($i=1; $i<= $nbrligne[0]['nbrligne']; $i++ ){
echo '----
';
foreach ($this->base($idtitre) as $valeur){
echo '';
echo'';
//echo'';

echo ', ';
}
echo '';

}
echo '
';
echo '
';echo '
';echo '
';
echo ''.$titre[0]['numtitre'].'-'.$titre[0]['nomtitre'].'
' ;
echo '
';
    }
    function add($idtitre){
        
        if(isset($_POST['valider'])){
    
    
        $nbrligne = $this->base($idtitre);
        for($i=1; $i<= $nbrligne[0]['nbrligne']; $i++ ){
                foreach ($this->base($idtitre) as $valeur){
$idmembre = $_SESSION['idmembre'];
$contenu   = $_POST[''.$valeur['idtitre'].$i];
                    //print_r($contenu);
                    $idcellule = $valeur['cellule_idcellule'];

$req = $GLOBALS['my_app']['gestioncv']->prepare("INSERT INTO informations VALUES('','$idcellule','$idmembre','$i','$idtitre','$contenu')");
$req->bindParam('$contenu', $cellule, PDO::PARAM_STR);
$req->execute();

                     }     
        }
       


    }
}
}
$c = new Model();
?>
    <form method="post" action="#"> 
<?php
        $c->AjoutTableau(1);
        $c->AjoutTableau(2);
        $c->add(1);
        $c->add(2);
?>
        

        
    </form>


Quand je click sur le button "valider" pour ajouter les données du tableau et
lorsque je consulte ma table "informations" dans phpmyadmin je remarque que l'ajout ne s'est pas éffectué
correctement
autrement dit j'ai ce tableau et je veux ajouté ces données

____________________________________________
Diplomes | Annee | Etablisement | Filière |
____________________________________________
xxxxx | 2012 | yyyyy | math |
____________________________________________
zzzzz | 2013 | kkkk |sport |

lorsque j'execute le code de l'ajout, j'ai dans la table informations au niveau de l'attribut "contenu"
math est affiché 4 fois (le nbr de idcellule)
car diplomes idcellule1
annee idcellule 2
etablissement idcellule3
filiere idcellule 4
donc dans ma table j'ai que le dernier champ (math) qui est ajouté 4 fois et de meme pour "sport" affiché au nbr de l 'idcellule.
j'ai pas l'ajout de chaque champ dans la table

la table que j'utilise est
informations( idinformations, idcellule, idmembre, ligne, idtitre, contenu)

J'espère d'avoir été clair ^^
0
TychoBrahe Messages postés 1309 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 5 juin 2013 12
30 août 2012 à 14:19
Salut,

J'ai pas su quoi mettre dans " my_app" dans cette ligne $req = $GLOBALS['my_app']

La réponse est dans un de mes posts plus haut. Je cite :
Dégage la création de ton objet PDO de cette "classe" et met ça dans une super-globale (genre $GLOBALS['my_app']['db']). Je sais, certains gueuleront sur les globales, mais ici ça se justifie.


$req = $GLOBALS['my_app']['gestioncv']->prepare("INSERT INTO informations VALUES('','$idcellule','$idmembre','$i','$idtitre','$contenu')");
$req->bindParam('$contenu', $cellule, PDO::PARAM_STR);
$req->execute();

Non. Regarde bien ce que j'ai fais et essaye de reproduire. Regarde également la doc de PDO si besoin est. En tout cas il va bien falloir que tu te sorte de la tête une bonne fois pour toute l'idée de concaténer toi même des chaînes provenant des utilisateurs afin de faire ta requête SQL : ce n'est pas comme ça qu'il faut faire ! Et quand je dis concaténer, ça comprend l'opérateur de concaténation mais également tout ce qui en dérive, tel que l'expansion des variables (ce que tu as fait) grâce aux double quotes et tout autre procédé.

Allez, corrige donc déjà tout ça, et après on verra la suite.
0
Rejoignez-nous