ajout de champs, probleme décalage

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : ajout de champs, probleme décalage

par kochalski » 26 mars 2008, 19:32

Donc, avec ce nouveau script, si je veux par la suite rajouter des colonnes supplementaires dans differentes tables, je n'aurais plus de décalage ??

Je viens de faire un test....CA MARCHE.
Il me reste à reprendre toutes mes tables comme tu m'as dis.

Encore une fois merci pour ton aide.

Francis

par Hubert Roksor » 26 mars 2008, 19:29

Ben pareil que l'ancien script mais en replaçant l'un par l'autre. En lisant ton script je me suis aperçu que ta table "coordonnees" était en réalité une table "membres". Si ta table ne contient que des coordonnées, alors oui, appelle-la "coordonnees", mais si elle contient d'autres information sur les membres alors il faut l'appeler "membres". Du coup, tes tables devraient être

Code : Tout sélectionner

CREATE TABLE `annonces` ( `annonce_id` int(10) unsigned NOT NULL auto_increment, `membre_id` int(10) unsigned NOT NULL default '0', ...etc... `annonce_texte` text NOT NULL ) CREATE TABLE `membres` ( `membre_id` mediumint(8) unsigned NOT NULL auto_increment, `membre_identifiant` varchar(60) NOT NULL default '', ...etc... `membre_nom` varchar(120) NOT NULL default '', `membre_prenom` varchar(120) NOT NULL default '', ...etc... )
Et ton script va ressembler à
error_reporting(E_ALL);

$sql = "SELECT * FROM membres JOIN annonces USING (membre_id)";
$result = mysql_query($sql);

while ($row = mysql_fetch_assoc($result))
{
  echo $row['membre_nom'], '...', $row['annonce_texte'], '...';
}

par kochalski » 26 mars 2008, 19:18

Heu.....merci mais tu oublies que je suis novice dans le php :oops: :oops:
J'ai galéré jusqu"à présent.
Pourrais tu me faire un exemple de script ??

par Hubert Roksor » 26 mars 2008, 19:12

Si tu peux modifier ton schéma alors oui, définitivement. Ce que je recommande fortement, c'est d'utiliser un préfix pour les colonnes. Ainsi, tes tables ressembleront à

Code : Tout sélectionner

CREATE TABLE `annonces` ( `annonce_id` int(10) unsigned NOT NULL auto_increment, `membre_id` int(10) unsigned NOT NULL default '0', `annonce_annee` enum('0','1','2','3','4') NOT NULL default '0', ...etc... ) CREATE TABLE `membres` ( `membre_id` int(10) unsigned NOT NULL auto_increment, ...etc... ) CREATE TABLE `coordonnees` ( `coordonnee_id` mediumint(8) unsigned NOT NULL auto_increment, `coordonnee_identifiant` varchar(60) NOT NULL default '', ...etc... `coordonnee_nom` varchar(120) NOT NULL default '', `coordonnee_prenom` varchar(120) NOT NULL default '', ...etc... )
Tant que tu y es, remplace mysql_fetch_array() par mysql_fetch_assoc(), remplace tes indices numériques par les noms des colonnes et ajoute error_reporting(E_ALL) en début de script pour être notifié quand tu te planteras.

Et là, plus jamais de problème de décalage.

par kochalski » 26 mars 2008, 19:00

