Salut à tous,
Je cale sur un probleme, je veux faire un damier qui alterne entre deux type de cases ( Même 3 plus tard) mais déjà commencer avec deux.
il s'agit de case espace, puis case planète.
Alors j'ai fait un essai avec 5 lignes dans ma bdd, et j'essai de le reproduire actuellement je comprend pas comment imbriqué deux requte while.
Si quelqu'un à une idée ;)
voici mon code actuel:
<table class="galaxie_table">
<?php
for($x=1; $x<=10; $x++){
echo "<tr>";
for($y=1; $y<=10; $y++){
echo "<td></td>";
if($x % 1 == 0)
{
$s=$bdd->prepare('SELECT * FROM planete_test WHERE espace = 1');
$s->execute(array());
while($g=$s->fetch())
{
echo '<td class="carreaua"> ' . $g['position'] . '</td>';
$s=$bdd->prepare('SELECT * FROM planete_test WHERE planete = 1');
$s->execute(array());
while($d=$s->fetch())
{
echo '<td class="carreaub"> ' . $d['position'] . '</td>';
}
}
}
}
echo "</tr>";
}
?>
</table>
Salut,
Je ne sais pas si j'ai bien compris mais j'ai fait ce code qui donne un tableau de 2 cases alertnées avec tes requêtes. (J'ai mis planète et espace en texte car je suppose que tu veux mettre des images mais je ne les ai pas) Je crois que ton code ne marchait pas car tu définissais une variable dans ta première boucle while que tu redéfinissais dans ta deuxième du coup ça n'allait plus quand tu revenais à le première.
<?php
$bdd = new PDO('mysql:dbname=planete_test;host=localhost', 'root', ''); ?>
<table class="galaxie_table">
<?php for ($y=1; $y<=5; $y++) {
echo '<tr>';
for ($x = 1; $x <= 5; $x++) {
$s = $bdd->prepare('SELECT * FROM planete_test WHERE espace = 1');
$s->execute(array());
$s = $s->fetch();
echo '<td class="carreaua"> ' . $s['position'] . '</td>';
$d = $bdd->prepare('SELECT * FROM planete_test WHERE planete = 1');
$d->execute(array());
$d = $d->fetch();
echo '<td class="carreaub"> ' . $d['position'] . '</td>';
}
echo '</tr>';
echo '<tr>';
for ($z = 1; $z <= 5; $z++) {
$d = $bdd->prepare('SELECT * FROM planete_test WHERE planete = 1');
$d->execute(array());
$d = $d->fetch();
echo '<td class="carreaub"> ' . $d['position'] . '</td>';
$s = $bdd->prepare('SELECT * FROM planete_test WHERE espace = 1');
$s->execute(array());
$s = $s->fetch();
echo '<td class="carreaua"> ' . $s['position'] . '</td>';
}
echo '</tr>';
} ?>
</table>
Dis moi si ce n'est pas ça que tu veux. Après les requêtes prepare ne sont pas indispensables comme tu ne mets pas de variables dedans tu peux directement mettre execute.
J'espère t'avoir aidé.
tu veut alterné ou randomisé?
car la a premiere vue tu fait 50fois la requetes selectes ...je ne sais pas si ça ne serai pas mieux de faire un select limit 25 deux fois plutot
Bonjour,
Le soucis à rejouer les requêtes c'est que tu auras les mêmes infos d'une ligne sur l'autre.
Même si tu n'utilises pas ce pattern pense toujours MVC, on me demande qqch je cherche la donnée, je l'affiche (principe qu'on retrouve dans les middlewares).
En gros tu veux des planètes et des espaces, fais ta requete PUIS affiche tout.
<?php
$s=$bdd->prepare('SELECT * FROM planete_test WHERE espace = 1');
$s->execute(array());
$tabEspace = $s->fetchall();
$s=$bdd->prepare('SELECT * FROM planete_test WHERE planete = 1');
$s->execute(array());
$tabPlanete = $s->fetchall();
?>
<table class="galaxie_table">
<?php
for($x=1; $x<=10; $x++){
echo "<tr>";
echo '<td class="carreaua"> ' . $tabEspace[$x]['position'] . '</td>';
echo '<td class="carreaub"> ' . $tabPlanete[$x]['position'] . '</td>';
echo "</tr>";
}
?>
</table>
Alors alors je viens d'essayer le premier code de NESPOTE, c'est mieux que ce que j'ai sauf qu'il n'affiche que 2 lignes de la table. Après il affiche bien tout les carreaux. J'ai ensuite essayé le code de Eltharin, et le soucis avec celui-la c'est qu'il fait que 2 colones, une avec espace et l'autre avec planete.
Je pense qu'il faut utiliser les whiles non?
un for ça ressemble à un while :
for($i = 0; $i<10; $i ++)
{
//-- do something
}
$i =0;
while($i<10)
{
//-- do something
$i++;
}
Comment est ta base de données ?
les colonnes espace et planete ce sont tes ids?
non, j'ai un champs espace, un champs planete et c'est 0 ou 1 En plus d'autres champs, comme le nom de la case etc...
après
$tabEspace = $s->fetchall();
tu peux faire un print_r($tabEspace);
idem pour print_r($tabPlanete);
Ca te sort bien toutes tes planetes / espaces?
tu as obligatoirement le même nombre d'espace et de planete?
Si non, à un moment tu veux avoir 2 planetes ou 2 espaces sur la même ligne ou autre chose?
déjà y'a une faute là :
for($x=1; $x<=10; $x++){
=>
for($x=0; $x<=10; $x++){
Alors la j'ai fait 10 lignes pour essayer, mais sinon après il y aura plusieurs centaines de cases espace contre 8 de planetes max. en effet il y aura des espaces puis des planetes sur la meme ligne exemple:
espace = 2 / Planete = 0
22222222222222222222222
22220222202222222222220
22222222222222222222222
22222222222220222222222
Voila l'idée en gros pour schématiser
Le probleme c'est que tu ne t'occupe pas de la position de la planete pour l'écrire.
essaie de repenser ton code autrement.
vu que tu veux afficher des positions c'est ca que tu doit récupérer.
Ou alors si tu est sur d'avoir toutes les cases d'un univers de 10*10 cases par exemple là tu peux le faire en double for imbriqués
for ($ligne = 0;$ligne < 10;$ligne++)
{
echo '<tr>';
for ($colonne = 0;$colonne < 10;$colonne++)
{
//-- faire une condition d'affichage de la planete / espace
echo '<td>' . $var . '</td>';
}
echo '</tr>';
}
tu pourras meme ne faire qu'une requete pour récupérer toutes tes planetes, espaces et autres, et a chaque fois tester la position puis faire un affichage en fonction du "type"
Bon courage,
Ah oui plutot que faire planete = 1 ou 0 et espace = 1 ou 0 j'ecris plutot le type comme ça je n'ai qu'un champ.
Merci j'essaie cela demain soir ;) je viendrais tenir à jour le topic en suivant.
et pourquoi ne pas faire un truc genre :
l'idée c'est que tu recupere tes planetes et tes espace ... tu rentre tes planetes dans un tableau (data) ... apres tu deduit le nombre de planete du nombre de case souhaité (100-8) et la tu crée une boucle random pour crée tes 92 autres.
la tu as un array de 100 cases.
il reste plus qu' a bouclé 100fois, et et unset a chaque fois que tu pose une case ....
<?php
$nombre_carre = 100;
$planete = array("mars", "pluton", "venus"); // ICI tes 8 planete
$espace = array("espace_1", "espace_2", "espace_3"); // ICI tes x espaces differents
$data = $planete;
$nombre_espace = $nombre_carre - count($planete);
for ($i = 1; $i <= $nombre_espace; $i++) {
$data[] = $espace[array_rand($espace)];
}
for ($i = 1; $i <= $nombre_carre; $i++) {
$rand_keys = array_rand($data);
echo $data[$rand_keys];
unset($data[$rand_keys]);
$row++;
}
?>
J'avoue avoir du mal à comprendre ton code woozy ;) je ne connais pas data[], si tu peux me l'expliquer, je vais voir ce que je trouve sur le net.
Bon la j'ai ça :
<?php
for ($ligne = 0; $ligne < 3;$ligne++) // Nombre ligne hauteur
{
echo '<tr>';
for ($colonne = 0;$colonne < 3;$colonne++)
{
$s=$bdd->prepare('SELECT * FROM planete_test ORDER BY position');
$s->execute(array());
while($g=$s->fetch())
{
echo '<td class="carreaua"> ' . $g['position'] . '</td>';
}
}
echo '</tr>';
}
?>
C'est pas trop mal, sauf que si je veux faire pour essayer du 3x3 il va lire mes 10 champs 3 fois au lieu de s'arreter.
123
456
789
Il fera :
12345678910 12345678910 12345678910
12345678910 12345678910 12345678910
12345678910 12345678910 12345678910
Ty Malib, c'est tres simple le $data[] ... petit exemple ça pousse un element dans ton tableau
$data = array(); // on crée un tableau vide
$data[] = "jaune";
var_dump($data); // array("jaune");
$data[] = "vert";
var_dump($data); // array("jaune","vert");
donc quand je fait un (voir ci dessous) , je pousse dans mon tableau des espace pris de façon aleatoire (avec array_rand).
$data[] = $espace[array_rand($espace)];
A rien mis à part que je voulais me servir de ça pour faire mon tableau. Pour savoir qui se trouve à quel endroit je pensais qu'il serrait plus simple de positionner de cette façon.
ALors mon objectif final c'est d'arriver à faire ça :
https://zupimages.net/up/18/36/h9oz.png
Ca c'est la carte qui represente 1 système solaire. J'ai dans ma BDD des milliers de champs dans une table qui compose au total 500 systèmes comme celui la.
Il faut imaginer que sous cette grande image se cache un tableau qui comporte des cases espaces, et des cases planetes. La carte sera composé de 45 carré long par 45 larges.
Comme ceci :
https://zupimages.net/up/18/36/cnj3.png
En gris : Espace
En rouge : Planete
Car chaque case à son importance. Maintenant comme je ne sais pas comment m'y prendre j'ai fait une table test pour faire un tableau de même sorte en 3 de long et 3 large pour essayer de comprendre comment je peux faire.
Voila ;) en esperant avoir été assez claire sinon hésite pas à me demander d'éclaircir un point, c'est pas toujours simple :p
Merci
cette exemple marche (voir ci-dessous) il faut juste que tu remplisse les variable : $planete et $espace.
(normalement tu fais ça avec 2 requete SQL)
<style>
td{
height:60px;
width:60px;
}
.mars,.pluton,.venus{
background-color: green;
color:#FFF;
}
</style>
<?php
$heigth_case = 7;
$width_case = 7;
$nombre_carre = $heigth_case*$width_case;
$planete = array("mars", "pluton", "venus"); // ICI tes 8 planete
$espace = array("espace_1", "espace_2", "espace_3"); // ICI tes x espaces differents
$data = $planete;
$nombre_espace = $nombre_carre - count($planete);
for ($i = 1; $i <= $nombre_espace; $i++) {
$data[] = $espace[array_rand($espace)];
}
echo "<table border='3'>";
$col = 1;
for ($i = 1; $i <= $nombre_carre; $i++) {
if ($col == 1) {
echo "<tr>";
}
$rand_keys = array_rand($data);
echo "<td class='".$data[$rand_keys]."'>";
echo $data[$rand_keys];
echo "</td>";
unset($data[$rand_keys]);
if ($col == $width_case) {
echo "</tr>";
$col = 1;
}else{
$col++;
}
}
echo "</table>"
?>
pour recuperé les planete et populate le tableau
<?php
$planete = array();
$planete_query = $bdd->prepare("SELECT * FROM planete_test");
$planete_query->execute();
while($myplanete=$planete_query->fetch(PDO::FETCH_ASSOC)){
$planete[] = $myplanete["name"]; // ou image etc
}
?>
Pour les espaces
<?php
$espace = array();
$espace_query = $bdd->prepare("SELECT * FROM espace_test");
$espace_query->execute();
while($myespace=$espace_query->fetch(PDO::FETCH_ASSOC)){
$espace[] = $espace["name"]; // ou image etc
}
?>
Moi je ferais une table élément, avec dedans la position comme tu l'appelles mais peut etre dissocier le x et le y, et le type.
Ca te permettrait de pouvoir "agrandir" ton espace ou n'avoir qu'une partie facilement.
<?php
define('XMIN',0);
define('XMAX',100);
define('YMIN',0);
define('YMAX',100);
$elements = [];
$s=$bdd->prepare('SELECT * FROM elements');
$s->execute(array());
foreach($s->fetchall() as $elem)
{
$element[$elem['y']][$elem['x']] = $elem;
}
?>
<table class="galaxie_table">
<?php
for($y=YMIN; $y<=YMAX; $y++)
{
echo "<tr>";
for($x=XMIN; $x<=XMAX; $x++)
{
if(isset($elem[$y][$x]))
{
echo '<td class="carreaub ' . $elem[$y][$x]['type'] . '"> ' . $elem[$y][$x]['libelle'] . '</td>';
}
else
{
echo '<td class="carreaub"></td>';
}
}
echo "</tr>";
}
?>
</table>
tes planetes (de type planete), tes espaces si il y a un interet de savoir quel espace se trouve à cet endroit(si non il faut gerer par exception si pas d'element alors espace) ,et apres si tu veux d'autres types de cases genre etoile
Oui il y a un interet, tout l'interet est la ^^ Okay thanks je vais tester vos methodes
Alors j'ai actuellement ceci :
Warning: Illegal string offset 'type' in /htdocs/game/sdc/code.php on line 74
Warning: Illegal string offset 'libelle' in /htdocs/game/sdc/code.php on line 74
https://zupimages.net/up/18/36/urf0.png
ET j'ai mis cette ligne :
define('XMIN',0);
define('XMAX',100);
define('YMIN',0);
define('YMAX',100);
$elements = [];
$s = $bdd->prepare('SELECT * FROM planete_test ');
$s->execute(array());
foreach($s->fetchall() as $elem)
{
$element[$elem['y']][$elem['x']] = $elem;
}
?>
<table class="galaxie_table">
<?php
for($y=YMIN; $y<=YMAX; $y++)
{
echo "<tr>";
for($x=XMIN; $x<=XMAX; $x++)
{
if(isset($elem[$y][$x]))
{
echo '<td class="carreaub ' . $elem[$y][$x]['type'] . '"> ' . $elem[$y][$x]['libelle'] . '</td>';
}
else
{
echo '<td class="carreaub"></td>';
}
}
echo "</tr>";
}
?>
</table>
my bad, dans la deuxieme partie (quand on ecrit le tableau), c'est plus elem c'est element qu'il faut utiliser
D'acc, alors j'ai modifié j'ai bien les carreaux qui apparraissent. J'ai essayer de changer libellé par position voir si quelque chose apparait mais rien. Ni sur stype ni position.
print_r me donne :
Array ( [] => Array ( [] => Array ( [id] => 10 [0] => 10 [nom_planete] => [1] => [position] => 10 [2] => 10 [coordonnee_spatial] => 0 [3] => 0 [coordonnee_terrestre] => 0 [4] => 0 [espace] => 0 [5] => 0 [planete] => 1 [6] => 1 [type] => planete [7] => planete ) ) )
ah ben oui mais tu as pas mis x et y pour les positionner sur la carte.
du coup tu n'as qu'une valeur.
Je viens d'essayer de rajouter deux champs dans ma table, x et y mais je crois que c'est pas ça qu'il faut faire.
EDIT:
DOnc si c'etait bien ça, je commence à avoir des positions qui apparraissent. ;)
si c'est ca, et il faut les remplir avec les coordonnées de tes elements, pour qu'a l'affichage le programme sache qui va ou.
Par contre je ne comprend pas pourquoi il maffiche une partie de carré jaune et l'autre grise (le soucis n'est pas la couleur) j'ai le carreaub en jaune et carreaua en gris et il affiche n'importe comment c'est dû à quoi?
Edit: voila l'image
https://zupimages.net/up/18/36/eaek.png
Et voila mes deux lignes, il y en a une j'ai mis la position et l'autre le type expret pour voir qui etait quoi.
if(isset($elem[$y][$x]))
{
echo '<td class="carreaub ' . $element[$y][$x]['type'] . '"> ' . $element[$y][$x]['type'] . '</td>';
}
else
{
echo '<td class="carreaua ' . $element[$y][$x]['type'] . '"> ' . $element[$y][$x]['position'] . '</td>';
}
faut que tu mette element partout je t'ai dis!!
Même là :
if(isset($elem[$y][$x]))
:)
la en fait, tu fais la condition sur les lignes et champs de ta base (du fait que tu récupères en FETCH_BOTH (nom des champs et numéros des champs)
donc ca te sort n'importe quoi.
Okay ça semble bon la. ;)
Autre question si je veux plusieurs pages je fais un système de pagination?
tu modifies les defines (que tu peux mettre en variables d'ailleurs si tu veux) tu n'auras qu'une partie de ton univers.
d'accord, je fais des essais la ;)
Le tableau reste en bas de page j'essai de le remonter ^^
J'ai une question: que signifie le premier $element dans la balise?
echo '<td class="carreauc ' . $element[$y][$x]['type'] . '"> ' . $element[$y][$x]['planete'] . '</td>';
Il faut que tu regardes un peu le code que ca te sort...
Ca ajoute une classe a ta case en fonction du type plutot que carreaua carreaub
Je check je check je fais pas mal d'essais etc mais quand je le modifiais je trouvais pas de difference ;)
J'ai fait le systeme de GET par systeme la maintenant j'essai de recuperé les infos de la case ou je clic.