Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1385 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  Table à 2 colonnes - Définir variables selon Id (Résolu)

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Table à 2 colonnes - Définir variables selon Id (Résolu)

n°2329656
beley
Posté le 24-02-2019 à 08:30:40  profilanswer
 

Bonjour à toutes et tous,
 
J'ai beaucoup de mal avec les tableaux. (ça craint  :??:  )
Souvent je "vois" l'idée, le cheminement, mais je cale sur la syntaxe voire le développement des boucles.
 
Par principe je ne demande pas d'aide mais là j'ai beau chercher partout, je ne trouve rien qui me mette sur les bons rails - je sèche (... d'autant plus frustrant que je suis sûr que c'est une question fréquemment posée tellement c'est bête). Une semaine coincé sur ce bout de code, je craque.
 
Pour ne rien arranger, vu mon niveau je reste en style procédural et la plupart des réponses sont en pdo (si je le dis bien ^^)
 
Mon problème et mon objectif:
J'ai une table "elements" dans ma base de données.
Elle comporte 2 colonnes: Id (auto-increment) et mot
Particularité: j'enrichis la table manuellement au fur et à mesure des besoins, et je laisse volontairement des trous dans les id, trous que je remplis par la suite avec de nouveaux mots.
 
Au final, je veux pouvoir appeler la table et définir chaque mot en variable, style $mot1=$mot[0] etc
 
J'ai avancé dans mon code, sauf que ce que j'obtiens correspond à l'ordre des mots retournés par mon appel et non pas à l'id des mots (ma particularité).
 
(J'ai viré les lignes de connexion à la bdd et vérification pour alléger)

Code :
  1. $sql = mysqli_query($cnx, "SELECT * FROM elements" );
  2. while ($ligne=mysqli_fetch_array($sql))
  3. {
  4. $id[] =  $ligne['0'];
  5. $mots[] =  $ligne['1'];
  6. }


 
Pour vérifier:
- si je fais un echo $id[0] et que je continue avec $id[1] etc, j'ai bien les id qui correspondent à mes enregistrements: les trous sont bien pris en compte. (normal, chaque id est un champ, un champ compte pour un même s'il est vide) Je peux donc définir $id1 =  $id[0] etc.....
 
- si je fais la même chose avec $mots, j'ai bien tous mes mots, sauf qu'ils ne sont pas en rapport avec l'id; $mot[0] est le premier mot renvoyé par ma requête, les vides génèrent un décalage.
 
Comment faire pour que $mot25 corresponde à $id25? (j'ai bien dit $id25, pas 24 ^^)
(Parce qu'au passage si vous savez comment régler le décalage induit par le fait que la numérotation commence à zéro... sinon j'irai voir du côté index ... ou me contenterai du dédalage de 1)
 
Je ne vois pas comment associer le mot à l'Id genre [Id[0]['mot']] (sauf que ça c'est faux)
J'essaie d'ajouter une boucle foreach dans le while mais j'obtiens n'importe quoi.
Pour l'instant je fais tourner ma page avec une requête par mot, mais avec 300 mots, ça devient moche pour le serveur ^^
 
Je vous remercie par avance pour le temps que vous allez éventuellement me consacrer  :D


Message édité par beley le 24-02-2019 à 17:01:45
mood
Publicité
Posté le 24-02-2019 à 08:30:40  profilanswer
 

n°2329657
rufo
Pas me confondre avec Lycos!
Posté le 24-02-2019 à 08:49:55  profilanswer
 

Dans ton SQL, faut mettre à la fin la clause "ORDER BY".
Et faut pas écrire $ligne['0']; mais $ligne[0]; (on enlève les quotes.) ET pourquoi tu n'affiches pas le tableau via ta boucle ? Sinon, le plus simple c'est de faire :
$MonTableau = array("id" => array(), "mots" => array());
while ($ligne=mysqli_fetch_array($sql))
{
    $MonTableau["id"][] =  $ligne[0];
    $MonTableau["mot"][]=  $ligne[1];
}
 
Après, pour lire ton tableau :
echo "<table>";
foreach($MonTableau['id'] as $i => $id)
{
    echo "<tr><td>$id</td><td>".MonTableau[$mot][$i]."</td></tr>";
}
echo "</table>";


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2329659
beley
Posté le 24-02-2019 à 09:29:37  profilanswer
 

Bonjour Rufo,
 
Avant tout, merci pour ta réactivité et ta réponse  :)  
 
