[PHP + MySQL] Probleem met resultset / multidimensie array

Pagina: 1
Acties:
  • 98 views sinds 30-01-2008

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

Topicstarter
Hallo,

Ik heb een klein probleempje, en zie zelf het bos door de bomen niet meer, vandaar dat ik mij naar jullie wend.
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
26
27
include("../../../webincludes/dbcon.inc.php"); // includen van DB connectie script
$query = array(
                "SELECT COUNT(*) AS total FROM `members`", 
                "SELECT COUNT(*) AS en_total FROM `members` WHERE `language` = 'EN'", 
                "SELECT COUNT(*) AS fr_total FROM `members` WHERE `language` = 'FR'",
                "SELECT COUNT(*) AS es_total FROM `members` WHERE `language` = 'ES'", 
                "SELECT COUNT(*) AS nl_total FROM `members` WHERE `language` = 'NL'"
               );

foreach($query as $key => $value);
{
    $result[$key] = mysql_query($value);
    if(!$result[$key])
    {
        echo mysql_error() ."<br />op query ". $key;
    }
    else
    {
        for ($i = 0; $i <= count($query); $i++)
        {
            $row[$key] = mysql_fetch_array($result[$key]);
            echo "<pre>";
            print_r($row[$key]);
            echo "</pre>";
        }
    }
}
Zoals te zien is, heb ik een array, met daarin mijn queries. Deze queries worden 1 voor 1 doorlopen, echter, als ik de arrays wil 'zien' (middels print_r) dan krijg ik alleen de array te zien van de laatste query / resultset. Nou vroeg ik me af, hoe dat dit kan, want aan de code kan het volgens mij niet liggen. :)

Tevens had ik
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
26
include("../../../webincludes/dbcon.inc.php"); // includen van DB connectie script
$query = array(
                "SELECT COUNT(*) AS total FROM `members`", 
                "SELECT COUNT(*) AS en_total FROM `members` WHERE `language` = 'EN'", 
                "SELECT COUNT(*) AS fr_total FROM `members` WHERE `language` = 'FR'",
                "SELECT COUNT(*) AS es_total FROM `members` WHERE `language` = 'ES'", 
                "SELECT COUNT(*) AS nl_total FROM `members` WHERE `language` = 'NL'"
               );

foreach($query as $key => $value);
{
    $result[$key] = mysql_query($value);
    if(!$result[$key])
    {
        echo mysql_error() ."<br />op query ". $key;
    }
    else
    {
        while($row[$key] = mysql_fetch_array($result[$key])
        {
            echo "<pre>";
            print_r($row[$key]);
            echo "</pre>";
        }
    }
}
geprobeert, maar ook dit stukje code, doet niet wat ik wil: de grote array, met daarin 5 nieuwe arrays printen (die de resultset laten zien).

Nu zit ik dus te denken, nu ik deze 2 stukjes code bekijk, alsof alleen de nieuwste results(et) 'onthouden' blijft, aangezien de twee stukken code naar mijn mening hetzelfde moeten doen.

De volgende versies van MySQL en PHP gebruik ik:
MySQL Server versie: 4.0.25
PHP Versie: 4.3.11

Het is mijn uiteindelijke bedoeling, om een circeldiagram te maken, met hoeveel % van de leden welke taal (EN, FR, ES of NL) hebben ;)

[ Voor 38% gewijzigd door CH4OS op 13-08-2005 17:30 ]


  • ripexx
  • Registratie: Juli 2002
  • Laatst online: 23:21

ripexx

bibs

Als je nu je print_r($result) doet na de foreach loop krijg je alles te zien. Want nu sla je wel alles op in de array maar geef je als output print_r($row[$key]). Maar die $key heeft niets met die $row te maken. Maar met een beetje debuggen moet je toch een eind komen?

buit is binnen sukkel


  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

Topicstarter
ripexx schreef op zaterdag 13 augustus 2005 @ 17:34:
Als je nu je print_r($result) doet na de foreach loop krijg je alles te zien. Want nu sla je wel alles op in de array maar geef je als output print_r($row[$key]). Maar die $key heeft niets met die $row te maken. Maar met een beetje debuggen moet je toch een eind komen?
Ik heb dat zojuist geprobeert met deze code:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    foreach($query as $key => $value);
    {
        $result[$key] = mysql_query($value);
        if(!$result[$key])
        {
            echo mysql_error() ."<br />op query ". $key;
        }
        else
        {
            for ($i = 0; $i <= count($query); $i++)
            {
                $row[$i] = mysql_fetch_array($result[$key]);
                echo "<pre>";
                print_r($row[$i]);
                echo "</pre>";
                $i++;
            }
        }
    }
    echo "<pre>";
    print_r($result);
    echo "</pre>";
en dit had als resultaat:
Array
(
    [4] => Resource id #4
)
als extra'tje

[ Voor 33% gewijzigd door CH4OS op 13-08-2005 17:43 ]


  • DizzyWeb
  • Registratie: Februari 2001
  • Laatst online: 23:23

DizzyWeb

Ondertiteld

Dat bovenste stuk code is natuurlijk volstrekt zinloos: je doet een foreach, dus voor elke query in die array voer je dat stuk uit... en daar in doe je een for loop die je voor elke query 5x uitvoert (count($query)). Terwijl je per query maar 1 regel terug krijgt.

Het 2e stuk krijg je een parse error.
while($row[$key] = mysql_fetch_array($result[$key]) )
Er mist een ) ;)

Probeer het zo eens:

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
include("../../../webincludes/dbcon.inc.php"); // includen van DB connectie script
$query = array(
                0 => "SELECT COUNT(*) AS total FROM `members`", 
                1 => "SELECT COUNT(*) AS en_total FROM `members` WHERE `language` = 'EN'", 
                2 => "SELECT COUNT(*) AS fr_total FROM `members` WHERE `language` = 'FR'",
                3 => "SELECT COUNT(*) AS es_total FROM `members` WHERE `language` = 'ES'", 
                4 => "SELECT COUNT(*) AS nl_total FROM `members` WHERE `language` = 'NL'"
               );

foreach($query as $key => $value);
{
    $result = mysql_query($value);
    if(!$result)
    {
        echo mysql_error() ."<br />op query ". $key;
    }
    else
    {
        $row[$key] = mysql_fetch_array($result[$key]);
    }
}
echo "<pre>";
print_r($row);
echo "</pre>";


Even uit de losse pols in een iets te klein vakje. En ja, ik heb indexen in de array gezet, ik ben er graag absoluut zeker van dat index 0 ook echt index 0 is...

[ Voor 17% gewijzigd door DizzyWeb op 13-08-2005 17:44 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:28
Als het niet aan je code ligt, waar zou het dan wel aan liggen ? :?

Zoals ripexx al zegt: debug je code eens;

https://fgheysels.github.io/


  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

Topicstarter
whoami schreef op zaterdag 13 augustus 2005 @ 17:43:
Als het niet aan je code ligt, waar zou het dan wel aan liggen ? :?

Zoals ripexx al zegt: debug je code eens;
Goeie vraag... Snap nu pas wat je bedoelt. Ik bedoelde eigenlijk, dat mijn code in theorie zou moeten werken. Ik krijg dus zeg maar wat anders dan ik verwacht... ;)

Enigste wat ik te weten kom, is dat de array voor de foreach nog gewoon goed is, met de 5 queries. Tijdens de foreach loop lijkt het erop alsof er opeens alleen de laatste query / resultset nog bestaat... :? Alleen lijkt het mij wel erg stug, dat er 'opeens' een $key => $value verloren gaat... 8)7
Heb dit stukje code geprobeert, maar na de foutjes eruit gehaalt te hebben, krijg ik hetzelfde als wat ik al had...

[ Voor 45% gewijzigd door CH4OS op 13-08-2005 17:54 ]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

GJ-tje schreef op zaterdag 13 augustus 2005 @ 17:45:
Heb dit stukje code geprobeert, maar na de foutjes eruit gehaalt te hebben, krijg ik hetzelfde als wat ik al had...
Als je "resource id #nogwat" terug krijgt, dan probeer je een recordset direct af te drukken, en dat kan inderdaad gewoon niet. Je andere fout is op te lossen zoals iemand hierboven al aangeeft:
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
include("../../../webincludes/dbcon.inc.php"); // includen van DB connectie script
$query = array(
                "SELECT COUNT(*) AS total FROM `members`", 
                "SELECT COUNT(*) AS en_total FROM `members` WHERE `language` = 'EN'", 
                "SELECT COUNT(*) AS fr_total FROM `members` WHERE `language` = 'FR'",
                "SELECT COUNT(*) AS es_total FROM `members` WHERE `language` = 'ES'", 
                "SELECT COUNT(*) AS nl_total FROM `members` WHERE `language` = 'NL'"
               );

foreach($query as $key => $value)
{
    $result[$key] = mysql_query($value);
    if(!$result[$key])
    {
        echo mysql_error() ."<br />op query ". $key;
    }
    else
    {
         $row[$key] = mysql_fetch_array($result[$key]);
         echo "<pre>";
         print_r($row[$key]);
         echo "</pre>";
    }
}

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Verwijderd

Disclaimer: als ik je post niet goed begrepen heb, kun je deze post overslaan

Waarom ga je binnen je foreach loop nog een keer for'en t/m count(query)? Verder is mysql_fetch_* hier niet het handigste; gebruik mysql_result. Daarnaast hoeft $result geen array te zijn, maar kun je hem gewoon reusen. Opzetje:

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
<?
include("../../../webincludes/dbcon.inc.php"); // includen van DB connectie script
$query = array(
                "SELECT COUNT(*) AS total FROM `members`", 
                "SELECT COUNT(*) AS en_total FROM `members` WHERE `language` = 'EN'", 
                "SELECT COUNT(*) AS fr_total FROM `members` WHERE `language` = 'FR'",
                "SELECT COUNT(*) AS es_total FROM `members` WHERE `language` = 'ES'", 
                "SELECT COUNT(*) AS nl_total FROM `members` WHERE `language` = 'NL'"
               );

foreach($query as $key => $value) {
    $result = mysql_query($value);
    if(!$result) {
        echo mysql_error() ."<br />op query ". $key;
    } else {
            $row[$key] = mysql_result($result, 0);
    }
}

echo "<pre>";
print_r($row);
echo "</pre>";

?>


Oja, wat doet de ; achter foreach?

[ Voor 12% gewijzigd door Verwijderd op 13-08-2005 18:19 ]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

Verwijderd schreef op zaterdag 13 augustus 2005 @ 18:18:
Disclaimer: als ik je post niet goed begrepen heb, kun je deze post overslaan

Waarom ga je binnen je foreach loop nog een keer for'en t/m count(query)?
Werd al gevraagd. ;)
Verder is mysql_fetch_* hier niet het handigste; gebruik mysql_result. Daarnaast hoeft $result geen array te zijn, maar kun je hem gewoon reusen. Opzetje:
Hij wil juist een 2-dimensionaal array krijgen, dus hij moet wel een fetchfunctie hebben, en dus ook $result als array gebruiken. ;)
Oja, wat doet de ; achter foreach?
Niet gezien, dat zal inderdaad waarschijnlijk gewoon de fout zijn. :X

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Brakkie
  • Registratie: Maart 2001
  • Niet online

Brakkie

blaat

Kan je niet beter
code:
1
SELECT count( language ) , language FROM `members` GROUP BY language

Doen? Dan heb je het in 1 query. Zo niet sorry voor de topic vervuiling ;)

[ Voor 21% gewijzigd door Brakkie op 13-08-2005 18:28 ]

Systeem | Strava


  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

Topicstarter
-NMe- schreef op zaterdag 13 augustus 2005 @ 18:13:
[...]

Als je "resource id #nogwat" terug krijgt, dan probeer je een recordset direct af te drukken, en dat kan inderdaad gewoon niet. Je andere fout is op te lossen zoals iemand hierboven al aangeeft:
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
include("../../../webincludes/dbcon.inc.php"); // includen van DB connectie script
$query = array(
                "SELECT COUNT(*) AS total FROM `members`", 
                "SELECT COUNT(*) AS en_total FROM `members` WHERE `language` = 'EN'", 
                "SELECT COUNT(*) AS fr_total FROM `members` WHERE `language` = 'FR'",
                "SELECT COUNT(*) AS es_total FROM `members` WHERE `language` = 'ES'", 
                "SELECT COUNT(*) AS nl_total FROM `members` WHERE `language` = 'NL'"
               );

foreach($query as $key => $value)
{
    $result[$key] = mysql_query($value);
    if(!$result[$key])
    {
        echo mysql_error() ."<br />op query ". $key;
    }
    else
    {
         $row[$key] = mysql_fetch_array($result[$key]);
         echo "<pre>";
         print_r($row[$key]);
         echo "</pre>";
    }
}
Hmmm... Don't ask me why... Maar deze code werkt... Maar toch ben ik benieuwd: Wat deed ik fout? :?

En waarom ik die for loop had? Omdat ik daarmee zeg maar de $key kon bepalen (Ik dacht dat het daarmee te maken had tijdens het debuggen)
Brakkie schreef op zaterdag 13 augustus 2005 @ 18:27:
Kan je niet beter
code:
1
SELECT count( language ) , language FROM `members` GROUP BY language

Doen? Dan heb je het in 1 query. Zo niet sorry voor de topic vervuiling ;)
Mwa, dat maakt voor mij niet eens zo gek veel uit, als ik die getallen maar heb om de percentages uit te rekenen :9

[ Voor 27% gewijzigd door CH4OS op 13-08-2005 19:04 ]


  • -Tibo-
  • Registratie: Januari 2002
  • Niet online

-Tibo-

ow = teh

n/m al gesuggereerd

[ Voor 82% gewijzigd door -Tibo- op 13-08-2005 19:01 ]


  • ripexx
  • Registratie: Juli 2002
  • Laatst online: 23:21

ripexx

bibs

GJ-tje schreef op zaterdag 13 augustus 2005 @ 18:54:
Mwa, dat maakt voor mij niet eens zo gek veel uit, als ik die getallen maar heb om de percentages uit te rekenen :9
Omfg, dat doe je met een query en een stuk minder omslachtige code. Maar blijkbaar zit er toch iets fout in jouw code.

buit is binnen sukkel


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

GJ-tje schreef op zaterdag 13 augustus 2005 @ 18:54:
Hmmm... Don't ask me why... Maar deze code werkt... Maar toch ben ik benieuwd: Wat deed ik fout? :?
2 dingen die allebei al genoemd zijn: die overbodige ; achter foreach en de dubbele loop die overbodig is.

Aangezien dit dus gewoon standaard debugwerk was, doe ik dit topic alsnog op slot. Een punkommatje dat teveel is vinden moet je zelf ook wel kunnen. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.

Pagina: 1

Dit topic is gesloten.