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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 114
    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
    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 confirmé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 114
    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 : 40
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    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 confirmé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 114
    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
    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

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