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 :

Iinclusion dans une base de données


Sujet :

PHP & Base de données

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 114
    Points : 52
    Points
    52
    Par défaut Iinclusion dans une base de données
    Bonjour à toutes et à tous,

    Dans le but de tirer 10 personnes au sort, j'ai crée 2 classes Eleve avec les attributs (nom, prénom et frequence) et EleveManager avec l'attribut (database) et deux méthodes (getList et updateFrequence).

    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
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
     
    <?php
     
    class Eleve
    {
    	private $_nom;
    	private $_prenom;
    	private $_frequence;
     
    	public function __construct(array $data)
    	{
    		foreach($data as $key =>$value)
    		{
    			$method = 'set'.ucfirst($key);
    			if(method_exists($this, $method))
    			{
    				$this->$method($value);
    			}
    		}
    	}
     
    	/* SETTERS */
     
    	public function setNom($nom)
    	{
    		if(is_string($nom))
    		{
    			$this->_nom = $nom;
    		}
    	}
     
    	public function setPrenom($prenom)
    	{
    		if(is_string($prenom))
    		{
    			$this->_prenom = $prenom;
    		}
    	}
     
    	public function setFrequence($frequence)
    	{
    		if(is_int($frequence) and $frequence >= 0)
    		{
    			$this->_frequence = $frequence;
    		}
    	}
     
    	/* GETTERS */
     
    	public function getNom()
    	{
    		return $this->_nom;
    	}
     
    	public function getPrenom()
    	{
    		return $this->_prenom;
    	}
     
    	public function getFrequence()
    	{
    		return $this->_frequence;
    	}
     
    	/* METHODES*/
     
    	public function gagnerFrequence()
    	{
    		return $this->_frequence ++;
    	}
    }
     
    class ElevesManager
    {
    	private $_db;
     
    	public function __construct($db)
    	{
    		$this->setDb($db);
    	}
     
    	public function setDb($db)
    	{
    		$this->_db = $db;
    	}
     
    	public function getList()
    	{
    		$sql = 'SELECT nom, prenom, frequence FROM premiere_quatre ORDER BY nom';
    		$stmt = $this->_db->prepare($sql);
    		$stmt->execute();
    		while($donnees = $stmt->fetch(PDO::FETCH_ASSOC))
    		{
    			$eleves[] = new Eleve($donnees);
    		}
    		return $eleves;
    	}
     
    	public function updateFrequence(Eleve $eleve)
    	{
    		$sql = 'UPDATE premiere_quatre SET frequence = :frequence WHERE nom = :nom';
    		$stmt = $this->_db->prepare($sql);
    		$stmt->bindParam(':frequence', $eleve->getFrequence(), PDO::PARAM_INT);
    		$stmt->bindParam(':nom', $eleve->getNom(), PDO::PARAM_STR);
    		$stmt->execute();
    	}
     
    }
    ?>
    et la page tirage.php permettant de réaliser le tirage au sort en question :

    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
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
     
    <?php
    ini_set('display_errors', 1);
    require('Eleve_premiere_quatre.php');
    ?>
     
     
    <!DOCTYPE html>
    <html lang="en">
      <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
        <meta name="description" content="">
        <meta name="author" content="">
        <link rel="icon" href="../../favicon.ico">
     
        <title>Exercices PHYSIQUE-CHIMIE</title>
     
        <!-- Bootstrap core CSS -->
        <link href="../css/bootstrap.min.css" rel="stylesheet">
     
        <!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
        <link href="../../assets/css/ie10-viewport-bug-workaround.css" rel="stylesheet">
     
        <!-- Just for debugging purposes. Don't actually copy these 2 lines! -->
        <!--[if lt IE 9]><script src="../../assets/js/ie8-responsive-file-warning.js"></script><![endif]-->
        <script src="../../assets/js/ie-emulation-modes-warning.js"></script>
     
        <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
        <!--[if lt IE 9]>
          <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
          <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
        <![endif]-->
     
        <!-- Custom styles for this template -->
        <link href="../css/carousel.css" rel="stylesheet">
      </head>
    <!-- NAVBAR
    ================================================== -->
      <body>
          <div class="container">
     
    <?php
    $dbh = new PDO('mysql:host=localhost;dbname=lacroix' , 'root', 'root');
    $manager = new ElevesManager($dbh);
    $eleves = $manager->getList();
    echo '<pre>';
    var_dump($eleves);
    $rand_keys = array_rand($eleves, 10);
    ?>
     
    <h1 class="text-center"> Liste d'élèves concernés par les exercices</h1>
     
     
    <div class="col-lg-6">
    	<h2 class="text-center">Générer la liste d'élèves concernés</h2>
    	<form method="post" class="form-group">
    		<input class="form-control" name="envoyer" type="submit" />
    	</form>
    	<?php if(isset($_POST['envoyer'])) : ?>
    			<table class="table table-striped">
    				<thead>
    					<tr>
    						<th class="text-center">Nom</th>
    						<th class="text-center">Prénom</th>
    					</tr>
    				</thead>
    				<?php foreach($rand_keys as $id): ?>
    				<tr>
    					<td class="text-center"><?php echo strtoupper($eleves[$id]->getNom()); ?></td>
    					<td class="text-center"><?php echo $eleves[$id]->getPrenom(); ?></td>
    				</tr>
                    <?php $eleves[$id]->gagnerFrequence(); ?>
                    <?php $manager->updateFrequence($eleves[$id]); ?>
    				<?php endforeach; ?>
    			</table>
    	<?php endif; ?>
    </div>
     
     <div class="col-lg-6">
     	<h2 class="text-center"> BILAN</h2>
     	<table class="table table-striped">
     		<thead>
     			<tr>
     				<th class="text-center">Nom</th>
     				<th class="text-center">Prénom</th>
     				<th class="text-center">Fréquence</th>
     			</tr>
     		</thead>
     			<?php foreach($eleves as $id => $value): ?>
     				<tr>
     					<td class="text-center"><?php echo strtoupper($eleves[$id]->getNom()); ?></td>
     					<td class="text-center"><?php echo $eleves[$id]->getPrenom(); ?></td>
     					<td class="text-center"><?php echo $eleves[$id]->getFrequence(); ?></td>
     				</tr>
     			<?php endforeach; ?>
     	</table>
     </div>
     
     
     
     
     
        </div><!-- /.container -->
     
     
        <!-- Bootstrap core JavaScript
        ================================================== -->
        <!-- Placed at the end of the document so the pages load faster -->
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
        <script>window.jQuery || document.write('<script src="../../assets/js/vendor/jquery.min.js"><\/script>')</script>
        <script src="../js/bootstrap.min.js"></script>
        <!-- Just to make our placeholder images work. Don't actually copy the next line! -->
        <script src="../js/vendor/holder.min.js"></script>
        <!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
        <script src="../js/ie10-viewport-bug-workaround.js"></script>
      </body>
    </html>
    J'ai actuellement 2 problèmes :

    1- Je ne comprends pas pourquoi ma base de donnée ne se remplit pas dans le champ fréquence lors de l'appel de la méthode updateFrequence
    2- De plus lorsque je génère ma liste d'élèves, pourquoi le champ fréquence est désespérément nul alors qu'il y a initialement des valeurs dans ma base de données :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $eleves = $manager->getList();
    echo '<pre>';
    var_dump($eleves);
    Merci d'avance pour vos pistes et bonne journée à tous.

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    La première chose à faire est d'activer les erreurs PDO :
    http://php.net/manual/fr/pdo.error-handling.php
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 114
    Points : 52
    Points
    52
    Par défaut
    Merci

    mais la gestion des erreurs en PDO permet de savoir si la connexion à la base de données s'est bien effectuée avec l'aide du couple try/catch.

    Est-ce que ma fonction updateFrequence peut permettre la modification de la valeur du champ frequence dans la base ?

    Merci

  4. #4
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    La gestion des erreurs PDO permet de détecter toutes les erreurs liées à une fonctionnalité PDO, pas uniquement la connexion, comme par exemple un plantage sur la requête UPDATE...

    Ensuite, je pense qu'il faut que tu fasses fonctionner en premier ta fonction de récupération (getList). Si la récupération ne fonctionne pas correctement, il est possible que tu updates à partir des données fausses...
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 114
    Points : 52
    Points
    52
    Par défaut
    Le bloc try/catch n'a rien fait ressortir...


    Voilà le message d'erreur obtenu :

    Notice: Only variables should be passed by reference in /Applications/MAMP/htdocs/PHP/revisions/school/Eleve_premiere_quatre.php on line 102

    Notice: Only variables should be passed by reference in /Applications/MAMP/htdocs/PHP/revisions/school/Eleve_premiere_quatre.php on line 103


    Je suis à cours d'idée

    Merci de l'aide en tout cas.

  6. #6
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Il n'y a pas besoin de try/catch, il faut seulement activer les exceptions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    Pour l'erreur de passage par référence, utilise binValue au lieu de binParam.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 114
    Points : 52
    Points
    52
    Par défaut
    Cette ligne n'apporte rien:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    je me retrouve avec une valeur pour la fréquence alors que me table au chap fréquence comporte des valeurs.



    Voici les lignes en question :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public function updateFrequence(Eleve $eleve)
    	{
    		$sql = 'UPDATE premiere_quatre SET frequence = :frequence WHERE nom = :nom';
    		$stmt = $this->_db->prepare($sql);
    		$stmt->bindParam(':frequence', $eleve->getFrequence(), PDO::PARAM_INT);
    		$stmt->bindParam(':nom', $eleve->getNom(), PDO::PARAM_STR);
    		$stmt->execute();
    	}

  8. #8
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Utilise bindValue au lieu de bindParam.

    Egalement ta méthode gagnerFrequence() renvoit une valeur mais tu ne la recupères pas.

    Plus simplement peut être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public function gagnerFrequence()
    	{
    		$this->_frequence++;
    	}
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 114
    Points : 52
    Points
    52
    Par défaut
    Merci j'en déduis donc que bindValue c'est pour une valeur et bindParam pour une variable.

    Par contre l'insertion avec UPDATE dans la base de donnée ne fonctionne pas alors que tous les messages d'erreurs ont disparu. De plus je ne comprends toujours pas pourquoi lorsque je génère la liste, il refuse de me donner les valeurs de fréquence :

    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
     
    <?php
    try
    {
        $dbh = new PDO('mysql:host=localhost;dbname=lacroix' , 'root', 'root');
        $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $manager = new ElevesManager($dbh);
        $eleves = $manager->getList();
        $rand_keys = array_rand($eleves, 10);
    }
    catch(Exception $e)
    {
        echo $e->getMessage();
    }
    ?>
    avec getList

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public function getList()
    	{
    		$sql = 'SELECT nom, prenom, frequence FROM premiere_quatre ORDER BY nom';
    		$stmt = $this->_db->prepare($sql);
    		$stmt->execute();
    		while($donnees = $stmt->fetch(PDO::FETCH_ASSOC))
    		{
    			$eleves[] = new Eleve($donnees);
    		}
    		return $eleves;
    	}

  10. #10
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Ajoute également
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);
    sinon tu ne recupereras pas un entier de ta requête pour la fréquence.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 114
    Points : 52
    Points
    52
    Par défaut
    Ca marche !!! Merci

    Par contre ma curiosité est éveillé concernant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);
    pour lequel je ne trouve pas de signification claire...

    Avec True (de base) c'est un simulacre de prepare
    1) le prepare est gardé au chaud par PDO
    2) a l'exec PDO envoie le tout a MySql qui transmets a SQL ...
    donc pour SQL tout se passe comme si prepare n'avait pas eu lieu

    Avec False c'est le vrai prépare
    1) le prépare est envoyé a MySql qui le soumet a SQL le prépare est testé et pret a recevoir autant que voulu des exec !
    2) l'exec n'envoie donc que des variables qui sont sécurisées.

  12. #12
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    C'est ça sauf que "SQL" c'est le nom du langage des requêtes.

    Cette option servait pour mysql < 4.1 qui ne gérait pas les requêtes préparées. Malheureusement 13 ans après, pour PHP, c'est toujours l'option par défaut.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 114
    Points : 52
    Points
    52
    Par défaut
    Ce qu'il y a de paradoxal, c'est que j'avais il y'a quelques mois testé le tuto POO et ce dernier, lors de l'utilisation des requêtes préparées, pour obtenir la liste des personnages accompagnées de leurs caractéristiques n'utilisait pas une telle option...

    En tout cas merci pour votre aide... J'ai au moins saisi clairement la diff' en bindValue et BindParam

Discussions similaires

  1. intégrer un fichier image dans une base de donnée?
    Par Lody dans le forum Requêtes
    Réponses: 9
    Dernier message: 16/03/2006, 19h08
  2. inserer des images dans une base de données
    Par alilou04 dans le forum Bases de données
    Réponses: 2
    Dernier message: 28/06/2004, 18h54
  3. les images dans une base de données
    Par houhou dans le forum Bases de données
    Réponses: 8
    Dernier message: 22/06/2004, 14h27
  4. [SYBASE]Libérer espace libre dans une base de données ?
    Par le_parrain dans le forum Sybase
    Réponses: 3
    Dernier message: 14/05/2004, 09h36
  5. [Strategie][Java][XML] Import dans une base de données
    Par nad dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 23/09/2002, 11h12

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