[PHP] While in while loopt vast

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik wil een 2-tal queries achter elkaar doen om er voor te kunnen zorgen dat ik wat info ergens kan echo-en.

Op een of andere manier loop ik vast, en dat komt voor een While in een While die ik doe waardoor de binnenste while denk ik leeg is.

Volgens mij kan ik mijn query trouwens veel simpeler maken, maar ergens ontbreekt het me, ik kna niet verklaren waarom... het weer ? :X

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$uquery = mysql_query("SELECT * FROM users WHERE `id` ='$cusers'");
if (!$uquery) { echo( mysql_error()); }
            else {
                while ($urow = mysql_fetch_array($uquery)) {

$gmquery = mysql_query("SELECT * FROM game WHERE `id` ='$gmids'");
if (!$gmquery) { echo( mysql_error()); }
            else {
                while ($gmrow = mysql_fetch_array($gmquery)) {

echo "hier komen de rows die ik wil printen";

           }
       }
   } 
}


Ik weet wara de fout zit, de whiles, die waarschijnlijk nergens op slaan, en dus anders moeten. Ik heb de PHP manual er op na geslagen welke mysql_ ik het beste kan gebruiken... kom er even niet uit.

Acties:
  • 0 Henk 'm!

  • software
  • Registratie: Mei 2003
  • Laatst online: 02-01 09:26
Van waar haal je variable $gmids ? (2de mysql query)

Acties:
  • 0 Henk 'm!

Verwijderd

Wat dacht je van een JOIN?

Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Inderdaad, zoiets wil je met een join in SQL oplossen. Zodra je mysql_query in je binnenste loop aanroept, wordt het oude resultaat weer vrijgegeven zodat de buitenste loop in de soep loopt.

Je manier van inspringen is trouwens erg apart. Ik zou hier wat meer aandacht aan besteden.

[ Voor 12% gewijzigd door GlowMouse op 01-09-2007 16:38 ]


Acties:
  • 0 Henk 'm!

  • software
  • Registratie: Mei 2003
  • Laatst online: 02-01 09:26
GlowMouse schreef op zaterdag 01 september 2007 @ 16:37:
[...]
Je manier van inspringen is trouwens erg apart. Ik zou hier wat meer aandacht aan besteden.
Idd, en volgens bij staat er nog een } te kort ook.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ik haal de variabele uit een $_POST

Goed punt, ik had hier zelf ook al aangedacht, maar wist zelf even niet meer of dit wel de oplossing zou zijn.

Inspringen, klopt... dit was even snel... tja, snel c/p :)

@Software, tellen een probleem ? :9

[ Voor 16% gewijzigd door Verwijderd op 01-09-2007 16:43 ]


Acties:
  • 0 Henk 'm!

  • Onbekend
  • Registratie: Juni 2005
  • Laatst online: 23:19

Onbekend

...

Ik heb even wat gelay-outed:

PHP:
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
$uquery = mysql_query("SELECT * FROM users WHERE `id` ='$cusers'");

if (!$uquery) 
{ 
    echo( mysql_error()); 
}
else 
{
    while ($urow = mysql_fetch_array($uquery)) 
    {
        $gmquery = mysql_query("SELECT * FROM game WHERE `id` ='$gmids'");

        if (!$gmquery) 
        { 
            echo( mysql_error()); 
        }
        else 
        {
            while ($gmrow = mysql_fetch_array($gmquery)) 
            {
                echo "hier komen de rows die ik wil printen";
            }           
        }
    } 
}


Ook je fout-afhandeling vind ik ook niet echt bruikbaar.
Als mysql_query niet goed loopt, doe dan mysql_fetch_array.
Vooral while ($gmrow = mysql_fetch_array($gmquery)) vind ik vreemd.

Speel ook Balls Connect en Repeat


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dank je wel.

Ik denk dat het wijs is om sowiezo met een JOIN te werken, ik wilde dit alleen even zeker weten.

[ Voor 7% gewijzigd door Verwijderd op 01-09-2007 16:45 ]


