JeuWeb - Crée ton jeu par navigateur
Update sur plusieurs tables - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : Update sur plusieurs tables (/showthread.php?tid=3312)

Pages : 1 2 3


RE: Update sur plusieurs tables - Rouge - 22-12-2008

Ce genre de sport dans mysql, , j'ai laissé tomber ! Cela affiche encore plus d'erreurs que je ne maitrise et ne comprends pas :mauvais:
(désolé)

Sinon, questions table (et en reprenant ton exemple un peu plus haut) , faut-il mettre des spécificités dans certains champs?
Pour la table "ville", pas de soucis mais pour la table "case_ville" (qui est "mapville" chez moi) faut-il un autoincrement de id ou de ville_id?
et les clés , primaires, index, etc?
Je me demande si mon soucis ne vient pas de là :heuuu:


RE: Update sur plusieurs tables - Sephi-Chan - 23-12-2008

Une table de relation n'a pas de clé primaire. Elle contient deux clés étrangères vers deux tables.

En fait, je remarque que tu as de grosses difficultés car tu ne formalise pas assez ton code. Les noms sont donnés un peu n'importe comment.

Si tu veux être plus efficace lors du debug, il faut que tu structures ton travail. Pour cela, tu peux te fixer des conventions de nommage. Tes lignes de code doivent être courtes pour être lisibles.

Voici un exemple de convention de nommage dans la base de données :
  • Tout est écrit en minuscule ;
  • Les espaces sont représentés par des underscores _ ;
  • On n'utilise pas d'abréviation (adieu le posx, soit c'est x, soit position_x) ;
  • La table qui contient les villes s'appelle villes (au pluriel). Sa clé primaire s'appelle ville_id (le nom de la table au singulier suivi de _id). On fait de même pour la table qui contient les cases : cases avec case_id comme clé primaire ;
  • Une table qui lie la table villes à la table cases s'appelle cases_villes. On met le nom des tables (séparé par un underscore) dans l'ordre alphabétique ;
  • Cette table cases_villes contient au moins 2 colonnes : case_id et ville_id. Comme ça, les jointures t'apparaîtront naturellement ;

Quand tu écris tes requêtes, teste les petit à petit dans phpMyAdmin, avec des valeurs de test.

Ensuite, il faut que tu formalises tes requêtes.
  • On encadre la requête de guillemets doubles ;
  • Quand on insère une variable PHP dans le code, on l'encadre d'accolades ;
  • On n'oublie pas que pour MySQL, seules les chaînes de caractères doivent être encadrées de guillemets simples : WHERE nom = '{$nom}' ;
  • On donne aux variables des noms complets, non abrégés et appropriés (par exemple, mysql_query() renvoie une ressource) ;
  • On commente le code, surtout la requête ;
  • En cas d'erreur, on affiche la requête et l'erreur ;


// On récupère les villes d'après la position du joueur.
$sql = "
SELECT ville_id, position_x, position_y
FROM villes
WHERE position_x = {$joueur['position_x']}
AND position_y = {$joueur['position_y']}
";

$ressource = mysql_query($sql);

if($ressource === false){

echo '<pre>', $sql, '</pre>';
echo '<p>', mysql_error(), '</p>';

}
else {

$villes = array();
while($ville = mysql_fetch_assoc($ressource)){
$villes[] = $ville;
}

echo '<pre>', print_r($villes), '</pre>';

}

Ici, je recopie le jeu de résultat renvoyé dans un tableau $villes, ça permet d'avoir un code source plus clair (au profit d'un peu de ressources système).

N'oublie pas de bien aérer ton code ! De plus, je te conseille de définir cette fonction et d'en abuser :

function dump($variable){

// On pourra décommenter cette ligne quand le site sera opérationnel.
// return null;

if(is_scalar($var) === true){
echo '<pre>', var_dump($var), '</pre>';
}
else {
echo '<pre>', print_r($var), '</pre>';
}

}

Voilà, ça t'aidera peut-être à faire la plus grosse partie du travail seul. Smile


Sephi-Chan


RE: Update sur plusieurs tables - Rouge - 23-12-2008

Merci pour tous ces conseils, Sephi.
Je m'en vais de ce pas (re)travailler
de façon plus claire et carrée!
(pourtant le script d'origine sur la map générale fonctionne nickel) :pleure2:

Bon, ben j'ai de quoi occuper mes quelques jours de congés durant ces fetes
Confusediffle:


RE: Update sur plusieurs tables - Sephi-Chan - 23-12-2008

N'oublie pas de t'amuser quand même. Confusediffle:


RE: Update sur plusieurs tables - Karedas - 23-12-2008

(23-12-2008, 12:42 AM)Sephi-Chan a écrit :
  • Quand on insère une variable PHP dans le code, on l'encadre d'accolades ;


// On récupère les villes d'après la position du joueur.
$sql = "
SELECT ville_id, position_x, position_y
FROM villes
WHERE position_x = {$joueur['position_x']}
AND position_y = {$joueur['position_y']}
";

C'est marrant quand j'ai appris le php y'a un petit moment déjà il y'avait une gueguerre pour ne jamais mettre de variable au sein d'une chaine, j'ai gardé cette habitude machinalement ce qui donne:

// On récupère les villes d'après la position du joueur.
$sql = "
SELECT ville_id, position_x, position_y
FROM villes
WHERE position_x = ".$joueur['position_x']."
AND position_y = ".$joueur['position_y'];

J'ai vu depuis le coup des accolades dans des sources mais j'ignore completement de quand ça date et ce que ça vaut (j'ai fais une pause de 2 ans presque sans php, faut que je me remette au gout du jour).

edit: Je vois que niveau coloration syntaxique, Eclipse me met bien les varaibles entre accolades aux couleurs des varaibles ce qui est important pour la lisibilité.


RE: Update sur plusieurs tables - Ter Rowan - 23-12-2008

de même Smile j'aime pas trop intégrer les variables directement dans les chaines,

Je préfère la concaténation directement visible, ça fait un peu plus de caractères mais je trouve ça plus "propre" (et puis y a pas mal d'autres langages qui ne laissent pas le choix ^^, en fait tous ceux que je connais mais je ne suis pas une référence :p )


RE: Update sur plusieurs tables - Sephi-Chan - 23-12-2008

Mouais… Moi j'arrêterai de le faire quand on m'expliquera pourquoi ça n'est pas bien.
Ce jour n'est pas encore arrivé puisque la pratique est recommandé par les développeurs de Zend Framework.

Et puis, les points et les guillemets ajoutent du bruit, ce qui fait perdre en clarté. Ne serait-ce que sur la portion de code montrée, ".$joueur['position_x']." est visuellement plus lourd et sale que {$joueur['position_x']}.

Enfin bon, a Rouge de choisir. Ce ne sont que des conseils. Smile


Sephi-Chan, les accolades ont un côté clean que n'ont pas les guillemets et le point… Smile