Je viens de mettre en place le ORDER BY id (je n'y avais pas pensé)
J'ai enlevé les quotes, je vais retourner potasser la doc
 
De là, j'ai testé ta proposition plus simple (mais c'est du pdo, mélanger les 2 styles j'ai lu que ce n'est pas bon):
Si je mets juste la déclaration de tableau et la boucle while, avec $MonTableau["mot"][0] etc , j'ai bien toujours mes mots, dans l'ordre de la requête (c'est logique, j'ai pigé ça)
 
Après mon problème c'est que foreach est surtout destiné à faire un écho (ou je me trompe totalement)
Moi je veux définir des variables $mot1 $mot2 etc.... c'est là que je ne comprends pas .... comment faire ou je n'ai rien compris à foreach (je continue mes essais sur cette boucle)


Message édité par beley le 24-02-2019 à 10:54:36
n°2329663
rufo
Pas me confondre avec Lycos!
Posté le 24-02-2019 à 11:18:06  profilanswer
 

Quel est l'intérêt de déclarer autant de variables :??:


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2329667
beley
Posté le 24-02-2019 à 12:35:37  profilanswer
 

Par exemple, pour remplacer l'adresse d'une page par une variable
$mot1 = "dossier X";
$mot2 = "sous-dossier Y";
$mot3 = "fichier z";
 
$mot10 = $mot1.'/'.$mot2.'/'.$mot3.''.php';
 
et c'est un exemple parmi tant d'autres  :)


Message édité par beley le 24-02-2019 à 12:38:16
n°2329668
rufo
Pas me confondre avec Lycos!
Posté le 24-02-2019 à 13:53:35  profilanswer
 

Regarde la syntaxe : ${$mot};
 
Dans ton while, tu peux faire aussi :
while(...)
{
    $MonTableau[$ligne[0]] = $ligne[1];
}
 
Le foreach peut servir à faire autre chose qu'un echo.
foreach($MonTableau['id'] as $i => $id)  
{
    ${"mot".$id} = $MonTableau['mot'][$i];
}
 
Ca va te créer tes variables. Mais je vois toujours pas l'intérêt car tu peux générer tes chemins d'accès de bien d'autres manières.
 
Tu peux expliquer le but de ton appli dans son ensemble car je pense que tu as un pb parce que tu ne pars pas sur la bonne solution. Peut-être même que tes données sont mal modélisées dans ta BD.


Message édité par rufo le 24-02-2019 à 14:42:11

---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2329671
beley
Posté le 24-02-2019 à 16:46:22  profilanswer
 

:bounce: j'ai compris le foreach que tu proposes!
 