S'il faut renommer mes colonnes, c'est encore faisable (je ne suis qu'au début de mon programme)
Par contre je voudrais savoir si c'est possible.
Merci

par Hubert Roksor » 26 mars 2008, 18:57

Hmm... c'est sûr que si la moitié de tes colonnes portent le même nom c'est pas gagné... :-k

par kochalski » 26 mars 2008, 18:49

Ok, je mets le schema de mes tables .

Code : Tout sélectionner

-- -- Structure de la table `annonces` -- CREATE TABLE `annonces` ( `id` int(10) unsigned NOT NULL auto_increment, `id_membre` int(10) unsigned NOT NULL default '0', `annee` enum('0','1','2','3','4') NOT NULL default '0', `date_prestation_jour` enum('0','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') NOT NULL default '0', `date_prestation_mois` enum('0','1','2','3','4','5','6','7','8','9','10','11','12') NOT NULL default '0', `lot` enum('0','1','2','3','4','5','6','7') NOT NULL default '0', `qualite_prestataire` enum('0','1','2','3','4','5','6') NOT NULL default '0', `site` enum('0','1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20') NOT NULL default '0', `tranche` enum('0','1','2','3','4','5','6','7','8') NOT NULL default '0', `type_arret` enum('0','1','2','3','4') NOT NULL default '0', `type_commande` enum('0','1','2') NOT NULL default '0', `type_tea_tem` enum('0','1','2','3','4','5') NOT NULL default '0', `annonce` text NOT NULL, `approbateur` varchar(120) NOT NULL default '', `commande` varchar(120) NOT NULL default '', `commentaire` varchar(255) NOT NULL default '', `controleur` varchar(120) NOT NULL default '', `donneur_ordre` varchar(120) NOT NULL default '', `duree_prestation` varchar(120) NOT NULL default '', `fournisseur` varchar(120) NOT NULL default '', `numero_arret` varchar(120) NOT NULL default '', `qualification` varchar(120) NOT NULL default '', `redacteur2` varchar(120) NOT NULL default '', `redacteur3` varchar(120) NOT NULL default '', `service_emetteur` enum('0','1','2','3','4','5','6') NOT NULL default '0', `siren` varchar(120) NOT NULL default '', `sous_traitant` varchar(120) NOT NULL default '', `surveillant` varchar(120) NOT NULL default '', `theme` enum('0','1','2','3','4','5') NOT NULL default '0', `jour_rex` enum('0','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') NOT NULL default '0', `mois_rex` enum('0','1','2','3','4','5','6','7','8','9','10','11','12') NOT NULL default '0', `titre` text NOT NULL, `rex` text NOT NULL, `emploi` varchar(255) NOT NULL default '', `redacteur_rex` varchar(120) NOT NULL default '', `rex_csi` enum('0','1','2','3','4','5') NOT NULL default '0', `rex_cap` enum('0','4') NOT NULL default '0', `grille_aide` enum('0','1') NOT NULL default '0', `synthese_suivi` enum('0','1') NOT NULL default '0', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT ; -- -------------------------------------------------------- -- -- Structure de la table `coordonnees` -- CREATE TABLE `coordonnees` ( `id` mediumint(8) unsigned NOT NULL auto_increment, `identifiant` varchar(60) NOT NULL default '', `mot_de_passe` varchar(32) NOT NULL default '', `civilite` enum('1','2','3') NOT NULL default '1', `nom` varchar(120) NOT NULL default '', `prenom` varchar(120) NOT NULL default '', `mail` varchar(120) NOT NULL default '', `mail2` varchar(20) NOT NULL default '', `site_appartenance` enum('0','1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20') NOT NULL default '0', `service` enum('0','1','2','3','4','5','6') NOT NULL default '0', `emploi` enum('0','1','2','3','4','5','6','7','8','9') NOT NULL default '0', `trigramme` varchar(120) NOT NULL default '', `statut` varchar(8) NOT NULL default '', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT ; -- -------------------------------------------------------- -- -- Structure de la table `rex` -- CREATE TABLE `rex` ( `id` int(10) unsigned NOT NULL auto_increment, `id_membres` int(10) unsigned NOT NULL default '0', `id_programme` int(10) unsigned NOT NULL default '0', `titre` varchar(255) NOT NULL default '', `rex` text NOT NULL, `date_prestation_jour` enum('0','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') NOT NULL default '0', `date_prestation_mois` enum('0','1','2','3','4','5','6','7','8','9','10','11','12') NOT NULL default '0', `site` enum('0','1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20') NOT NULL default '0', `emploi` enum('0','1','2','3','4','5','6','7','8','9') NOT NULL default '0', `tranche` enum('0','1','2','3','4','5','6','7','8') NOT NULL default '0', `annee` enum('0','1','2','3','4') NOT NULL default '0', `lot` enum('0','1','2','3','4','5','6','7') NOT NULL default '0', `type_arret` enum('0','1','2','3','4') NOT NULL default '0', `fournisseur` varchar(120) NOT NULL default '', `commande` varchar(120) NOT NULL default '', `type_commande` enum('0','1','2') NOT NULL default '0', `controleur` varchar(120) NOT NULL default '', `service` enum('0','1','2','3','4','5','6') NOT NULL default '0', `annonce` text NOT NULL, `nom` varchar(120) NOT NULL default '', `rex_csi` enum('0','1','2','3','4','5') NOT NULL default '0', `aa` varchar(120) NOT NULL default '0', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT ;
Quand je veux visualiser un résultat, j'écris ce code:
C'est un exemple.
if (isset($_GET['id']))	
{
$id_annonce = replace_quot($_GET['id']);    
}
else
{
$id_annonce = 0;
}
$query = "SELECT * FROM coordonnees,annonces WHERE annonces.id_membre=coordonnees.id AND annonces.id='".$id_annonce."'";
$result_query = mysql_query($query);
if (mysql_num_rows($result_query) == 1)
{
$mysql_result_query = mysql_fetch_array($result_query);

echo $mysql_result_query[36]; 
//qui correspond au nom du fournisseur de ma table "annonces"
Donc si je rajoute une colonne dans la table "annonces" même à la fin de celle ci,
ma table "rex" est completement décalé...... :oops:

par Hubert Roksor » 26 mars 2008, 13:22

Pour cette histoire de décalage, la solution est simple : arrêter d'utiliser mysql_fetch_row() et utiliser mysql_fetch_assoc() à la place. Dans tous les cas tu vas devoir changer tes scripts, sauf que dans un des deux (fetch_row) tu devras le faire à chaque changement.

par Calimero » 26 mars 2008, 13:13

Bonjour,

Pour pouvoir t'aider, peux-tu poster le schéma de tes tables comme cela t'a été demandé quand tu as posté dans ce forum ? merci d'avance.

par kochalski » 25 mars 2008, 20:06

N'ayant pas trouver de solution à mon problème, je me permet de reformuler mon problème.

Un exemple:

Si j'ai une table que je nomme AZERTY et 5 champs A, B, C , D , E.
Pour l'affichage ce serait :
echo $mysql_result_query[1];  pour le A
echo $mysql_result_query[2];  pour le B
echo $mysql_result_query[3];  pour le C
echo $mysql_result_query[4];  pour le D
echo $mysql_result_query[5];  pour le E
Là, pas de probleme.

Dans ma 2° table que je nomme TRAVAIL et 5 champs F, G, H , I , J.
Pour l'affichage ce serait :
echo $mysql_result_query[6];    pour le F
echo $mysql_result_query[7];    pour le G
echo $mysql_result_query[8];    pour le H
echo $mysql_result_query[9];    pour le I
echo $mysql_result_query[10];   pour le J
Là, pas de probleme.

Disons que 3 mois plus tard, je rajoute en fin de table AZERTY un champ que je nomme C1
Mes colonnes seront A, B, C , C, D , E , C1

Pour cette table AZERTY, tout se déroulera bien sans erreur.
Par contre, pour la 2° table TRAVAIL, c'est la KATA. Toute les colonnes seront décalés d'une valeur.

Bien sur, il faudrait que je modifie le code de TOUTES MES pages pour que cela m'affiche reelement mon résultat.
Je voudrais savoir s'il serait possible de pouvoir faire en sorte que les champs ne se décale pas par rapport aux autres tables..

J'espere que cela est possible et que vous me donnerez une solution.
Pour rappel, je suis novice dans le PHP, j'essai toujours de moi même mais là :( :(

Merci d'avance .

Francis

indice du rang

par animithra » 23 mars 2008, 12:16

Bonjour.

Il se peut que cela soit simplement décalé d'un rang car les tableaux associatifs fonctionnent de la manière suivante :

tableau[rang] = valeur, où rang commence à 0 et non pas à 1

si cela ne se produit que lorsque tu ajoutes de nouveaux champs, cela provient peut être de la méthode de tri, dans ce cas il faut que tu vérifies sur quelle clé ta table de données trie ses valeurs.

Par exemple si tu as une table de produits :
PRODUIT(
id int unisgned auto_increment,
nom_produit varchar(255) not null,
type_produit varchar(255) not null,
primary key (id)
);

si ton tableau associatif tri par rapport au nom du produit, alors tes insertions risquent de créer un décalage (par défaut le tri se fera dans l'ordre alphabétique donc si tu entres un produit commençant par la lettre B, tous les produits commençant par les lettres suivantes suivront un décalage de 1).
par contre si tu tries sur la clé primaire (id) qui est incrémentée de 1 à chaque entregistrement, tes enregistrements seront triés selon que tu les ais entré ou non en premier.

J'espère avoir répondu à ta question, sinon ou si tu en as d'autres, n'hésites pas à me contacter par message privé ou email.

ajout de champs, probleme décalage

par kochalski » 23 mars 2008, 10:16

Bonjour,
Je suis novice sur le PHP.
Je rencontre un problème quand je rajoute des champs supplémentaire dans une table.
Il se passe que quand j'ecris par exemple ce code:
if($mysql_result_query[50] == 1) echo "Appui technique";
Cela ne correspond plus, c'est décalé par rapport au nombre de champ que j'ai ajouté.
Bien sur, il faudrait qu'à chaque fois je reprenne tous mes scripts "GALERE !!!"

Ma question est :
Est il possible de rajouter des champs sans avoir de décalage. Si c'est le cas, que dois je faire.
D'avance merci.

Francis