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

EDI, CMS, Outils, Scripts et API PHP Discussion :

[eCommerce] Système de devis PHP + MySQL


Sujet :

EDI, CMS, Outils, Scripts et API PHP

  1. #1
    Membre à l'essai
    Homme Profil pro
    Autodidacte
    Inscrit en
    Juin 2015
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2015
    Messages : 15
    Points : 10
    Points
    10
    Par défaut [eCommerce] Système de devis PHP + MySQL
    Bonjour à toute la communauté.

    Je viens de suivre un tuto vidéo sur un site mais je rencontre pas mal d'erreurs et à vrai dire, je ne sais pas par où commencer...
    Je suis preneur de toutes les infos et de tous les conseils...
    J'ai des erreurs de type 'unexpected public', unexpected ')' etc...

    Voici mes fichiers :

    index.php
    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
     
    <?php 
    	require '_access.php';
    ?>
    <!DOCTYPE html>
    <html lang="fr">
    <meta charset="utf-8">
    <head>
    <title></title>
    </head>
    <body>
     
    <header>
    	<span id="count"><?= $basket->count(); ?></span>
    	<span id="total"><?= number_format($basket->total(),2,',',' '); ?></span>
    </header>
     
     
    <?php $products = $DB->query('SELECT description,price FROM products'); ?>
    <?php foreach ( $products as $product ): ?>
    	<table width="500" border="1">
    		<tr>
    			<td width="400"><?= $product->description; ?></td>
    			<td width="75" align="right"><b><?= number_format($product->price,2,',',' '); ?> &euro;</b></td>
    			<td width="25" align="center"><a class="addbasket" href="addbasket.php?id=<?= $product->id; ?>">+</a></td>
    		</tr>
    	</table>
     
    <?php endforeach ?>
     
     
    <footer>
    <script type="text/javascript" src="js/jquery.min.js"></script>
    <script type="text/javascript" src="js/addbasket.js"></script>
    </footer>
     
    </body>
    </html>
    _access.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <?php
    require 'class.db.php';
    require 'class.basket.php';
    $DB = new DB();
    $basket = new basket($DB);
    ?>
    class.db.php
    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
     
    <?php
    class DB{
    	private $host = 'localhost';
    	private $username = 'root';
    	private $password = '';
    	private $database = 'dbmysql';
    	private $db;
     
    	public function __construct($host = null, $username = null, $password = null, $database = null){
    		if($host != null){
    			$this->host = $host;
    			$this->username = $username;
    			$this->password = $password;
    			$this->database = $database;
    		}
    		try{
    		$this->db = new PDO('mysql:host='.$this->host.';dbname='.$this->database, $this->username, $this->password, 
    					  array(
    					  	PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES UTF8',
    					  	PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING
    					  	));
    		}
    		catch(PDOException $e){
    			die('La connexion &agrave; la base de donn&eacute;e a rencontr&eacute;e une erreur.<br \>Nous faisons notre possible pour r&eacute;tablir la connexion.<br \>Merci pour votre compr&eacute;hension.');
    		}
    	}
     
    	public function query($sql, $data = array()){
    		$req=$this->db->prepare($sql);
    		$req->execute($data);
    		return $req->fetchAll(PDO::FETCH_OBJ);
    	}
    }
    ?>
    class.basket.php
    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
     
    <?php
    ////////////////////////////////////////////////////////////////////////////
    	class basket{
     
    		private $DB;
     
    		public function __construct($DB){
    			if(!isset($SESSION)){
    				session_start();
    			}
    			if(!isset($_SESSION['basket'])){
    				$_SESSION['basket'] = array();
    			}
    			$this->DB = $DB;
     
    			if(isset($_GET['delbasket'])){
    				$this->del($_GET['delbasket']);
    			}
    			if(isset($_POST['basket']['quantity'])){
    				$this->recalc();
    			}
    		}
     
    /////////ACTIONS SUR LE DEVIS///////////////////////////////////////////////
     
    // AJOUTE addbasket.php
    		public function add($product_id){
    			if(isset($_SESSION['basket'][$product_id])){
    				$_SESSION['basket'][$product_id]++;
    			}else{
    				$_SESSION['basket'][$product_id] = 1;
    			}
    		}
     
    // SUPPRIME basket.php
    		public function del($product_id){
    			unset($_SESSION['basket'][$product_id]);
    		}
    	}
     
    // COMPTE basket.php
    		public function count(){
    			return array_sum($_SESSION['basket']);
    		}
     
    // RECALCUL basket.php
    		public function recalc(){
    			foreach($_SESSION['basket'] as $product_id => $quantity){
    				if(isset($_POST['basket']['quantity'][$product_id])){
    					$_SESSION['basket'][$product_id] = $_POST['basket']['quantity'][$product_id];
    				}
    			}
    		}
     
    // TOTAL basket.php
    		public function total(){
    			$total = 0;
    			$ids = array_keys($_SESSION['basket']);
    				if(empty($ids)){
    					$products = array();
    				}else{
    					$products = $this->DB->query('SELECT id,price FROM products WHERE id IN ('.implode(',', $ids).')');
    				}
    			foreach ($products as $product){
    				$total += $product->price * $_SESSION['basket'][$product->id];
    			}
    			return $total;
    		}
     
    ////////////////////////////////////////////////////////////////////////////
    ?>
    addbasket.php
    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
     
    <?php
    	require '_access.php';
    	$json = array('error' => true);
    	if(isset($_GET['id'])){
    		$product = $DB->query('SELECT id FROM products WHERE id=:id', array('id' => $_GET['id']));
    		if(empty($product)){
    			$json['message'] = "Vous avez s&eacutelectionn&eacute; un produit inexistant!";
    		}
    		$basket->add($product[0]->id);
    		$json['error'] = false;
    		$json['total'] = number_format($basket->total(),2,',',' ');
    		$json['count'] = $basket->count();
    		$json['message'] = 'Votre choix a bien &eacute;t&eacute; pris en compte pour votre devis!';
    	}else{
    		$json['message'] = "Vous n&acute;avez pas s&eacutelectionn&eacute; de produit!";
    	}
    	echo json_encode($json);
    ?>
    basket.php
    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
     
    <?php require '_access.php';?>
     
    <?php
    	$ids = array_keys($_SESSION['basket']);
    	if(empty($ids)){
    		$products = array();
    	}else{
    			$products = $DB->query('SELECT description,price FROM products WHERE id IN ('.implode(',', $ids).')');
    	}
    	foreach ($products as $product):
    ?>
     
    Votre devis compte <?= $basket->count(); ?> produits :<br \><br \>
    <form method="post" action="basket.php">
    <table width="500" border="0">
    <tr> <!-- ligne 1 -->
        <td align="left" valign="middle">Description du produit</td>
        <td width="25" align="center" valign="middle">Nombre d'heures estim&eacute;(*)</td>
        <td width="100" align="right" valign="middle">Prix TTC en &euro;uros</td>
        <td width="25" align="center" valign="middle"></td>
      </tr>
      <tr> <!-- ligne 2 -->
        <td align="left" valign="middle"><?= $product->description; ?></td>
        <td width="25" align="center" valign="middle"><span class="quantity"><input type="text" name="basket[quantity][<?= $product->id; ?>" value="<?= $_SESSION['basket'][$product->id];?>"></span></td>
        <td width="100" align="right" valign="middle"><b><?= number_format($product->price,2,',',' '); ?> &euro;</b></td>
        <td width="25" align="center" valign="middle"><a href="basket.php?delbasket=<?= $product->id; ?>">-</a></td>
      </tr>
      <tr> <!-- ligne 3 -->
        <td colspan="3" align="right" valign="middle"><h1><?= number_format($basket->total(),2,',',' '); ?> &euro; TTC</h1></td>
      </tr>
    </table>
    <?php endforeach ?>
    <input type="submit" value="Recalculer le devis">
    </form>
    <a href="index.php">Continuer mon devis</a>
    addbasket.js
    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
     
    (function($){
     
    	$('.addbasket').click(function(event){
    		event.preventDefault();
    		$.get($(this).attr('href'),{},function(data){
    			if(data.error){
    				alert(data.message);
    			}else{
    				if(confirm(data.message + '. Souhaitez-vous consulter votre devis?')){
    					location.href = 'basket.php';
    				}else{
    					$('#total').empty().append(data.total);
    					$('#count').empty().append(data.count);
    				}
    			}
    		},'json');
    		return false;
    	});
     
    })(jQuery);
    et dbmysql.sql
    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
     
    -- phpMyAdmin SQL Dump
    -- version 4.1.4
    -- http://www.phpmyadmin.net
    --
    -- Client :  
    -- Généré le :  Ven 21 Août 2015
    -- Version du serveur :  5.6.15-log
    -- Version de PHP :  5.4.24
     
    SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
    SET time_zone = "+00:00";
     
     
    /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
    /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
    /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
    /*!40101 SET NAMES utf8 */;
     
    -- Base de données :  `dbmysql`
    --
     
    -- --------------------------------------------------------
     
    --
    -- Structure de la table `products`
    --
     
    CREATE TABLE IF NOT EXISTS `products` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `designation` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
      `description` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
      `price` float NOT NULL DEFAULT '0',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=18 ;
     
    --
    -- Contenu de la table `products`
    --
     
    INSERT INTO `products` (`id`, `ref`, `description`, `price`) VALUES
    (1, 'ref1', 'produit A', 10),
    (2, 'ref2', 'produit B', 8);
    Ca fait 2 jours que je refait le tutoriel et là je commence à être désespéré :-(
    Si quelqu'un peut m'aider ce serait top! Merci d'avance

  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
    Sans nous donner les erreurs exactes c'est difficile de te répondre.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre à l'essai
    Homme Profil pro
    Autodidacte
    Inscrit en
    Juin 2015
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2015
    Messages : 15
    Points : 10
    Points
    10
    Par défaut
    Salut sabotage

    Bien vu !
    Voici la première erreur :


    Parse error: syntax error, unexpected 'public' (T_PUBLIC) in C:\Program Files (x86)\EasyPHP-DevServer-14.1VC9\data\localweb\projects\devis\class.basket.php on line 42

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    la première chose à faire est d'apprendre à lire et comprendre les messages d'erreur.
    Citation Envoyé par Goldo974 Voir le message
    Parse error: syntax error, unexpected 'public' (T_PUBLIC) in C:\Program Files (x86)\EasyPHP-DevServer-14.1VC9\data\localweb\projects\devis\class.basket.php on line 42
    Dans le fichier class.basket.php, on trouve une chaine 'public' inattendue, à la ligne 42.

    • on regarde à cette ligne : rien de spécial.
    • on lève les yeux (car l'erreur peut être dans les LIGNES PRÉCÉDENTES) : on remarque une accolade fermante en trop.


    EUREKA !


    N.B. Cela fait partie du B-A-BA du débogage.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Autodidacte
    Inscrit en
    Juin 2015
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2015
    Messages : 15
    Points : 10
    Points
    10
    Par défaut
    Merci jreaux62 tu as raison !!!!!

    1ere erreur résolu
    Voici la seconde :
    Warning: PDOStatement::execute(): SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 1 in C:\Program Files (x86)\EasyPHP-DevServer-14.1VC9\data\localweb\projects\devis\class.db.php on line 30
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    // AJOUTE addbasket.php
    		public function add($product_id){
    			if(isset($_SESSION['basket'][$product_id])){
    				$_SESSION['basket'][$product_id]++;
    			}else{ //ligne 30 sur mon fichier
    				$_SESSION['basket'][$product_id] = 1;
    			}
    		}

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bon.

    Apparemment, tu dois aussi apprendre à LIRE... ou t'acheter des yeux puisque tu te trompes de fichier !

    Là, on a une erreur de syntaxe SQL dans le fichier class.db.php (!!) à la ligne 30.

    On va donc afficher, en cas d'erreur, la requête $req et les paramètres transmis $data, pour voir ce qui cloche.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    	public function query($sql, $data = array()){
    		$req=$this->db->prepare($sql);
    		try{
    		   $req->execute($data);
    		catch(PDOException $e){
    		   die('Erreur dans la requete :<br />'.$sql.'<br />'.var_dump($data);
    		}
    		return $req->fetchAll(PDO::FETCH_OBJ);
    	}
    N.B. Afficher les données/variables pour vérifier de qu'elles contiennent fait AUSSI partie du B-A-BA du débogage...

  7. #7
    Membre à l'essai
    Homme Profil pro
    Autodidacte
    Inscrit en
    Juin 2015
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2015
    Messages : 15
    Points : 10
    Points
    10
    Par défaut
    Resalut, effectivement je me suis trompé de fichier...

    Néanmois si t'es toujours ok pour m'aider voici, après ajout de ta fonction le retour:

    Warning: PDOStatement::execute(): SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 1 in C:\Program Files (x86)\EasyPHP-DevServer-14.1VC9\data\localweb\projects\devis\class.db.php on line 36

    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
     
    <?php
    class DB{
    	private $host = 'localhost';
    	private $username = 'root';
    	private $password = '';
    	private $database = 'codingraphix';
    	private $db;
     
    	public function __construct($host = null, $username = null, $password = null, $database = null){
    		if($host != null){
    			$this->host = $host;
    			$this->username = $username;
    			$this->password = $password;
    			$this->database = $database;
    		}
    		try{
    		$this->db = new PDO('mysql:host='.$this->host.';dbname='.$this->database, $this->username, $this->password, 
    					  array(
    					  	PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES UTF8',
    					  	PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING
    					  	));
    		}
    		catch(PDOException $e){
    			die('La connexion &agrave; la base de donn&eacute;e a rencontr&eacute;e une erreur.<br \>Nous faisons notre possible pour r&eacute;tablir la connexion.<br \>Merci pour votre compr&eacute;hension.');
    		}
    	}
     
    	/*public function query($sql, $data = array()){
    		$req=$this->db->prepare($sql);
    		$req->execute($data);
    		return $req->fetchAll(PDO::FETCH_OBJ);
    	}*/
    	public function query($sql, $data = array()){
    		$req=$this->db->prepare($sql);
    		try{
    		   $req->execute($data);
    		}
    		catch(PDOException $e){
    		   die('Erreur dans la requete :<br />'.$sql.'<br />'.var_dump($data));
    		}
    		return $req->fetchAll(PDO::FETCH_OBJ);
    	}
    }
    ?>

  8. #8
    Invité
    Invité(e)
    Par défaut
    Intervertis les lignes (apparemment, c'est au niveau du prepare(...) ):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    		try{
    		  $req=$this->db->prepare($sql);
    		  ......
    N.B. HE !! Je ne vais pas tout faire à ta place !!!

    Tu devrais être capable de déboguer un minimum tout seul !
    • mettre un echo ou un var_dump()
    • mettre un try catch au bon endroit
    • ...

Discussions similaires

  1. Devis version PHP/MYSQL/CSS site en flash
    Par djoyeux dans le forum Devis
    Réponses: 1
    Dernier message: 17/09/2007, 08h31
  2. Devis pour un site d'appels d'offres en php/mysql
    Par domdas dans le forum Devis
    Réponses: 1
    Dernier message: 04/12/2006, 15h49
  3. [eCommerce] Un script de e-commerce en PHP/MySQL ?
    Par Anne1969 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 6
    Dernier message: 16/03/2006, 11h07

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