Non seulement cette boucle fonctionne, mais elle améliore grandement ce que j'avais fait initialement
(je vais m'expliquer plus loin)
 
Par contre, comment fonctionnent vos cerveaux pour trouver un truc comme ça? ^^
De là à reproduire un tel raisonnement, j'ai beaucoup à apprendre.
 
Il y a quelques années, je me suis créé un "outil" (j'avais bien avancé), à savoir une page s'ouvrant via le navigateur et fonctionnant comme un site (login, passe sécurité etc...)
Structure de la page basique: 1 en-tête, 1 pied de page; 3 colonnes (gauche, milieu/corps, droite)
Dans la colonne gauche, un menu "Vidéos - Musique - Ulititaires ...)
Selon ce qui est choisi, la colonne du milieu est "alimentée"
 
L'url affichée (je passe sur localhost) est toujours Page1.php
 
Toutes les informations, mots, instructions, adresses etc... sont cryptés en fonction du login, du passe et de l'id de session
(en gros quand tu fais clic droit sur la page / afficher code, ce qui est retouné n'a aucun sens, sauf pour moi)
Les données permettant d'afficher la page ne sont générées que si les vérifications sont ok, et elles sont uniques
(si tu rafraîchis la page, les variables de session sont renouvelées et les clés permettant d'afficher une même chose sont différentes)
 
Dans mon développement, j'avais tout fini côté utilisateur, j'étais en train de développer la page d'administration
(pour gérer l'état ouvert/Travaux, enregistrer facilement des données avec des champs à remplir etc...)
 
C'était top, il me restait à améliorer ensuite l'écriture puis voir pour une mise en ligne (toujours pour moi)
..... sauf que chat noir que je suis il m'est arrivé une chose rarissime: crash du disque dur, et quand je dis crash, c'est mort du 1er cluster: j'ai perdu 15 ans de données, dont ce travail  :fou: )
 
J'ai quand même pu récupérer une bonne partie des fichiers simples avec Recuva (qui a tourné 4 mois h24)
 
Là, j'ai enfin le courage de m'y remettre (et c'est déjà sympa d'installer wamp puis de tout lancer en auto sur W10 ^^), et voilà que je découvre que mysql devient mysqli .... puis que la fonction result suivant un fetch_array sous mysql est obsolète.....
 
 :cry:  non seulement je dois
- retrouver l'architecture de chaque table de la base de données
- alimenter chaque table (et en vidéo, musique et livres ça pique vu que je mets tout durée artiste, réalisateur, jaquette ...^^)
mais je dois maintenant aussi réécrire les fractions de pages qui ne fonctionnent plus suite à mysqli.
 
Pour résoudre mon problème, j'ai bien vu qu'il est proposé une fonction destinée à faire l'équivalent de result... sauf que je ne comprends pas, et que je ne veux pas utiliser quelque chose que je ne comprends pas (se contenter de pomper, c'est nul)
En plus , ce foreach est bien plus élégant que ce gros bout de code tout moche  :pt1cable:  
 
Ce que foreach améliore
 
Avant j'évais écrit ça:

Code :
  1. $result = mysql_query('SELECT Mot FROM elements');
  2. $mot1 = mysql_result ($result, 0);  // Structure
  3. $mot3 = mysql_result ($result, 2);  // Images
  4. $mot4 = mysql_result ($result, 3);  // Pages


L'inconvénient était qu'à chaque fois que j'ajoutais un mot, je devais ajouter une ligne ici (à savoir dans ma page Adr.php, que j'insère dans une autre page php, que j'insère dans ma page1.php.
 
Maintenant j'ai ça:

Code :
  1. $sql = mysqli_query($cnx, "SELECT * FROM elements" );
  2. while ($ligne=mysqli_fetch_array($sql))
  3. {
  4.     $MonTableau["id"][] =  $ligne[0];
  5.     $MonTableau["mot"][]=  $ligne[1];
  6. }
  7. foreach($MonTableau['id'] as $i => $id) 
  8. {
  9.     ${"mot".$id} = $MonTableau['mot'][$i];
  10. }


- Finalement, j'ai enlevé ORDER BY id parce que par défaut, c'est comme ça que ça bosse
- Le bénef est que les $mot sont automatiquement créées et que le code reste léger: encore mieux!
(il ne reste qu'à gérer les concaténations et les variables de session)
 
On peut en échanger si tu veux, sinon il ne me reste qu'à te remercier encore une fois, tu as réglé en quelques instants des heures de recherches et d'essais (et ça va continuer vu que je vais creuser le truc, même si je suis content d'avoir senti que c'était un foreach, sans en comprendre vraiment le fonctionnement)
 
....  :jap:  trop balèze ce Rufo ....   :)
 
Edit: Prends un film comme "Un pigeon perché sur une branche philosophait sur l’existence" (et ce n'est pas ce qu'il y a de plus long)
 
Pour manipuler le titre, la jaquette, le synopsis etc...   je préfère utiliser $mot4012 par exemple, et cette variable cryptée ne sera utilisable que si tu es bien l'utilisateur déclaré, dont le passe correspond au passe crypté à partir (entre autres ^^) de l"id de session elle-même cryptée


Message édité par beley le 24-02-2019 à 16:57:16
n°2329672
rufo
Pas me confondre avec Lycos!
Posté le 24-02-2019 à 18:46:47  profilanswer
 

C'est bien ce que je disais, c'est complètement bidon ton système. Désolé d'être aussi cash.
La récup des méta-données sur les vidéos, livres, musiques... ça fait belle lurette que ça se fait automatiquement via des API de sites web (cf ce que font Plex, Kodi comme logiciel de gestion de médiathèque).
 
Pour la navigation, une protection par existence de session + un token si vraiment tu es parano suffira. Cela dit, pour la nature des infos que tu gères, je vois pas l'intérêt. :??:
Pour la navigation via des url, si tu veux masquer les url, tu peux très bien pour chaque entrée de vidéo, livre, musique... générer à partir du titre de l'oeuvre et d'une variable aléatoire (par ex, utiliser la fonction time()) un hash de type md5 ou plus récent, sha256. Quand l'utilisateur demandera l'url AfficherOeuvre.php?id=4568dda15315fce153 par ex, ton script va récupérer la valeur de id et chercher le hash de l'oeuvre correspondant dans la BD. A noter qu'en utilisant l'ur rewritting d'Apache, tu peux avoir une url du type AfficherOeuvre.php/4568dda15315fce153 voire même AfficherOeuvre/4568dda15315fce153
 
Au passage, il existe déjà des CMS de gestion de médiathèque ;)


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2329673
beley
Posté le 24-02-2019 à 18:58:30  profilanswer
 

PAN! Dans ma face ^^
 
Oui tu as raison, mais alors autant passer par des appli comme dreamweaver pour développer, ou d'autres utilitaires en ligne, ou faire développer mon truc pour moi en payant ^^
 
Je suis certes tordu, et peut-être que je n'irai jamais au bout: je suis plus intéressé par la démarche de partir d'une feuille blanche, que par le résultat final :)

n°2329676
rufo
Pas me confondre avec Lycos!
Posté le 24-02-2019 à 20:03:30  profilanswer
 

Alors Dreamweaver, tu vas oublier de suite. C'est vraiment pas un bon produit pour du dév web. Préfère Notepad++, Eclipse, codeblock... bref, des éditeurs de texte ou IDE adaptés et plus "pro".
 
Si tu choisis la voie de l'apprentissage et que c'est le chemin parcouru plus que le résultat qui compte pour toi, très bien. Dans ce cas, pour du dév web, va sur openClassRoom suivre les tutos sur le HTML5, CSS3, javascript/ajax, PHP et SQL. Pour concevoir une BD, apprends ce que sont les formes NF, notamment la plus importante à mon sens, la forme 3NF de Codd. Tu peux regarder aussi les BD non relationnelles (appelées aussi NoSQL) si le big data t'intéresse ;)
Pour le HTML5/css, je te recommande le site d'Alsacreation qui a de très bons tutos et a écrit un très bon livre sur le CSS.
 
T'auras aussi à apprendre l'algorithmie. Quand je lis sur un de tes messages que tu dupliquais la même ligne pour lire plusieurs enregistrements au lieu de faire une simple boucle, je me dis que tu pars de très loin et que le chemin va être long pour acquérir les algos de base du genre algos de tri (tri à bulles, quicksort, heap sort...), algos d'ordonnancement (johnson, LPT...), algos d'optimisation (plus court chemin, voyageur du commerce, simplex...), algos issus de la biomimétique (algos génétiques, algos basés sur les fourmis...)
Un petit tour par la POO te sera utile aussi. ;)
 
Et oui, être dév, c'est pas que pisser du code. C'est avant tout avoir un problème à résoudre, identifier sa classe (P, NP, NP complexe) et l'algo qui va le résoudre soit de manière exacte soit de manière approchée (via une heuristique) puis, seulement, coder.
Construire une appli obéit à la même logique.
 
C'est pour ça qu'on étudie pendant 5 ans et qu'après, on progresse par l'expérience.
Perso, je code depuis que j'ai 12 ans.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  Table à 2 colonnes - Définir variables selon Id (Résolu)

 

Sujets relatifs
[HTML/CSS][JavaScript] Récupérer un ID sur une autre page WebVariables dynamiques à partir de PHP 7
Lier textbox excel avec une table access[ORACLE] Changer la table dont un trigger fait partie
Performance de ma tableAuth Laravel avec une table différente de users
Comparer 4 colonnes entre 2 feuilles Excelvariables globales
[MySQL] Supprimer toutes les contraintes d'une tableconseil pour établir MCD relations table access
Plus de sujets relatifs à : Table à 2 colonnes - Définir variables selon Id (Résolu)


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR