Erreur update

Eléphant du PHP | 257 Messages

16 mars 2017, 17:01

Bonjour une petite idée de cette erreur ? merci de m'éclairer

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens' in C:\Program Files\EasyPHP-5.3.8.1\www\source\add_club.php:109 Stack trace: #0 C:\Program Files\EasyPHP-5.3.8.1\www\source\add_club.php(109): PDOStatement->execute(Array) #1 {main} thrown in C:\Program Files\EasyPHP-5.3.8.1\www\source\add_club.php on line 109

Mammouth du PHP | 873 Messages

16 mars 2017, 17:25

avec du code, ce serait mieux.
le nombre de paramètres dans la requête est différent de celui passé lors de l'exécution.

Eléphant du PHP | 257 Messages

17 mars 2017, 10:05

bonjour voilà le code sorry.
$pseudo = filter_input(INPUT_POST, 'pseudo');
$id_membre = filter_input(INPUT_POST, 'id_membre');

$nom = filter_input(INPUT_POST, 'nom');
$adresse = filter_input(INPUT_POST, '$adresse');
$ville = filter_input(INPUT_POST, 'ville');
$cp = filter_input(INPUT_POST, 'cp');
$pays = filter_input(INPUT_POST, 'pays');
$region = filter_input(INPUT_POST, 'region');
$tel = filter_input(INPUT_POST, 'tel');
$gsm = filter_input(INPUT_POST, 'gsm');
$mail = filter_input(INPUT_POST, 'mail');
$web = filter_input(INPUT_POST, 'web');

$lundi = filter_input(INPUT_POST, 'lundi');
$lutype = filter_input(INPUT_POST, 'lutype');
$luprixcpl = filter_input(INPUT_POST, 'luprixcpl');
$luprixf = filter_input(INPUT_POST, 'luprixf');
$luprixtv = filter_input(INPUT_POST, 'luprixtv');
$luprixh = filter_input(INPUT_POST, 'luprixh');

$mardi = filter_input(INPUT_POST, 'mardi');
$martype = filter_input(INPUT_POST, 'martype');
$marprixcpl = filter_input(INPUT_POST, 'marprixcpl');
$marprixf = filter_input(INPUT_POST, 'marprixf');
$marprixtv = filter_input(INPUT_POST, 'marprixtv');
$marprixh = filter_input(INPUT_POST, 'marprixh');

$mercredi = filter_input(INPUT_POST, 'mercredi');
$mertype = filter_input(INPUT_POST, 'mertype');
$merprixcpl = filter_input(INPUT_POST, 'merprixcpl');
$merprixf = filter_input(INPUT_POST, 'merprixf');
$merprixtv = filter_input(INPUT_POST, 'merprixtv');
$merprixh = filter_input(INPUT_POST, 'merprixh');

$jeudi = filter_input(INPUT_POST, 'jeudi');
$jeutype = filter_input(INPUT_POST, 'jeutype');
$jeuprixcpl = filter_input(INPUT_POST, 'jeuprixcpl');
$jeuprixf = filter_input(INPUT_POST, 'jeuprixf');
$jeuprixtv = filter_input(INPUT_POST, 'jeuprixtv');
$jeuprixh = filter_input(INPUT_POST, 'jeuprixh');

$vendredi = filter_input(INPUT_POST, 'vendredi');
$ventype = filter_input(INPUT_POST, 'ventype');
$venprixcpl = filter_input(INPUT_POST, 'venprixcpl');
$venprixf = filter_input(INPUT_POST, 'venprixf');
$venprixtv = filter_input(INPUT_POST, 'venprixtv');
$venprixh = filter_input(INPUT_POST, 'venprixh');

$samedi = filter_input(INPUT_POST, 'samedi');
$samtype = filter_input(INPUT_POST, 'samtype');
$samprixcpl = filter_input(INPUT_POST, 'samprixcpl');
$samprixf = filter_input(INPUT_POST, 'samprixf');
$samprixtv = filter_input(INPUT_POST, 'samprixtv');
$samprixh = filter_input(INPUT_POST, 'samprixh');

$dimanche = filter_input(INPUT_POST, 'dimamche');
$dimtype = filter_input(INPUT_POST, 'dimtype');
$dimprixcpl = filter_input(INPUT_POST, 'dimprixcpl');
$dimprixf = filter_input(INPUT_POST, 'dimprixf');
$dimprixtv = filter_input(INPUT_POST, 'dimprixtv');
$dimprixh = filter_input(INPUT_POST, 'dimprixh');

