[PHP] Array / Foreach probleem

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • DjKahless
  • Registratie: Juli 2009
  • Laatst online: 14-07-2024
Hallo allemaal, ik ben sinds kort begonnen met mijn eerste eigen php script met een MySql backend echter loop ik tegen een probleem aan met foreach.

Ik heb veel gegoogled, maar ik snap niet helemaal wat ze bedoelen

Hier is het script dat ik zover heb gemaakt, ik heb momenteel foreach helemaal er niet inzitten omdat ik het gewoon helemaal niet snap. Ik ben er wel uit dat ik het nodig heb.

code:
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
32
33
34
35
36
37
38
<?php
//Laad de database connectie instellingen
Include 'config.php';
include 'opendb.php';
Include 'menu.php';

// Begin met het laden van de gegevens van de aankomende Patch waar een crafter bekend is
// Live=0 betekend PTR servers.... dus NIET de Live servers!!!

$query  = "SELECT gems.gemID, GemName, CrafterName, Crafted.CrafterID, Stats, Socket, Live
           FROM gems, crafters, Crafted
           WHERE Live=0
           AND gems.gemID=Crafted.gemID
           AND crafters.CrafterID=Crafted.CrafterID";
$result = mysql_query($query);

//  begin met het maken van de Tabel voor de gegevens

    echo  "<table border=1>" .
          "<tr><td colspan=4><b>Upcomming in the next patch with crafter</b> : <br></td></tr>" .
          "<tr><td>Name</td><td>Stats:</td><td>Socket</td><td>Crafters</td>";
          
// Laad de gems zien
while($row = mysql_fetch_array($result, MYSQL_ASSOC))
{
    echo "<tr>" .
         "<td><a href=http://ptr.wowhead.com/?item={$row['gemID']} target=_blank>{$row['GemName']}</a> <br></td>" .
         "<td>{$row['Stats']} <br></td>" .
         "<td>{$row['Socket']} <br></td>";

// laat iedere crafter zien die deze gem kan craften
   echo "<td>{$row['CrafterName']} <br></td>";

// sluit de rij
    echo "</tr>";
}
Echo "</table><br><br>";
?>


op het volgende gedeelte heb ik een array/foreach loop nodig:

code:
1
2
// laat iedere crafter zien die deze gem kan craften
       echo "<td>{$row['CrafterName']} <br></td>";


Wat er moet gebeuren zoals je misschien al ziet is dat ik vanuit de tabel de gegevens uitlees van gems die beschikbaar komen in de nieuwe patch (ja World of Warcrafter) en dat ik van de gems die een crafter hebben alle crafters laat zien na de gegevens van de gem.


EDIT: Link naar de sciptjes: http://www.2r4u.nl/jc/

Stream @ http://twitch.tv/nessiroj


Acties:
  • 0 Henk 'm!

  • Luqq
  • Registratie: Juni 2005
  • Laatst online: 19-09 14:23
Ik denk dat je beter een aparte query kan maken daarvoor :)

Acties:
  • 0 Henk 'm!

  • DjKahless
  • Registratie: Juli 2009
  • Laatst online: 14-07-2024
Dus je bedoelt voor de
code:
1
2
// laat iedere crafter zien die deze gem kan craften
       echo "<td>{$row['CrafterName']} <br></td>";


dat ik nogmaals de gegevens uit de database lees? ik zie alleen niet hoe dat het verandert. de gegevens zitten momenteel in $row. want hij laat de 1e crafter zien. Alleen hij laat niet zien als er meerdere crafters zijn die dezelfde gems kunnen maken.

Stream @ http://twitch.tv/nessiroj


Acties:
  • 0 Henk 'm!

  • Manuel
  • Registratie: Maart 2008
  • Laatst online: 19-09 11:12
Blij te zien dat hier al wat meer kennis is in verwerkt dan al die andere scripts die hier heel af en toe voorbij komen, maar je bedoelt dus dat je $row["CrafterName"] wilt opsplitsen?

Dan even een aantal vragen:
is $row["CrafterName"] een array? * nodig voor foreach
Heb je wat kaas gegeten van array's? * handiger voor foreach

Beantwoord deze vragen eens als je wilt :-)

Acties:
  • 0 Henk 'm!

  • Luqq
  • Registratie: Juni 2005
  • Laatst online: 19-09 14:23
Doe je query eens in phpmyadmin :) Er klopt namelijk niks van. Je hebt maar 1 gem, en meerdere mensen kunnen die maken. Dan staan niet automatisch alle crafters in de row van die gem hoor ;)

Acties:
  • 0 Henk 'm!

  • DjKahless
  • Registratie: Juli 2009
  • Laatst online: 14-07-2024
is $row["CrafterName"] een array? * nodig voor foreach
Momenteel niet, het is de waarde Craftername rechtreeks uit de tabel
Heb je wat kaas gegeten van array's? * handiger voor foreach
lang geleden toen ik nog turbopascal heb geleerd op het MBO (9 jaar geleden) dus is niet echt meer wat het moet zijn.

