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 :

Enregistrer des données vers MySQL [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é
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2019
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2019
    Messages : 101
    Par défaut Enregistrer des données vers MySQL
    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
    61
    62
    63
    64
    65
    66
    67
    68
    69
     
    class School {
     
    	protected $_id;
    	protected $_name;
     
    	protected static $error;
     
    	const MESSAGE_ERROR_ID = 'ID doit être un entier.';
    	const MESSAGE_ERROR_TEXT = 'TEXT doit être une chaîne de caractères.';
    	const MESSAGE_ERROR_DATECREATION = 'DATE doit être au format YYYY-MM-DD.';
    	const MESSAGE_ERROR_TITLE = 'TITRE doit être une chaîne de caractères.';
    	const MESSAGE_ERROR_END = 'L\'objet ne peut pas être créé.';
     
    	public function __construct(array $schools) {
     
    		$this->setId($schools['id']);
    		$this->setName($schools['name']);
     
    		if(!empty(self::$error)) {
     
    			throw new Exception(self::$error . self::MESSAGE_ERROR_END);
    		}
    	}
     
    	public function setError($message) {
     
    		self::$error = $message;
    	}
     
    	public function getError() {
     
    		return self::$error;
    	}
     
    	public function setId($id) {
     
    		if((is_int($id)) AND ($id > 0)) {
     
    			$this->_id = $id;
    		}
    		else {
     
    			$this->setError(self::MESSAGE_ERROR_ID);
    		}
    	}
     
    	public function setName($name) {
     
    		if(is_string($name)) {
     
    			$this->_name = $name;
    		}
    		else {
     
    			$this->setError(self::MESSAGE_ERROR_TEXT);
    		}
    	}
     
    	public function getId() {
     
    		return $this->_id;
    	}
     
    	public function getName() {
     
    		return $this->_name;
    	}
    }
    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
     
    class schoolManager {
     
    	private $_bdd;
     
    	public function __construct($bdd) {
     
    		$this->setDb($bdd);
    	}
     
    	public function setDb(PDO $db) {
     
    		$this->__bdd = $db;
    	}
     
    	public function addSchools(School $school) {
     
    		$query = 'INSERT INTO school (name) VALUES(:name)';
    		$stmnt = $this->__bdd->prepare($query);
    		$stmnt->execute([':name' => htmlspecialchars(($school)->getName())]);
    	}
     
    	public function getSchools($id = '') {
     
    		if(empty($id)) {
     
    			$query = 'SELECT id, name FROM school';
                $stmnt = $this->__bdd->prepare($query);
    		}
            elseif(is_numeric($id)) {
     
    			$query = 'SELECT id, name FROM school WHERE id = :id';
    			$stmnt = $this->__bdd->prepare($query);
    			$stmnt->bindParam(':id', $id);
    		}
     
    		$stmnt->execute();
     
    		while($row = $stmnt->fetch(PDO::FETCH_ASSOC)) {
     
    			$results[] = $row;
    		}
     
    		return $results;
    	}
    }
    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
     
    require('class/School.php');
    require('class/schoolManager.php');
     
    try {
     
    	$bdd = new PDO('mysql:host=localhost;dbname=schools', '10111110', '10111110');
    }
     
    catch(Exception $e) {
     
    	'Erreur de connexion : ' . $e->getMessage();
    }
     
    $manager = new schoolManager($bdd);
     
    $schools_data = array(
     
    	1 => array('id' => 1, 'name' => 'Ecole A'),
    	2 => array('id' => 2, 'name' => 'Ecole B'),
    	3 => array('id' => 3, 'name' => 'Ecole C')
    );
     
    $schools = new School($schools_data);
     
    $manager->addSchools($schools);
     
    $school = $manager->getSchools();
    var_dump($school);
    J'ai une table school avec les champs id, name & je dois enregistrer dans name -> Ecole A Ecole B Ecole C mais j'ai ces messages d'erreurs ->

    - Notice: Undefined index: id in C:\wamp64\www\php-expert\07-devoir-1-refait\class\School.php on line 18
    - Notice: Undefined index: name in C:\wamp64\www\php-expert\07-devoir-1-refait\class\School.php on line 19
    - Fatal error: Uncaught Exception: TEXT doit être une chaîne de caractères.L'objet ne peut pas être créé. in C:\wamp64\www\php-expert\07-devoir-1-refait\class\School.php on line 23
    - Exception: TEXT doit être une chaîne de caractères.L'objet ne peut pas être créé. in C:\wamp64\www\php-expert\07-devoir-1-refait\class\School.php on line 23
    Merci à ceux & celles qui pourraient m'apporter leurs aides. Bon Weekend à tous.

  2. #2
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 519
    Par défaut
    Bonjour,

    Tu passes un tableau multidimensionnel dans le constructeur de school, donc il faut le parcourir avec une boucle :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    public function __construct(array $schools) {
          foreach($schools as $index=>$sc){
              $this->setId($sc['id']);
              $this->setName($sc['name']);
          }
    }

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2019
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2019
    Messages : 101
    Par défaut
    Merci à toi, j'ai bien quelque chose qui s'enregistre dans la table school, mais seulement l'école C

  4. #4
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 519
    Par défaut
    La solution la plus simple c'est de remettre ton code du constructeur comme il été au début (sans boucle):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    class School{
       .....
       public function __construct(array $schools) {
            $this->setId($schools['id']);
            $this->setName($schools['name']);
            if(!empty(self::$error)) {
              throw new Exception(self::$error . self::MESSAGE_ERROR_END);
            }
       }
     
    }
    Et après tu utilises la boucle au moment de l’instanciation de l'objet School :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    $schools_data = array(
     1 => array('id' => 1, 'name' => 'Ecole A'),
      2 => array('id' => 2, 'name' => 'Ecole B'),
      3 => array('id' => 3, 'name' => 'Ecole C')
    );
    $manager=new schoolManager($bdd);
     
    /* c'est ici que tu dois utiliser la boucle pour instancier chaque item de $schools_data*/
    foreach($schools_data as $index=>$sc){
    	$school = new School($sc);
    	$manager->addSchools($school);
     
    }
    Après je pense que htmlspecialchars n'a rien à faire ici :$stmnt->execute([':name' => htmlspecialchars(($school)->getName())]);, cette fonction est utilisée lorsqu'on veut sécuriser les données à l'affichage mais pas à l'insertion dans la bd.

    Comme tu peux utiliser la méthode magique __toString() qui permet de retourner une chaîne de caractère personnalisée seulement avec un echo (pas de var_dump() ni print_r() ) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class School{
       .......
       .......
       //Méthode magique permet de retourner des informations sur l'objet crée :
       public function __toString(){
          return "id :".$this->_id.' nom :'.$this->_name;  
      }
    }
    Et dans la boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    foreach($schools_data as $index=>$sc){
         $school = new School($sc);
         $managerSc->addSchools($school);
         echo $school.'<br />';//ce echo fait appel à __toString() de l'objet.
    }

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2019
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2019
    Messages : 101
    Par défaut
    Merci bien ça marche, mais petite question, a propos de htmlspecialchars, je ne comprends pas pourquoi tu me dis que c'est à l'affichage. C'est justement pour éviter les injections sql des utilisateurs mal attentionné donc à l'insertion.

    J'aimerais bien une petite explication de ta part.

    Bonne soirée à toi

  6. #6
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 519
    Par défaut
    Ne t'inquiète pas pour la sécurité, comme tu as préparé ta requête d'insertion alors c'est PDO qui s'en occupe.

    Par-contre quand tu as par exemple un <select> ou n'importe élément html, et que tu veux l'alimenter avec les données de la base, là tu dois utiliser htmlspecialchars pour sécuriser les données à l'affichage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $tag="<select>";
    $while($row=$stmt->fetch(PDO::FETCH_ASSOC)){
         $tag.="<option value="...">".htmlspecialchars($row["name"])."</option>";
    }
    $tag.="</select>";
    echo $tag;
    Pour les caractères spéciaux "éèâ...." tu dois définir le jeu de caractères utf-8 dans l'objet PDO ET utiliser les options pour récupérer les exceptions/erreurs en utilisant PDO::ATTR_ERRMODE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $bdd = new PDO('mysql:host=localhost;dbname=schools;charset=UTF-8', '10111110', '10111110', array(PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION));

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

Discussions similaires

  1. Importer des données vers Mysql workbench
    Par déb_bi dans le forum Développement de jobs
    Réponses: 2
    Dernier message: 23/02/2014, 22h29
  2. Réponses: 0
    Dernier message: 25/01/2014, 14h23
  3. Réponses: 14
    Dernier message: 12/04/2013, 16h23
  4. Comment exporter des données vers MySQL
    Par CinePhil dans le forum Débuter
    Réponses: 4
    Dernier message: 05/06/2012, 18h56
  5. Enregistrer des données dans une table à partir du code
    Par Ragnarok85 dans le forum Access
    Réponses: 4
    Dernier message: 24/01/2007, 13h03

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