$detail_club = filter_input(INPUT_POST, 'detail_club');


  if(!empty($_POST['choix'])){
	  $choix ='';
	  for ($i=0;$i<count($_POST['choix']);$i++){
	  $choix .= $_POST['choix'][$i];
	  }
  }
            $compte_club = ('UPDATE club SET        pseudo=:pseudo, id_membre=:id_membre
			                                        nom=:nom,
                                                    adresse=:adresse, 
                                                    ville=:ville, 
                                                    cp=:cp,
													pays=:pays,
                                                    region=:region,
                                                    tel=:tel,
                                                    gsm=:gsm,
                                                    mail=:mail,
                                                    web=:web,
													
                                                    lundi=:lundi,lutype=:lutype,luprixcpl=:luprixcpl,luprixf=:luprixf,luprixtv=:luprixtv,luprixh=:luprixh,
													mardi=:mardi,martype=:martype,marprixcpl=:marprixcpl,marprixf=:marprixf,marprixtv=:marprixtv,marprixh=:marprixh,
													mercredi=:mercredi,mertype=:mertype,merprixcpl=:merprixcpl,merprixf=:merprixf,merprixtv=:merprixtv,merprixh=:merprixh,
													jeudi=:jeudi,jeutype=:jeutype,jeuprixcpl=:jeuprixcpl,jeuprixf=:jeuprixf,jeuprixtv=:jeuprixtv,jeuprixh=:jeuprixh,
													vendredi=:vendredi,ventype=:ventype,venprixcpl=:venprixcpl,venprixf=:venprixf,venprixtv=:venprixtv,venprixh=:venprixh,
													samedi=:samedi,samtype=:samtype,samprixcpl=:samprixcpl,samprixf=:samprixf,samprixtv=:samprixtv,samprixh=:samprixh,
													dimanche=:dimanche,dimtype=:dimtype,dimprixcpl=:dimprixcpl,dimprixf=:dimprixf,dimprixtv=:dimprixtv,dimprixh=:dimprixh,

                                                    detail_club=:detail_club  WHERE pseudo=:pseudo');
  			
            $req_plus = $connection->prepare($compte_club);			
            $req_plus->execute(array('pseudo'=>$pseudo,'id_membre'=>$id_membre,
			                         ':nom'=>$nom,':adresse'=>$adresse,':ville'=>$ville,':cp'=>$cp,':pays'=>$pays,':region'=>$region,':tel'=>$tel,':gsm'=>$gsm,':mail'=>$mail,':web'=>$web,
			
									 ':lundi'=>$lundi,':lutype'=>$lutype,':luprixcpl'=>$luprixcpl,':luprixf'=>$luprixf,':luprixtv'=>$luprixtv,':luprixh'=>$luprixh,
									 ':mardi'=>$mardi,':martype'=>$martype,':marprixcpl'=>$marprixcpl,':marprixf'=>$marprixf,':marprixtv'=>$marprixtv,':marprixh'=>$marprixh,
									 ':mercredi'=>$mercredi,':mertype'=>$mertype,':merprixcpl'=>$merprixcpl,':merprixf'=>$merprixf,':merprixtv'=>$merprixtv,':merprixh'=>$merprixh,
									 ':jeudi'=>$jeudi,':jeudtype'=>$jeutype,':jeuprixcpl'=>$jeuprixcpl,':jeuprixf'=>$jeuprixf,':jeuprixtv'=>$jeuprixtv,':jeuprixh'=>$jeuprixh,
									 ':vendredi'=>$vendredi,':ventype'=>$ventype,':venprixcpl'=>$venprixcpl,':venprixf'=>$venprixf,':venprixtv'=>$venprixtv,':venprixh'=>$venprixh,
									 ':samedi'=>$samedi,':samtype'=>$samtype,':samprixcpl'=>$samprixcpl,':samprixf'=>$samprixf,':samprixtv'=>$samprixtv,':samprixh'=>$samprixh,
									 ':dimanche'=>$dimanche,':dimtype'=>$dimtype,':dimprixcpl'=>$dimprixcpl,':dimprixf'=>$dimprixf,':dimprixtv'=>$dimprixtv,':dimprixh'=>$dimprixh,
									 
                                     ':detail_club'=>$detail_club)); // ici l'erreur

Eléphant du PHP | 257 Messages

17 mars 2017, 10:28

voilà la structure de la table
CREATE TABLE club (
  id_club int(4) NOT NULL auto_increment,
  id_membre int(11) NOT NULL,
  pseudo char(30) NOT NULL,
  nom char(30) NOT NULL,
  adresse varchar(255) NOT NULL,
  ville varchar(255) NOT NULL,
  cp int(4) NOT NULL,
  pays varchar(255) NOT NULL,
  region varchar(255) NOT NULL,
  tel int(11) NOT NULL,
  gsm int(11) NOT NULL,
  mail varchar(255) NOT NULL,
  web varchar(255) NOT NULL,
  lundi varchar(255) NOT NULL,
  lutype varchar(255) NOT NULL,   
  luprixcpl int(4) NOT NULL,
  luprixf int(4) NOT NULL,
  luprixtv int(4) NOT NULL,
  luprixh int(4) NOT NULL,
  mardi varchar(255) NOT NULL,
  martype varchar(255) NOT NULL,
  marprixcpl int(4) NOT NULL,
  marprixf int(4) NOT NULL,
  marprixtv int(4) NOT NULL,
  marprixh int(4) NOT NULL,
  mercredi varchar(255) NOT NULL,
  mertype varchar(255) NOT NULL,
  merprixcpl int(4) NOT NULL,
  merprixf int(4) NOT NULL,
  merprixtv int(4) NOT NULL,
  merprixh int(4) NOT NULL,
  jeudi varchar(255) NOT NULL,
  jeutype varchar(255) NOT NULL,
  jeuprixcpl int(4) NOT NULL,
  jeuprixf int(4) NOT NULL,
  jeuprixtv int(4) NOT NULL,
  jeuprixh int(4) NOT NULL,
  vendredi varchar(255) NOT NULL,
  ventype varchar(255) NOT NULL,
  venprixcpl int(4) NOT NULL,
  venprixf int(4) NOT NULL,
  venprixtv int(4) NOT NULL,
  venprixh int(4) NOT NULL,
  samedi varchar(255) NOT NULL,
  samtype varchar(255) NOT NULL,
  samprixcpl int(4) NOT NULL,
  samprixf int(4) NOT NULL,
  samprixtv int(4) NOT NULL,
  samprixh int(4) NOT NULL,
  dimanche varchar(255) NOT NULL,
  dimtype varchar(255) NOT NULL,
  dimprixcpl int(4) NOT NULL,
  dimprixf int(4) NOT NULL,
  dimrixtv int(4) NOT NULL,
  dimprixh int(4) NOT NULL,
  detailclub longtext NOT NULL,
  PRIMARY KEY (`id_club`),
  INDEX (`id_membre`)
)ENGINE=MyISAM DEFAULT CHARSET=utf8;

Mammouth du PHP | 1306 Messages

17 mars 2017, 11:32

J'ai pas compté tes paramètres car il y en a beaucoup et je suppose que tu l'a fait

mais j'ai vu ceci
$req_plus->execute(array('pseudo'=>$pseudo,'id_membre'=>$id_membre,
à mon avis ajouter des : devant devrait aider
$req_plus->execute(array(':pseudo'=>$pseudo,':id_membre'=>$id_membre,
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone de rubik's cube
Ingénieur Industriel Chimie / Biochimie

Avatar de l’utilisateur
Modérateur PHPfrance
Modérateur PHPfrance | 8755 Messages

17 mars 2017, 11:43

salut,

première chose : ilte manque une virgule après id_membre=:id_membre donc déjà la syntaxe SQL n'est pas bonne ;)

je me demande si cela ne joue pas non plus sur le nombre de marqueurs trouvé par PDO (du genre le nom du marqueurs c'est tous ce qu'il y a entre : et la prochaine virgule ;) )

avec ça tu devrais avoir moins de soucis.

deuxième chose : quand je vois la table (il y a quand même 56 champs !!!) je pense tout de suite à un problème de conception du modèle.
notamment au niveau des colonnes qui ont le même nom préfixé par un jour de la semaine => ce genre de chose c'est une erreur.

cela devrait être une table
tarif_club table (
tarif_club_id int not null auto_increment primary key,
id_club int(4) NOT NULL,
dayNumber int not null check (dayNumber between 0 and 6),
jeSaisPasCPasParlantTonTruc varchar(255) NOT NULL,
type varchar(255) NOT NULL,
prixcpl int(4) NOT NULL,
prixf int(4) NOT NULL,
prixtv int(4) NOT NULL,
prixh int(4) not null
);

le n° de jour c'est zéro à 6 (ou 1 à 7 suivant tes conventions). en php les deux existent il s'agit des paramètres N et w de la fonction date)


raa c'est quoi ces gens plus rapide que moi ;)

donc en plus spols a raison il te manque : dans les noms de marqueurs (a voir il me semblait que cela ne dérangé pas PDO, ceci dit cela ne peux pas faire de mal d'être cohérent ;))
@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 257 Messages

24 mars 2017, 14:35

un petit exemple serait le bienvenu ;-)

Avatar de l’utilisateur
Modérateur PHPfrance
Modérateur PHPfrance | 8755 Messages

24 mars 2017, 15:21

salut requête SQL devient
UPDATE club
SET pseudo   =:pseudo,
  id_membre  =:id_membre,
  nom        =:nom,
  adresse    =:adresse,
  ville      =:ville,
  cp         =:cp,
  pays       =:pays,
  region     =:region,
  tel        =:tel,
  gsm        =:gsm,
  mail       =:mail,
  web        =:web,
  lundi      =:lundi,
  lutype     =:lutype,
  luprixcpl  =:luprixcpl,
  luprixf    =:luprixf,
  luprixtv   =:luprixtv,
  luprixh    =:luprixh,
  mardi      =:mardi,
  martype    =:martype,
  marprixcpl =:marprixcpl,
  marprixf   =:marprixf,
  marprixtv  =:marprixtv,
  marprixh   =:marprixh,
  mercredi   =:mercredi,
  mertype    =:mertype,
  merprixcpl =:merprixcpl,
  merprixf   =:merprixf,
  merprixtv  =:merprixtv,
  merprixh   =:merprixh,
  jeudi      =:jeudi,
  jeutype    =:jeutype,
  jeuprixcpl =:jeuprixcpl,
  jeuprixf   =:jeuprixf,
  jeuprixtv  =:jeuprixtv,
  jeuprixh   =:jeuprixh,
  vendredi   =:vendredi,
  ventype    =:ventype,
  venprixcpl =:venprixcpl,
  venprixf   =:venprixf,
  venprixtv  =:venprixtv,
  venprixh   =:venprixh,
  samedi     =:samedi,
  samtype    =:samtype,
  samprixcpl =:samprixcpl,
  samprixf   =:samprixf,
  samprixtv  =:samprixtv,
  samprixh   =:samprixh,
  dimanche   =:dimanche,
  dimtype    =:dimtype,
  dimprixcpl =:dimprixcpl,
  dimprixf   =:dimprixf,
  dimprixtv  =:dimprixtv,
  dimprixh   =:dimprixh,
  detail_club=:detail_club
WHERE pseudo =:pseudo
le code
<?php
$req_plus->execute(array('pseudo'=>$pseudo,
':id_membre'=>$id_membre,
':nom'=>$nom,
':adresse'=>$adresse,
':ville'=>$ville,
':cp'=>$cp,
':pays'=>$pays,
':region'=>$region,
':tel'=>$tel,
':gsm'=>$gsm,
':mail'=>$mail,
':web'=>$web,
':lundi'=>$lundi,
':lutype'=>$lutype,
':luprixcpl'=>$luprixcpl,
':luprixf'=>$luprixf,
':luprixtv'=>$luprixtv,
':luprixh'=>$luprixh,
':mardi'=>$mardi,
':martype'=>$martype,
':marprixcpl'=>$marprixcpl,
':marprixf'=>$marprixf,
':marprixtv'=>$marprixtv,
':marprixh'=>$marprixh,
':mercredi'=>$mercredi,
':mertype'=>$mertype,
':merprixcpl'=>$merprixcpl,
':merprixf'=>$merprixf,
':merprixtv'=>$merprixtv,
':merprixh'=>$merprixh,
':jeudi'=>$jeudi,
':jeudtype'=>$jeutype,
':jeuprixcpl'=>$jeuprixcpl,
':jeuprixf'=>$jeuprixf,
':jeuprixtv'=>$jeuprixtv,
':jeuprixh'=>$jeuprixh,
':vendredi'=>$vendredi,
':ventype'=>$ventype,
':venprixcpl'=>$venprixcpl,
':venprixf'=>$venprixf,
':venprixtv'=>$venprixtv,
':venprixh'=>$venprixh,
':samedi'=>$samedi,
':samtype'=>$samtype,
':samprixcpl'=>$samprixcpl,
':samprixf'=>$samprixf,
':samprixtv'=>$samprixtv,
':samprixh'=>$samprixh,
':dimanche'=>$dimanche,
':dimtype'=>$dimtype,
':dimprixcpl'=>$dimprixcpl,
':dimprixf'=>$dimprixf,
':dimprixtv'=>$dimprixtv,
':dimprixh'=>$dimprixh,
':detail_club'=>$detail_club)); // ici l'erreur
pour ce qui est de ma proposition de modification du modèle
CREATE TABLE club (
	 id_club INT(4) NOT NULL AUTO_INCREMENT,
	 id_membre INT(11) NOT NULL,
	 pseudo CHAR(30) NOT NULL,
	 nom CHAR(30) NOT NULL,
	 adresse VARCHAR(255) NOT NULL,
	 ville VARCHAR(255) NOT NULL,
	 cp INT(4) NOT NULL,
	 pays VARCHAR(255) NOT NULL,
	 region VARCHAR(255) NOT NULL,
	 tel INT(11) NOT NULL,
	 gsm INT(11) NOT NULL,
	 mail VARCHAR(255) NOT NULL,
	 web VARCHAR(255) NOT NULL,
	 detailclub LONGTEXT NOT NULL,
	 PRIMARY KEY (`id_club`), 
    INDEX (`id_membre`)
  -- ajoute ici la clef étrangère vers la table des membres
) ENGINE=innodb DEFAULT CHARSET=utf8;

-- vérifie quand même les types
create table tarif_club (
	id_club INT(4) NOT NULL,-- peux être un peu limite le int(4) ?
	day_number INT NOT NULL CHECK (day_number BETWEEN 0 AND 6), 
-- type est un mot clef sql il smeble donc à fuir pour un nom de colonne
	letypeVARCHAR(255) NOT NULL, TYPE VARCHAR(255) NOT NULL, 
	prix_cpl INT(4) NOT NULL,
	prix_f INT(4) NOT NULL,
	prix_tv INT(4) NOT NULL,
	prix_h INT(4) NOT NULL
)ENGINE=innodb DEFAULT CHARSET=utf8;

alter table tarif_club add constraint FK_club foreign key(id_club) references club(id_club);

-- Pour la clef primaire deux choix
la colonne int classique :	tarif_club_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,

-- utiliser une PK sur deux colonnes : id_club + dayNumber, comme ça tu n'auras jamais deux tarif pour le même jour pour le même club
alter table tarif_club add constraint PK_tarif_club primary key(id_club,day_number);
-- => je préfère la seconde solution
ensuite tu crées ton club avec les infos qui vont bien dans la première table.
quand tu veux ajouter ou modifier / supprimer un tarif tu le fait dans la seconde table.
Cette table permet d'avoir un "tarif" (ou plutôt un ensemble, même si le mieux serait d'avoir les tarifs individuellement) pour un club et un jour donné.
J'ai fait le choix de numéroter les jours de zéro à six.

en php pour avoir le numéro du jour
<?php
echo date('w'); // éventuellement en passant la date en second paramètre sinon c'est pas utile ;) )
attention le zéro c'est dimanche ;)

Ensuite réduisons un peux le code php.
Coté html il faut utiliser la notation tableau dans les noms des champs
<input type="text" name ="type[]" />
<input type="hidden" name="jour[]" value="1" />
coté php c'est assez simple, je te laisse faire l'insertion / mise à jour dans la première table
<?php
$sql = <<<SQL
 insert into tarif_club (id_club,	day_number,	letype , prix_cpl,	prix_f,	prix_tv,	prix_h)
 values (:id_club, :day_number,	:letype, :prix_cpl, :prix_f, :prix_tv,	:prix_h)
SQL;

// je sais pas d'ou vient l'info
$id_club = 42;
$pdo = new PDO();
$stmt = $pdo->prepare($sql);
foreach ($_POST['type'] as $key => $value) {
    $jour = $_POST['jour'][$key];
    $type = $_POST['type'][$key];
    $prixcpl = $_POST['prixcpl'][$key];
    $prixf = $_POST['prixf'][$key];
    $prixtv = $_POST['prixtv'][$key];
    $prixh = $_POST['prixh'][$key];

    $stmt->bindParam(':id_club', $id_club);
    $stmt->bindParam(':day_number', $jour);
    $stmt->bindParam(':letype', $type);
    $stmt->bindParam(':prix_cpl', $prixcpl);
    $stmt->bindParam(':prix_f', $prixf);
    $stmt->bindParam(':prix_tv', $prixtv);
    $stmt->bindParam(':prix_h', $prixh);

    $stmt->execute();
}
$stmt->closeCursor();
la mise à jour c'est le même principe avec une requête update.

en code ces quelques lignes je me suis rendu compte que le prédicat de la requête update portait sur le pseudo du membre et non pas sur le club. Je pense qu'il te manque l'id club dans le prédicat.
Parce que il suffit que le membre soit plusieurs club et c'est le foutoir.

D'ailleurs j'ai l'impression qu'il y a un méli mélo la dedans.
cette tableau contient bien les information d'un "club" (au sens association, réunion de gens ?).
Dans ce cas je ne vois pas trop a quoi sert le membre.

si tu veux des tarifs associé à un membre pour un club c'est possible mais pas ainsi (de façon simple, clair et sans soucis ;) )

@+
Il en faut peu pour être heureux ......