Acties:
  • 0 Henk 'm!

Verwijderd

goed, ik ben ff spuit11
en heb de code alvast wat indenting gegeven

gooi jouw code ff tussen [ php ] en [ /php ] tags
en tipje... doe ff iets aan je indenting :X

[ Voor 59% gewijzigd door Verwijderd op 01-09-2007 16:58 . Reden: dubbele code weggehaald ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
OK, dank voor jullie commentaar, dit is een ruwe opzet, ik maak de code altijd netjes als het werkt bij een snelle opzet, tja... ieder zijn manier van werken.

De beste optie is dus een JOIN in deze ? Het was bij mij ook al opgekomen, maar ik kwam hier een topci tegen met eenzelfde probleem waar iemand mysql_data_seek aan de gang ging omdat hij een zelfde probleem met while in while had en de binnenste ook leeg was.

Acties:
  • 0 Henk 'm!

Verwijderd

nee, geen data_seek, volgens mij wordt (of is) die ook deprecated
(vervallen). Joinen is prima.

Als je het snel wilt doen, google dan even op php code beautifier je hebt online scripts die jouw code goed indenten en nu ook een windows programma, die dat doet. Heel handig.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Verwijderd schreef op zaterdag 01 september 2007 @ 16:57:
nee, geen data_seek, volgens mij wordt (of is) die ook deprecated
(vervallen). Joinen is prima.

Als je het snel wilt doen, google dan even op php code beautifier je hebt online scripts die jouw code goed indenten en nu ook een windows programma, die dat doet. Heel handig.
OK, JOINEN ben ik wel bekend mee, dus dan ga ik daar voor.

Bedankt voor de tool, dat is zeker handig om te hebben !

Acties:
  • 0 Henk 'm!

  • Onbekend
  • Registratie: Juni 2005
  • Laatst online: 23:19

Onbekend

...

Verwijderd schreef op zaterdag 01 september 2007 @ 16:50:
OK, dank voor jullie commentaar, dit is een ruwe opzet, ik maak de code altijd netjes als het werkt bij een snelle opzet, tja... ieder zijn manier van werken.
Als het in 1 keer goed werkt is het niet erg.
Maar heb je een (typ)foutje in je code of een haakje verkeerd, dan is dat niet snel eruit te halen.
Door steeds in te springen zie je in 1 klap welke stukken code er uitgevoerd wordt, en kan je ook andere gedeeltes bij het debuggen overslaan.

Speel ook Balls Connect en Repeat


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Onbekend schreef op zaterdag 01 september 2007 @ 17:05:
[...]

Als het in 1 keer goed werkt is het niet erg.
Maar heb je een (typ)foutje in je code of een haakje verkeerd, dan is dat niet snel eruit te halen.
Door steeds in te springen zie je in 1 klap welke stukken code er uitgevoerd wordt, en kan je ook andere gedeeltes bij het debuggen overslaan.
Dit is zeker waar, maar aangezien ik hieraan gewend ben bij een ruwe opzet weet ik waar ik moet zoeken, maar je hebt gelijk... als ik iemand anders zou laten debuggen heeft hij een probleem :)

Ik had het al in mijn achterhoofd, maar JOIN gaat niet werken, ik kan nergens tussen JOINEN. geen info komt overeen, ik heb alleen de variabele uit de database nodig om ergens in te gebruiken, of the echo-en.

Er is dus geen relatie tussen de tabellen users en game.

[ Voor 18% gewijzigd door Verwijderd op 01-09-2007 17:25 ]


Acties:
  • 0 Henk 'm!

Verwijderd

wat wil je dan laten zien?
wat wil je bereiken?

laat anders strax je structuur van de tabellen zien tussen [ sql ] tags :)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Verwijderd schreef op zaterdag 01 september 2007 @ 17:32:
wat wil je dan laten zien?
wat wil je bereiken?

laat anders strax je structuur van de tabellen zien tussen [ sql ] tags :)
Ik heb uit beide tabellen info nodig uit een bepaalde kolom per tabel (users en game) waar het ID gelijk is aan $cusers in de ene kolom en aan $gmids in de andere kolom.

$cusers en $gmids haal ik binnen via een $_POST.

[ Voor 5% gewijzigd door Verwijderd op 01-09-2007 17:35 ]


Acties:
  • 0 Henk 'm!

  • prototype
  • Registratie: Juni 2001
  • Niet online

prototype

Cheer Bear

Als ik het goed zie wil je dus eigenlijk alleen maar zien of een user bestaat en voor de rest doe je niets met de user data? Dan is de opzet zoals je 'm nu gebruikt redelijk inefficient, omdat indien je user tabel bestaat uit n-kolommen, je nu een n-tuple opvraagt waarvan je niets gebruikt. Beter is dan misschien om gewoon een SELECT EXISTS te gebruiken.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
prototype schreef op zaterdag 01 september 2007 @ 17:39:
Als ik het goed zie wil je dus eigenlijk alleen maar zien of een user bestaat en voor de rest doe je niets met de user data? Dan is de opzet zoals je 'm nu gebruikt redelijk inefficient, omdat indien je user tabel bestaat uit n-kolommen, je nu een n-tuple opvraagt waarvan je niets gebruikt. Beter is dan misschien om gewoon een SELECT EXISTS te gebruiken.
Ik zit ook met een gevoel dat dit iets te overdone is, ik kan me alleen geen goede weg vinden zoals ik vertelde.

EXISTS kan best een goede oplossing zijn, ik denk dat ik verkeerd begonnen ben.

Acties:
  • 0 Henk 'm!

Verwijderd

wil je dan de favoriete games van de users laten zien?
of iets anders?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Verwijderd schreef op zaterdag 01 september 2007 @ 17:43:
wil je dan de favoriete games van de users laten zien?
of iets anders?
Nee, heel simpel gezegd heb ik alleen de info nodig uit iedere tabel waar de id = $var, niet meer.

Deze echo is weer ergens.

Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 20-09 22:44

MBV

Verwijderd schreef op zaterdag 01 september 2007 @ 17:19:
[...]


Dit is zeker waar, maar aangezien ik hieraan gewend ben bij een ruwe opzet weet ik waar ik moet zoeken, maar je hebt gelijk... als ik iemand anders zou laten debuggen heeft hij een probleem :)

Ik had het al in mijn achterhoofd, maar JOIN gaat niet werken, ik kan nergens tussen JOINEN. geen info komt overeen, ik heb alleen de variabele uit de database nodig om ergens in te gebruiken, of the echo-en.

Er is dus geen relatie tussen de tabellen users en game.
Je mag ook zoiets doen:
SQL:
1
2
3
4
SELECT *
FROM users u, games g
WHERE u.id = $userid
AND g.id = $gameid

Dan zou hij alle tupels van users en games moeten geven die aan de WHERE voldoen :) Je zou zelfs zoiets kunnen doen voor meerdere games:
PHP:
1
$sql .= 'g.id IN ('.implode(', ', $array_met_games).')';

Acties:
  • 0 Henk 'm!

  • prototype
  • Registratie: Juni 2001
  • Niet online

prototype

Cheer Bear

Verwijderd schreef op zaterdag 01 september 2007 @ 17:42:
[...]


Ik zit ook met een gevoel dat dit iets te overdone is, ik kan me alleen geen goede weg vinden zoals ik vertelde.

EXISTS kan best een goede oplossing zijn, ik denk dat ik verkeerd begonnen ben.
Als je niet heel bekwaam bent met SQL maar wel met OO wil je misschien een O/R-mapper overwegen. Biedt je meteen een abstractielaag boven het meteen aanspreken van mysql functies, want stel je eens voor dat je script oppeens moet werken op postgresql, dan zul je je code moeten refactoren om alle mysql_query's te veranderen naar pgsql_query etc...

