[PHP/MYSQL] Mysql selectie's door elkaar op pagina verdelen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Gerwin
  • Registratie: Juli 2001
  • Laatst online: 08-06 20:10

Gerwin

Ik ben er klaar voor!

Topicstarter
Ok, daar gaat ie. Ik heb een database waaruit ik via meerdere query's meerdere records uithaal. Nu zou ik graag die twee recordsets willen verdelen over een pagina. Dus zo bijvoorbeeld:


>> BODY

velden 1,2,3 uit record 1 van query 1
velden 1,2,3 uit record 2 van query 1
velden 1,2,3 uit record 3 van query 1
velden 1,2,3 uit record 4 van query 1
velden 1,2,3 uit record 5 van query 1

velden 1,2,3 uit record 1 van query 2
velden 1,2,3 uit record 2 van query 2
velden 1,2,3 uit record 3 van query 2
velden 1,2,3 uit record 4 van query 2
velden 1,2,3 uit record 5 van query 2

velden 1,2,3 uit record 6 van query 1
velden 1,2,3 uit record 7 van query 1
velden 1,2,3 uit record 8 van query 1
velden 1,2,3 uit record 9 van query 1
velden 1,2,3 uit record 10 van query 1

velden 1,2,3 uit record 6 van query 2
velden 1,2,3 uit record 7 van query 2
velden 1,2,3 uit record 8 van query 2
velden 1,2,3 uit record 9 van query 2
velden 1,2,3 uit record 10 van query 2

>> END BODY

Is het mogelijk om dit op enige wijze te realiseren? Ik heb zitten denken om per rij nog een query te laten doen, maar ik wil geen dubbele results krijgen op de verschillende plekken waar de verschillende query's staan.

Station van Gerwin Prins op Apple Music


Acties:
  • 0 Henk 'm!

  • André
  • Registratie: Maart 2002
  • Laatst online: 12-09 14:32

André

Analytics dude

Je code houdt toch een pointer bij, dus kan je verder lezen in een recordset vanaf waar je gebleven was. Hier is niet speciaals voor nodig, heb je al eens wat scripts bekeken/gezocht?

Acties:
  • 0 Henk 'm!

  • Gerwin
  • Registratie: Juli 2001
  • Laatst online: 08-06 20:10

Gerwin

Ik ben er klaar voor!

Topicstarter
Ik loop nu door de records doormiddel van:
PHP:
1
2
while ($row = mysql_fetch_array($result)) {
}

Bedoel je dit?
Zodra ik deze op een andere plek gebruik begint hij gewoon weer bij record 1.

Station van Gerwin Prins op Apple Music


Acties:
  • 0 Henk 'm!

Verwijderd

wat je kan doen is met de ene query alles uitlezen en dan alles wat gekoppeld zit aan een ID halen uit het 2e tabelen.

Dan hoef je maar 1 query te doen.

Klein voorbeeldje over groenten en zo
code:
1
2
3
SELECT ID
FROM groenten
WHERE tomaten > 0