ik weet nog wat een array doet en dat ik hem nodig heb maar hoe het precies in deze situatie te gebruiken wil maar niet lukken in gedacht. Ik weet wat ik wil maar alleen niet hoe :P

Stream @ http://twitch.tv/nessiroj


Acties:
  • 0 Henk 'm!

  • Manuel
  • Registratie: Maart 2008
  • Laatst online: 19-09 11:12
Je moet zorgen dat je dan $row["CrafterName"] in een array krijgt, maar zoals iedereen zegt loop even de query('s) na in PHPMyAdmin en waarschijnlijk vliegt de oplossing je direct al tegemoed :-)

Zo niet, zijn wij er nog altijd :p

Acties:
  • 0 Henk 'm!

  • DjKahless
  • Registratie: Juli 2009
  • Laatst online: 14-07-2024
@luqq

momenteel in de database staat inderdaad maar 1 gem welke een crafter toegekend heeft gekregen. Maar aan het scipt zelf zie ik al dat hij er niet meer gaat weergeven indien ik meerdere crafters zou toevoegen toch?

de database heeft 3 tabellen
tabel 1: gems => heeft alle informatie van de gems (doh)
tabel 2: crafters => heeft de informatie van de crafters in de guild
tabel 3: Crafted => heeft gemID en CrafterID

Stream @ http://twitch.tv/nessiroj


Acties:
  • 0 Henk 'm!

  • DjKahless
  • Registratie: Juli 2009
  • Laatst online: 14-07-2024
Manueltje22 schreef op zaterdag 18 juli 2009 @ 15:03:
Je moet zorgen dat je dan $row["CrafterName"] in een array krijgt, maar zoals iedereen zegt loop even de query('s) na in PHPMyAdmin en waarschijnlijk vliegt de oplossing je direct al tegemoed :-)

Zo niet, zijn wij er nog altijd :p
dan zullen we dat eerst een doen, zover bedankt. Kan zijn dat ik al een beetje te lang naar het scriptje aan het werken ben (vanmorgen om 0800 beginnen met het scriptje) dus dat ik niet zo heel helder meer denk momenteel.
Blij te zien dat hier al wat meer kennis is in verwerkt dan al die andere scripts die hier heel af en toe voorbij komen
/blush, het is mijn eerste script dat ik van de grond af opbouw. Heb vaak genoeg scripts aangepast aan mijn behoefte dus misschien dat het daarom er niet zo heel verkeerd uitziet :)

Stream @ http://twitch.tv/nessiroj


Acties:
  • 0 Henk 'm!

  • Luqq
  • Registratie: Juni 2005
  • Laatst online: 19-09 14:23
Exact. Je kan dit echt het beste oplossen om binnen je while loop van gems te kijken naar welke crafters die gem kunnen maken..

Acties:
  • 0 Henk 'm!

  • SinergyX
  • Registratie: November 2001
  • Laatst online: 01:18

SinergyX

____(>^^(>0o)>____

Wat je kan doen is hele Crafted tabel naar een array sturen, waarbij elke gemID weer een array heeft met crafters. Die kan je dan per gemID regel laten zien in je tabel.

Of je zou in je while steeds opnieuw een qeury kunnen doen om de crafters voor de gemID op te halen, maar weet niet of dit nu sneller of langzamer is dan alles vooraf in een array te zetten.

[ Voor 36% gewijzigd door SinergyX op 18-07-2009 15:14 ]

Nog 1 keertje.. het is SinergyX, niet SynergyX
Im as excited to be here as a 42 gnome warlock who rolled on a green pair of cloth boots but was given a epic staff of uber awsome noob pwning by accident.


Acties:
  • 0 Henk 'm!

  • DjKahless
  • Registratie: Juli 2009
  • Laatst online: 14-07-2024
SinergyX schreef op zaterdag 18 juli 2009 @ 15:13:
Wat je kan doen is hele Crafted tabel naar een array sturen, waarbij elke gemID weer een array heeft met crafters. Die kan je dan per gemID regel laten zien in je tabel.

Of je zou in je while steeds opnieuw een qeury kunnen doen om de crafters voor de gemID op te halen, maar weet niet of dit nu sneller of langzamer is dan alles vooraf in een array te zetten.
dat klinkt goed en denk dat dat het makkelijkste is. omdat hier maar 3 dingen instaan:

colom ID: autoincrement
CrafterID: => ID van de crafter welke gelijk is aan CrafterID in de tabel Crafter waar de naam etc word / zal moeten worden opgezocht
gemID: => ID van de gem welke gelijk is aan de gemID in de tabel gems

Stream @ http://twitch.tv/nessiroj


Acties:
  • 0 Henk 'm!

  • DjKahless
  • Registratie: Juli 2009
  • Laatst online: 14-07-2024
code:
1
2
3
4
5
SELECT gems.gemID, GemName, CrafterName, Crafted.CrafterID, Stats, Socket, Live
           FROM gems, crafters, Crafted
           WHERE Live=0
           AND Crafted.gemID=gems.gemID
           AND Crafted.CrafterID=crafters.CrafterID


geeft als resultaat:
code:
1
2
3
40114   Bright Cardinal Ruby    Ainevar 1   +40 Attack Power    Red 0
40114   Bright Cardinal Ruby    Aresii  2   +40 Attack Power    Red 0
40116   Flashing Cardinal Ruby  Blr 3   +20 Parry Rating    Red 0


Dus hij vind het volgende in de query
gemID gemName CrafterName CrafterID gemStats gemSocket gemLive

het vreemd is alleen als ik de php laat lopen krijg ik het volgende te zien:

code:
1
2
3
Upcomming in the next patch with crafter :
Name    Stats:  Socket  Crafters
Bright Cardinal Ruby    +40 Attack Power  Red Ainevar   Aresii Blr


Blr zou er niet morgen staan.... want dat zou een nieuwe regel moeten zijn met de gegevens van een gem en dan hem als crafter....

ik ben het spoor nu helemaal kwijt lol

Stream @ http://twitch.tv/nessiroj


Acties:
  • 0 Henk 'm!

  • DataGhost
  • Registratie: Augustus 2003
  • Laatst online: 21:26

DataGhost

iPL dev

PHP doet niet wat je wil, PHP doet wat je het opdraagt te doen. Vervang eventueel PHP door een andere taal of gewoon 'een computer'.

Probeer je code eens te begrijpen. Je moet niet domweg door de hele array heenlopen en alle namen die je tegenkomt uitspugen, je moet ook kijken naar de gem die bij die naam hoort. Als je (kijkend naar je originele code) binnen in de while-loop nog eens de hele array doorloopt, lijkt het mij vrij logisch dat na 1 iteratie helemaal niks meer over is om een nieuwe regel mee te beginnen.

Edit: sowieso zijn per-gem-queries misschien iets beter voor dit uitvoerformaat, gegeven je kennisniveau. Je gaat er nu vanuit dat de gems 'gegroepeerd' worden uitgevoerd, een garantie die eigenlijk nergens hard gemaakt wordt.

[ Voor 17% gewijzigd door DataGhost op 18-07-2009 17:25 ]


Acties:
  • 0 Henk 'm!

  • DjKahless
  • Registratie: Juli 2009
  • Laatst online: 14-07-2024
code:
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
32
33
34
35
36
<?php
//Laad de database connectie instellingen
Include 'config.php';
include 'opendb.php';
Include 'menu.php';

// Begin met het laden van de gegevens van de aankomende Patch waar een crafter bekend is
// Live=0 betekend PTR servers.... dus NIET de Live servers!!!

$query  = "SELECT gems.gemID, GemName, CrafterName, Crafted.CrafterID, Stats, Socket, Live
           FROM gems, crafters, Crafted
           WHERE Live=0
           AND Crafted.gemID=gems.gemID
           AND Crafted.CrafterID=crafters.CrafterID";
$result = mysql_query($query);

//  begin met het maken van de Tabel voor de gegevens

    echo  "<table border=1>" .
          "<tr><td colspan=4><b>Upcomming in the next patch with crafter</b> : <br></td></tr>" .
          "<tr><td>Name</td><td>Stats:</td><td>Socket:</td><td>Crafters:</td>";
          
// Laad de gems zien
while($row = mysql_fetch_array($result, MYSQL_ASSOC))
{
    echo "<tr>" .
         "<td><a href=http://ptr.wowhead.com/?item={$row['gemID']} target=_blank>{$row['GemName']}</a> <br></td>" .
         "<td>{$row['Stats']} <br></td>" .
         "<td>{$row['Socket']} <br></td>" .
         "<td>{$row['CrafterName']}<br></td>";

// sluit de rij
    echo "</tr>";
}
Echo "</table><br><br>";
?>


Nu werkt de code bijna zoals het moet. Hij laat nu alle crafters maar 1 maal zien, echter laat hij nu per crafter de gemnaam zien (dus in het voorbeeld komt de bright cardinal ruby 2 maal in de lijst. 1 maal met Ainevar en 1 maal met Aresii)

Straks of morgen weer verder om te kijken hoe ik dat kan oplossen.....
begin een beetje dubbel te zien ondertussen :P

Stream @ http://twitch.tv/nessiroj


Acties:
  • 0 Henk 'm!

  • SinergyX
  • Registratie: November 2001
  • Laatst online: 01:18

SinergyX

____(>^^(>0o)>____

Je zit nog steeds niet goed :P Crafter blijft een array, die moet je niet in de while zetten voor elke gem (=uniek), maar zal je dus per gem een while of een array moeten parsen.

Nog 1 keertje.. het is SinergyX, niet SynergyX
Im as excited to be here as a 42 gnome warlock who rolled on a green pair of cloth boots but was given a epic staff of uber awsome noob pwning by accident.

Pagina: 1