ActiveRecord is een leuk voorbeeld van een O/R mapper en met ruby en rails (waar een active record implementatie standaard bij zit) zou je dan zoiets schrijven als het volgende in je controller:

Ruby:
1
2
3
if User.exists?(params[:cusers])
    @game = Game.find(params[:gmids])
end


Indien game is gedefinieerd als (id, name), zou je in je view dat als volgt benaderen:

RHTML:
1
<h1><%= @game.name %></h1> met id <%= @game.id %>


Veel leesbaarder toch? ;)

Acties:
  • 0 Henk 'm!

Verwijderd

Nee, heel simpel gezegd heb ik alleen de info nodig uit iedere tabel waar de id = $var, niet meer.
Deze echo is weer ergens.
Ik ben namenlijk met iets soortgelijks bezig, dus als je zegt waar je gameid echo't en waar je userid echo't dan kunnen we wellicht een mooie SQL construeren.
Tenzij we teveel aan het helpen zijn natuurlijk.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Verwijderd schreef op zaterdag 01 september 2007 @ 18:01:
[...]

Ik ben namenlijk met iets soortgelijks bezig, dus als je zegt waar je gameid echo't en waar je userid echo't dan kunnen we wellicht een mooie SQL construeren.
Tenzij we teveel aan het helpen zijn natuurlijk.
Ik denk dat hulp hier in een topic opzich niet slecht is, ik denk ook mee :)

Ik denk hierbij ook aan iemand die dit topic eens tegen zal komen met een zelfde probleem, ideaal.

Wat maak jij ? Site ofzo ?

Acties:
  • 0 Henk 'm!

Verwijderd

offtopic:
Ik maak een site, waarbij de gebruikers hun favoriete game kunnen markeren en eventueel van sommige platforms kunnen instellen dat ze daar geen games van willen zien

maar... weer back ontopic. Ik help je graag, maar heb iets meer info nodig wat je wilt bereiken.
Waar komt de userid en waar komt de gameid? klein plaatje misschien?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Verwijderd schreef op zaterdag 01 september 2007 @ 18:21:
offtopic:
Ik maak een site, waarbij de gebruikers hun favoriete game kunnen markeren en eventueel van sommige platforms kunnen instellen dat ze daar geen games van willen zien

maar... weer back ontopic. Ik help je graag, maar heb iets meer info nodig wat je wilt bereiken.
Waar komt de userid en waar komt de gameid? klein plaatje misschien?
Het maakt opzich weinig uit waar het komt, ik moet ze gewoon beide beschikbaar hebben ergens in de code, waar maakt niet uit opzich, als ze er beide maar beschikbaar zijn.

Subqueries heb ik ook nog bekeken, ook niet wat ik nodig schijn te hebben.


Toevoeging:

Ik heb een manier voor een JOIN gevonden, alleen is de join wat lastig.

Ik heb in iedere tabel een kolom "cid".

Ik zou dus willen proberen, als eerste om uit iedere tabel alles te selecteren waar cid overeenkomt.

Dit is stap 1 :)

Dus er vanuit gaande dat ik tabel1, tabel2 en tabel3 heb.

Hierna wil ik gaan kijken of ik dan uit tabel3 ook nog eens kan filteren op een andere variabele.

Een probleem dat alle tabellen verschillende lengte hebben kan geen probleem opleveren aangezien dat allen bij UNION het geval is. Wat wel jammer is is dat alles met $row gedefinieerd zal moeten worden, dat kan naar mijn weten niet meer per tabel aangezien je ze gejoined hebt.

Ik heb wat mensen gesproken over een aparte query, dus 2 stuks, dit heb ik niet uit kunnen vinden en een goede, maar complexe join zal beter en sneller moeten zijn.

Ik heb alleen om de goede info op te zoeken 3 tabellen nodig waarbij mee ik JOIN, mag geen probleem op leveren, nu nog uitvinden hoe :)

[ Voor 40% gewijzigd door Verwijderd op 02-09-2007 05:03 ]

Pagina: 1