(krijg je nu allemaal ID's) bv 1,2,3,4,5,6,7,9,11,55

dan doe je met deze id's die je even achter elkaar zet.
code:
1
2
3
SELECT *
FROM houdbaarheid
WHERE ID is IN(1,2,3,4,5,6,7,9,11,55)

Ofzo, tis iets uit het hoofd; ooit eens gebruikt voor een site waar ik eerst per pagina 35 queries had en had ze toen gereduceerd naar 7 stuks. (preformance winst was 900%)

[ Voor 9% gewijzigd door Verwijderd op 25-10-2004 20:56 . Reden: [code][/code] ]


Acties:
  • 0 Henk 'm!

  • André
  • Registratie: Maart 2002
  • Laatst online: 12-09 14:32

André

Analytics dude


Acties:
  • 0 Henk 'm!

Verwijderd

en als dat het is, gebruik je wel voor iedere query apparte variabelen? is wel handig en dan moet de pointer PER query staan waar deze gebleven is.

Acties:
  • 0 Henk 'm!

  • Gerwin
  • Registratie: Juli 2001
  • Laatst online: 08-06 20:10

Gerwin

Ik ben er klaar voor!

Topicstarter
Verwijderd schreef op 25 oktober 2004 @ 20:56:
wat je kan doen is met de ene query alles uitlezen en dan alles wat gekoppeld zit aan een ID halen uit het 2e tabelen.

Dan hoef je maar 1 query te doen.

Klein voorbeeldje over groenten en zo
code:
1
2
3
SELECT ID
FROM groenten
WHERE tomaten > 0

(krijg je nu allemaal ID's) bv 1,2,3,4,5,6,7,9,11,55

dan doe je met deze id's die je even achter elkaar zet.
code:
1
2
3
SELECT *
FROM houdbaarheid
WHERE ID is IN(1,2,3,4,5,6,7,9,11,55)

Ofzo, tis iets uit het hoofd; ooit eens gebruikt voor een site waar ik eerst per pagina 35 queries had en had ze toen gereduceerd naar 7 stuks. (preformance winst was 900%)
Er is geen enkele relatie tussen de query's. Ik selecteer een meuk records in query1 en in selecteer een neuk records in query2, 3, 4... en nu wil de results van de query's weergeven op de pagina..

Dus
stukje 1 van query 1
stukje 1 van query 2
stukje 1 van query 3

stukje 2 van query 1
stukje 2 van query 2
stukje 2 van query 3

stukje 3 van query 1
stukje 3 van query 2
stukje 3 van query 3
Dat is een heel ingewikkeld iets zeg, maar begrijp ik nu goed dat je hier data mee kunt zoeken? Ik hoef toch niets te zoeken? Kan ik bovenstaande echt realiseren met dat script dat je voorsteld?
Verwijderd schreef op 25 oktober 2004 @ 20:58:
en als dat het is, gebruik je wel voor iedere query apparte variabelen? is wel handig en dan moet de pointer PER query staan waar deze gebleven is.
Heb ik, zou hij dan verder moeten gaan waar hij gebleven was?
Denk dat er het probleem is dat hij in de while loop alles afgaat en dan weer bij 0 uitkomt bij de volgende while loop.... ik zie ook dubbele results (twee dezelfde rijen uit dezelfde query... terwijl hij verder zou moeten gaan...

Station van Gerwin Prins op Apple Music


Acties:
  • 0 Henk 'm!

  • X-Lars
  • Registratie: Januari 2004
  • Niet online

X-Lars

Just GoT it.

Misschien onmogelijk, maar kun je je query niet zo opstellen dat je stukje 1 van query 1, 2 en 3 in één keer krijgt?

Of de resultaten van de queries in arrays stoppen en deze arrays uitlezen?

Je zegt dat er geen enkele relatie tussen de queries is, kun je die posten?

Acties:
  • 0 Henk 'm!

Verwijderd

waarom doe je niet gewoon logisch, en maak je van die 4 stappen waarvoor je 2 queries nodig bent niet vier keer een aparte output en die mik je in elkaar en klaar is keez.

Verder als het aantal items gelijk zijn :) wat handig is zou je dit kunnen doen.

code:
1
2
3
4
5
for ($x = 0; $x < $items; $x++)
{
    $listje1 = mysql_fetch_object($query1);
    $listje2 = mysql_fetch_object($query2);
}


en als dat niet werkt... hmm... dan raad ik je toch mysql_data_seek aan, en echt zo moeilijk zijn 3 parametertjes niet hoor :7

Acties:
  • 0 Henk 'm!

  • Gerwin
  • Registratie: Juli 2001
  • Laatst online: 08-06 20:10

Gerwin

Ik ben er klaar voor!

Topicstarter
Ben iets verder gekomen na het zaakje eens een tijdje hebben laten liggen en vervolgens eens grondig speurwerk te hebben gedaan, echter: het werkt nog niet. Ik geloof dat ik op de goede weg ben en dat mijn plan ook wel goed is (suggesties?). Ook moet ik er nog iets op zien te vinden vervolgens de verschillende categorieren te kunnen weergeven, zodat 'k makkelijk met linkjeDesign(10) of linkjeWinkel(4) kan doen en vervolgens ik gewoon de volgende linkjes in de resultset reeks terugkrijg, maar eerst ditte maar eens eventjes. Wat doe ik hier nu verkeerd, en wat zou verbeterd kunnen worden? Ik blijf maar Offset Notice's krijgen, dan zegt hij dat er een Offset niet bestaat. Dat zou dan in de regels moeten zitten waarin in de website dingen terugnaal en samenstel, maar die r_Telt staat toch gewoon opnieuw te tellen? Als ik een echo doe van wat er nu daadwerklijk in die $website[][] zit krijg ik ook gewoon teksten.....

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
$sql = "
    SELECT
        id,
        title_25,
        text_25,
        text_45,
        url_left,
        url_right
    FROM
        websites
    ORDER BY
        RAND()
    LIMIT
        0, 100
";
    
$result = mysql_query($sql);

$r_Telt = 0;
            
while ($row = mysql_fetch_array($result)) {
    $websites = array();
    $websites[$r_Telt] = array();
    $websites[$r_Telt]['id'] = $row["id"];
    $websites[$r_Telt]['title_25'] = ucfirst($row["title_25"]);
    $websites[$r_Telt]['text_25'] = ucfirst($row["text_25"]);
    $websites[$r_Telt]['text_45'] = ucfirst($row["text_45"]);
    $websites[$r_Telt]['url_left'] = $row["url_left"];
    $websites[$r_Telt]['url_right'] = $row["url_right"];
    $r_Telt++;
}


function linkje($tag, $count,$websites){

    for ($r_Telt = 0; $r_Telt < $count;$r_Telt++) {

        ## samenstellen url
        $url = $websites[$r_Telt]['url_left'];
        $url .= $websites[$r_Telt]['url_right'];

        ## samenstellen title
        $title = $websites[$r_Telt]['title_25'];

        ## samenstellen description
        $description = $websites[3]['text_25'];

        ## regel omzetten
        $patterns = array ("/url/","/title/","/description/");
        $replace = array ($url, $title, $description);
        
        echo preg_replace($patterns, $replace, $tag);

        $r_Telt = $r_Telt + 1;
    }
}



linkje("<a href=\"url\">title</a><br>description<br>",3,$websites);

Station van Gerwin Prins op Apple Music


Acties:
  • 0 Henk 'm!

  • Gerwin
  • Registratie: Juli 2001
  • Laatst online: 08-06 20:10

Gerwin

Ik ben er klaar voor!

Topicstarter
Helemaal geen reacties?

Ik ben eruit waar het probleem was bij bovenstaande code en heb tevens een primitief tellersysteem erin gezet zodat ik zegmaar geen dubbele linkjes krijg op de pagina.

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
$sql = "
    SELECT
        id,
        title_25,
        text_25,
        text_45,
        url_left,
        url_right
    FROM
        websites
    WHERE
        text_25 != ''
    ORDER BY
        RAND()
    LIMIT
        0, 100
";
    
$result = mysql_query($sql);

$r_Telt = 0;

$selectie = array();
$selectie[$r_Telt] = array();
            
while ($row = mysql_fetch_array($result)) {
    $selectie[$r_Telt]['id'] = $row["id"];
    $selectie[$r_Telt]['title_25'] = ucfirst($row["title_25"]);
    $selectie[$r_Telt]['text_25'] = ucfirst($row["text_25"]);
    $selectie[$r_Telt]['text_45'] = ucfirst($row["text_45"]);
    $selectie[$r_Telt]['url_left'] = $row["url_left"];
    $selectie[$r_Telt]['url_right'] = $row["url_right"];
    $r_Telt++;
}

$r_Telt = 0;

function linkje($tag, $aantal, $selectie, $startbij){

    $telRij = 0; // rijenteller
    
    for ($r_Telt = $startbij; $telRij < $aantal; $r_Telt++) {
        
        // samenstellen
        $url = $selectie[$r_Telt]['url_left'];
        $url .= $selectie[$r_Telt]['url_right'];
        $title = $selectie[$r_Telt]['title_25'];
        $description = $selectie[$r_Telt]['text_25'];

        // regel omzetten
        $patterns = array ("/tellertje/","/url/","/title/","/description/");
        $replace = array ($telRij, $url, $title, $description);
        
        $tag = preg_replace($patterns, $replace, $tag);
        echo $tag;

        $telRij = $telRij + 1;
    }
    $startbij = $r_Telt;
    return $startbij;
}
$startbij = 0;

$startbij = linkje("tellertje. <a href=\"url\">title</a> - description<br>",
1,$selectie,$startbij);
$startbij = linkje("tellertje. <a href=\"url\">title</a> - description<br>",
1,$selectie,$startbij);
$startbij = linkje("tellertje. <a href=\"url\">title</a> - description<br>",
1,$selectie,$startbij);
$startbij = linkje("tellertje. <a href=\"url\">title</a> - description<br>",
1,$selectie,$startbij);


Ik ben er nog niet tevreden over. Het aanroepen van de functie zou ik toch graag met 1 regel kunnen doen en niet dat ik voor elke regel een nieuwe functie moet aanroepen. Daarnaast moet het nog mogelijk worden om in de functie verschillende categorieren te kunnen opgeven, wellicht met een $websites code op het moment dat de functie wordt aangeroepen. Probleem wordt dan hoe deze verschillende categorieren te kunnen orderen zodat hij zegmaar bij elke aanroep verder gaan met de linkjes in de array. Dus linkje("HTMLCODE","AANTAL LINKJES","CATEGORIE");. Daarnaast heb ik het probleem hoe nu te kunnen bepalen of een linkje daadwerkelijk bestaat en hoe te kunnen bepalen hoeveel de limiet op de select statement moet zijn.

Wat vinden jullie ervan? Tips zijn welkom

[ Voor 10% gewijzigd door Gerwin op 22-11-2004 00:39 ]

Station van Gerwin Prins op Apple Music


Acties:
  • 0 Henk 'm!

  • Gerwin
  • Registratie: Juli 2001
  • Laatst online: 08-06 20:10

Gerwin

Ik ben er klaar voor!

Topicstarter
Ik ben opnieuw iets verdergekomen. Ik heb nu onderstaande code, maar ik zoals ik eerder al zei moet er nog een functionaliteit inkomen zodat ik bij kan houden in waar het teruggeven van de linkjes gebleven is in verschillende categorieren.

De code tot nu toe.

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
$sql = "
    SELECT
        id,
        title_25,
        text_25,
        text_45,
        url_left,
        url_right
    FROM
        websites
    WHERE
        text_25 != ''
    ORDER BY
        RAND()
    LIMIT
        0, 100
";
    
$result = mysql_query($sql);

$r_Telt = 0;

$selectie = array();
$selectie[$r_Telt] = array();
$teller = array();            

while ($row = mysql_fetch_array($result)) {
    $selectie[$r_Telt]['id'] = $row["id"];
    $selectie[$r_Telt]['title_25'] = ucfirst($row["title_25"]);
    $selectie[$r_Telt]['text_25'] = ucfirst($row["text_25"]);
    $selectie[$r_Telt]['text_45'] = ucfirst($row["text_45"]);
    $selectie[$r_Telt]['url_left'] = $row["url_left"];
    $selectie[$r_Telt]['url_right'] = $row["url_right"];
    $r_Telt++;
}

function linkje ($teller, $cat, $hits, $link, $selectie) {


    for ($tel = 1; $tel <= $hits; $tel++) { 
        $r_Telt = $teller + $tel;  
        
        // samenstellen
        $url = $selectie[$r_Telt]['url_left'];
        $url .= $selectie[$r_Telt]['url_right'];
        $title = $selectie[$r_Telt]['title_25'];
        $description = $selectie[$r_Telt]['text_25'];
        $tella = $r_Telt;

        // regel omzetten
        $patterns = array ("/tellertje/","/url/","/title/","/description/");
        $replace = array ($tella, $url, $title, $description);
        $linko = preg_replace($patterns, $replace, $link);

        echo $linko;
        
//      echo $teller+"."+$link;  
    } 

    $teller = $teller + $hits;  
//  echo "<BR><BR>we tellen er: ".$teller;
    return $teller; 
}

$teller = 0;
$teller = linkje($teller, 1, 3,
 "tellertje. <a href=\"url\">title</a> - description<br>", $selectie);
$teller = linkje($teller, 1, 10,
"tellertje. <a href=\"url\">title</a> - description<br>", $selectie);


Tis erg rustig, maar dat zal het weekend zijn. Wat zou hier nog aan verbeterd kunnen worden? Ik heb aan een array zitten denken om de positie door te geven waar verschillende categorieren zijn gebleven met het teruggeven van linkjes, tot heden nog geen succes ermee gehad, ik blijf maar tegen foutmeldingen oplopen, of ik krijg helemaal niets terug uit het script. Weet iemand overigens een makkelijkere manier die code aan te roepen, of is dit echt het optimale haalbare?

Station van Gerwin Prins op Apple Music


Acties:
  • 0 Henk 'm!

  • pjotrk
  • Registratie: Mei 2004
  • Laatst online: 15-07 18:43
Gerwin schreef op maandag 22 november 2004 @ 06:53:
Tis erg rustig, maar dat zal het weekend zijn. Wat zou hier nog aan verbeterd kunnen worden? Ik heb aan een array zitten denken om de positie door te geven waar verschillende categorieren zijn gebleven met het teruggeven van linkjes, tot heden nog geen succes ermee gehad, ik blijf maar tegen foutmeldingen oplopen, of ik krijg helemaal niets terug uit het script. Weet iemand overigens een makkelijkere manier die code aan te roepen, of is dit echt het optimale haalbare?
Het zou nog wel wat efficienter kunnen. Een array heeft namelijk een eigen interne positie pointer, welke je kan gebruiker om door de array te itereren. Samen met nog wat kleiner wijzigingen kom het er dan zoiets uit te zien:

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
<?
$sql = "
    SELECT
        id,
        title_25,
        text_25,
        text_45,
        url_left,
        url_right
    FROM
        websites
    WHERE
        text_25 != ''
    ORDER BY
        RAND()
    LIMIT
        0, 100
";

// haal resultaten op
$result = mysql_unbuffered_query($sql);

// stop resultaten in een array
$selectie = array();
while ($row = mysql_fetch_array($result)) {
    $selectie[] = array(
        "id"        => $row["id"],
        "title_25"  => ucfirst($row["title_25"]),
        "text_25"   => ucfirst($row["text_25"]),
        "text_45"   => ucfirst($row["text_45"]),
        "url_left"  => $row["url_left"],
        "url_right" => $row["url_right"],
    );
}

function linkje ($hits, $link, $selectie) {

    // contoleer of er nog nieuwe rijen zijn
    if (current($selectie) !== false) {
    
        // geeft aangeven aantal weer
        for ($tel = 0; $tel < $hits; $tel++) {

            $curLink = current($selectie);

            // samenstellen
            $url = $curLink['url_left'] . $curLink['url_right'];
            $title = $curLink['title_25'];
            $description = $curLink['text_25'];

            // regel omzetten
            $patterns = array ("tellertje", "url", "title", "description");
            $replace = array (key($selectie)+1, $url, $title, $description);
            $linko = str_replace($patterns, $replace, $link);

            // geef link weer
            echo $linko;

            // verhoog interne teller en stop wanneer einde bereikt is
            if (next($selectie) === false) {
                break;
            }
        }
    }
}

$linkFormat = "tellertje. <a href=\"url\">title</a> - description<br>";

// geef linkjes weer (let op: selectie array doorgeven byReference => & )
echo "deel1<br>";
linkje(3, $linkFormat, &$selectie);
echo "deel2<br>";
linkje(10, $linkFormat, &$selectie);
echo "deel3<br>";
linkje(10, $linkFormat, &$selectie);
?>


overigens hoeft je niet eerst alle items in een array te stoppen, maar zou je ook in je linkje functie X aantal items uit je resultset kunnen halen. ipv een array geef je dan dus de resultset identifier ($result) mee met je linkje functie. en hetgeen dat in:
PHP:
1
2
3
while ($row = mysql_fetch_array($result)) {
    ....
}
gebeurd komt dan in je linkje functie. Dat zou nog iets efficienter moeten zijn.

  • Gerwin
  • Registratie: Juli 2001
  • Laatst online: 08-06 20:10

Gerwin

Ik ben er klaar voor!

Topicstarter
Daar heb ik zeker iets aan, en het ziet en daarnaast ook nog eens een stuk netter uit, ik had al het gevoel dat het veel beter kon dan dat ik het tot nu toe geprogrammeerd had. Met het scriptje dat je hier gezet hebt moet het dus ook heel makkelijk zijn om gewoon een $selectieAuto of $selectieBloemen mee te geven aan de functie zodat hij bij een andere lijst verder gaat met het weergeven van linkjes, correct?

Station van Gerwin Prins op Apple Music


Verwijderd

FF een heel stom idee.... kun je niet gewoon met twee resultsets werken?

Verwijderd

een tip: gebruik ADODB

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 14:28
Heerlijk beargumenteerd _/-\o_

ontopic: Je moet er voor zorgen dat je alle variablen die je gebruikt maar eenmalig gebruikt. Dus niet $row maar $group1row o.i.d.

Acties:
  • 0 Henk 'm!

  • Gerwin
  • Registratie: Juli 2001
  • Laatst online: 08-06 20:10

Gerwin

Ik ben er klaar voor!

Topicstarter
ADODB ziet er erg leuk uit maar dan moet ik alsnog een systeem schrijven voor dergelijke rijtjes met linkjes :) Ik heb nu bovenaan de pagina een aantal selects staan met een verschillende row en $selectie. Die geef ik dan mee in de verschillende aanroepingen van de functie. Zo zou hij dan toch moeten werken?

Station van Gerwin Prins op Apple Music

Pagina: 1