8796 sujets

Développement web côté serveur, CMS

Bonjour à tous,

J'ai beau chercher, je n'y comprends rien, mais alors rien du tout. Je tourne en rond.

Dans ma base, j'ai une table appelée 'pierres' qui regroupe les pierres précieuses et semi-précieuses, mais elles ont été entrées dans le désordre, pas par alpha.

J'ai donc créé une nouvelle table, 'pierres2', dans laquelle je réinscrit les fiches des pierres mais classées par alpha.

Or, j'en ai profité pour rentrer le nom de pierres qui n'avaient pas encore été traitées.

Par exemple, j'avais des fiches Agate, Aigue Marine, Amazonite, Ambre, etc... j'en ai profité pour rajouter, à l'id disponible (auto-increment), l'Alexandrite.

Mon script effectué, ma nouvelle table a exclu toutes les fiches déjà complètes en n'entrant que les vierges (nom mis à part)... C'est à devenir fou ! Mon code :



<?php

   require ('../config/fonctions.php');  
// pour les 2 fonctions GetMyConnection() et CleanUpDB()

   $nom                   = '';
   $classement            = '';
   $famille               = '';
   $composition           = '';
   $durete                = '';
   $couleurs              = '';
   $origine               = '';
   $histoire              = '';
   $production            = '';
   $utilisation           = '';

   GetMyConnection();
   $sql1 = "SELECT * FROM `pierres` ORDER BY nom ASC";
   $reponse1 = mysql_query($sql1);

   $rows1 = (mysql_num_rows($reponse1));
   if($rows1)
   {

       while($donnees = mysql_fetch_array($reponse1))
       {
           $nom                   = $donnees['nom'];
           $classement            = $donnees['classement'];
           $famille               = $donnees['famille'];
           $composition           = $donnees['composition'];
           $durete                = $donnees['durete'];
           $couleurs              = $donnees['couleurs'];
           $origine               = $donnees['origine'];
           $histoire              = $donnees['histoire'];
           $production            = $donnees['production'];
           $utilisation           = $donnees['utilisation'];

           $sql2 = "INSERT INTO pierres2 (id, nom, classement, famille, composition, durete, couleurs, origine, histoire, production, utilisation)
           VALUES('', '$nom', '$classement', '$famille', '$composition', '$durete', '$couleurs', '$origine', '$histoire', '$production', '$utilisation')";

           mysql_query($sql2);
       }

       CleanUpDB();

       echo "<HTML><BODY><BR><BR>C'est fini $rows1 </BODY></HTML>";
   }

?>



Vous auriez une idée ? Une aide serait la bien venue.

Merci à tous par avance.
Modifié par whombat (10 Mar 2010 - 19:00)
Salut,

whombat a écrit :
J'ai donc créé une nouvelle table, 'pierres2', dans laquelle je réinscrit les fiches des pierres mais classées par alpha.
Ce qui n'a vraiment aucun intérêt : il suffit de créer un index sur le nom et voilà tout. Smiley murf
Salut,

je ne vois pas trop l'intérêt de refaire une table, vu que mysql te permet de classer par ordre alphabétique, si jamais dans l'avenir tu insert "almandine" tu auras le même problème, et tu vas refaire un table à chaque insertion? Enfin il y a surement un truc que j'ai pas compris

Sinon si tu utilise autoincrement ce n'est pas nécessaire d'insérer un id, justement elle s'autoincrementera toute seule Smiley cligne
$sql2 = "INSERT INTO pierres2 (nom, classement, famille, composition, durete, couleurs, origine, histoire, production, utilisation)
VALUES('$nom', '$classement', '$famille', '$composition', '$durete', '$couleurs', '$origine', '$histoire', '$production', '$utilisation')";


edit: grillé Smiley lol
Modifié par matmat (10 Mar 2010 - 21:10)
Merci de vos réponses.

Je ne sais pas créer un index sur le nom (je suppose que c'est une croix à cocher) mais après... Comment s'en servir ?
Pour la créer il suffit d'utiliser phpMyAdmin : tu sélectionnes la table et tu cliques sur "Créer une clef sur 1 colonne" (pour ça il faut que le champ nom soit de type VARCHAR et pas TEXT).

Pour s'en servir il n'y a rien de spécial à faire : SELECT ... FROM pierres ORDER BY nom (et d'ailleurs cela fonctionne également sans créer d'index mais le traitement sera un peu plus long).

D'une manière générale il n'est jamais trop tard pour (re)voir les bases de SQL. Smiley cligne
Modifié par Heyoan (10 Mar 2010 - 23:23)
Merci pour votre attention et votre réponse.

Oh, mais j'ai revu les bases MySql. Le problème c'est que je veux faire une page, une seule, sur laquelle la BDD tourne. Un tableau qui se rempli par fiche. Avec un bouton Suivant et un bouton Précédent.
Avec des id, je sais faire, c'est simple, en gros :

Si Suivant, $page=$page+1
Si Precedent, $page=$page-1

Mais avec des noms indexés ?

J'ai fait un grand tour sur Google mais, soit jhe n'ai pas tout compris (parfois c'était abscon) soit je n'ai pas trouvé. Une idée qui pourrait m'orienter ?
Modifié par whombat (10 Mar 2010 - 23:52)
Il y a plusieurs façons de faire. Par exemple :
$pierre = !empty($_GET['pierre']) ? trim($_GET['pierre']) : '';
require_once('connexion.php');
// Récupération des infos de cette pierre si elle est renseignée
if(!empty($pierre)) {
	$sql = sprintf("Select nom, composition From pierres Where nom='%s'", mysql_real_escape_string($pierre));
	$result = mysql_query($sql);
	// Si cette pierre n'existe pas (url modifiée manuellement) on prendra la première
	if(mysql_num_rows($result)==0) $pierre='';
}
// Récupération des infos de la première pierre si elle n'est pas renseignée dans l'url ou si elle était incorrecte
if(empty($pierre)) {
	$sql = "Select nom, composition From pierres Order By nom Limit 1";
	$result = mysql_query($sql);
}

$row = mysql_fetch_assoc($result);
$nom = $row['nom'];
$composition = $row['composition'];

// génération du lien Précédent
$navigation = '';
$sql = sprintf("Select nom From pierres Where nom < '%s' Order By nom Desc Limit 1", mysql_real_escape_string($nom));
$result = mysql_query($sql);
if(mysql_num_rows($result) > 0) {
	$navigation .= '<a href="?pierre='.rawurlencode(mysql_result($result, 0)).'">Précédent</a> ';
}

// génération du lien Suivant
$sql = sprintf("Select nom From pierres Where nom > '%s' Order By nom Limit 1", mysql_real_escape_string($nom));
$result = mysql_query($sql);
if(mysql_num_rows($result) > 0) {
	$navigation .= '<a href="?pierre='.rawurlencode(mysql_result($result, 0)).'">Suivant</a> ';
}
echo '<p>'.$navigation.'</p>';
echo '<h1>'.htmlspecialchars($nom)."</h1>\n";
echo '<p><strong>Composition</strong> : '.htmlspecialchars($composition)."</p>\n";
Merci de la réponse. Plus que complète.

J'ai appris des choses et je vais re-fouiller php et mysql pour bien tout saisir. Mais l'idée générale, bête comme chou, ne m'avait pas traversé l'esprit à savoir le coup de décrémenter (ORDER BY nom DESC) dans le cas de Précédent.

Merci de m'avoir réveillé.

Je comprends d'abord, au lieu de copier bêtement, et je réalise.

Je vous tiens au courant.

Merci encore.

A propos, si vous cherchez un job, essayez prof, ça vous va drôlement bien...
Ca y est, Heyoan.

Tout fonctionne. Seul détail c'est que je ne sais pas pourquoi. Car en fait, dans le script lui-même, sur vos conseils, je me suis servi de mySql_real_escape_string au lieu de l'enregistrement basique. Je ne vois pas en quoi la différence (pour le fonctionnement j'entends) est réellement notable.

Car, pour voir, j'ai tenté de passer de la table1 en table2 et ça fonctionne !! Je pige pas où était l'erreur.

Ce qui n'enlève en rien tout ce que vous m'avez donné et dont je me sers maintenant.

Alors encore un grand merci.

Très cordialement.

Whombat
Modifié par whombat (11 Mar 2010 - 17:46)