[PHP]brakke functie verbeteren

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Gods Lonely Man
  • Registratie: April 2002
  • Laatst online: 19-02-2024

Gods Lonely Man

A sidekick's sidekick

Topicstarter
Ik ben aan het proberen een functie te maken waar mee ik snel met 1 query en een regeltje een lijstje kan maken.

Dus dat ik krijg bijvoorbeeld:
<li><a href="?id=1">piet</a></li>
<li><a href="?id=2">jan</a></li>
<li><a href="?id=3">willem</a></li>

Op zich lukt het wel, maar sommige lijsten bestaan uit meerdere databasevelden, bijv achternaam en voornaam, een variable aantal dus. Ik heb het volgende verzonnen:
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
function make_list($query,$line){
        global $db;
        if($rows = $db->fetch_rows($query)){
            $list ='';
            foreach($rows as $row){
                //lets do something stupid \o/
                switch (count($row) / 2){
                    case 1:
                        $list .= sprintf($line, $row[0]);
                        break;
                    case 2:
                        $list .= sprintf($line, $row[0],$row[1]);
                        break;
                    case 3:
                        $list .= sprintf($line, $row[0],$row[1],$row[2]);
                        break;
                    case 4:
                        $list .= sprintf($line, $row[0],$row[1],$row[2],$row[3]);
                        break;
                }
                //$list .= '<li><a href="'.$link.$row[$link_id].'">'.$row[$link_content].'</a></li>';
            }
        }
        return $list;
    }
//en dan aanroepen met bijvoorbeeld
make_list('SELECT id, naam FROM namen','<li><a href="?id=%1$d">%2$s</a></li>');


Dit is natuurlijk nog al stom, zoiezo die switch al, want als er 5 velden zouden zijn dan werkt het niet. Ik weet dat de met SQL ook gewoon meerdere velden kan samentrekken zodat het er altijd twee blijven, maar ik zou het liever via PHP oplossen.
Maar hoe doe ik dat? :?

[ Voor 51% gewijzigd door Gods Lonely Man op 02-03-2005 14:44 ]

It was that kind of a crazy afternoon, terrifically cold, and no sun out or anything, and you felt like you were disappearing every time you crossed a road.

If it weren't for Carbon-14, I wouldn't date at all.


Acties:
  • 0 Henk 'm!

  • beetle71
  • Registratie: Februari 2003
  • Laatst online: 09-09 15:24
Heb je uberhaupt enig idee wat je aan het maken bent :?

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
function make_list($query,$line){
    global $db,$template;
    $result = mysql_query($query);
    while(mysql_fetch_array($result)){
        $list ='';
        foreach($rows as $row){
            //lets do something stupid \o/
            switch (count($row) / 2){
                case 1:
                    $list .= sprintf($line, $row[0]);
                    break;
                case 2:
                    $list .= sprintf($line, $row[0],$row[1]);
                    break;
                case 3:
                    $list .= sprintf($line, $row[0],$row[1],$row[2]);
                    break;
                case 4:
                    $list .= sprintf($line, $row[0],$row[1],$row[2],$row[3]);
                    break;
            }
            //$list .= '<li><a href="'.$link.$row[$link_id].'">'.$row[$link_content].'</a></li>';
        }
    }
    return $list;
}


Wat doet de global $db,$template daar?
Waar komt $row vandaan..
Als je wil testen op even/oneven rijen kun je een tellertje mee laten lopen en met modulo (%)

PHP:
1
2
3
4
5
if($counter%2==1){
   // Dit is een oneven rij
} else {
   // Dit is een even rij..
}


Maar je code is zo vaag dat ik niet helemaal begrijp wat je wilt bereiken...

Leg svp. even duidelijk uit wat je wilt bereiken.

[ Voor 6% gewijzigd door beetle71 op 02-03-2005 14:34 ]


Acties:
  • 0 Henk 'm!

  • Gods Lonely Man
  • Registratie: April 2002
  • Laatst online: 19-02-2024

Gods Lonely Man

A sidekick's sidekick

Topicstarter
Had wat dingen er uit gesloopt voordat ik hem hier neerzetten. klopte idd geen zak meer van....
Nu weer wel. En hij werkt ook gewoon goed btw.

ik wil dit er heen sturen:
PHP:
1
make_list('SELECT id, naam FROM namen','<li><a href="?id=%1$d">%2$s</a></li>');

en dan dit terug krijgen in een string:
code:
1
2
3
<li><a href="?id=1">piet</a></li>
<li><a href="?id=2">jan</a></li>
<li><a href="?id=3">willem</a></li>


Dat doet ie ook, alleen ik zou graag willen dat hij ook doet

PHP:
1
make_list('SELECT id, voornaam, achternaam FROM namen','<li><a href="?id=%1$d">%2$s %3$s</a></li>');

en dan dit terug krijgen in een string:
code:
1
2
3
<li><a href="?id=1">piet bell</a></li>
<li><a href="?id=2">jan lange achternaam</a></li>
<li><a href="?id=3">willem tell</a></li>


Dus met 3 velden (of 1 of 50), in principe doet dat nu ook (tot 4 velden) alleen de manier waarop is natuurlijk ongelovelijk brak. Ik vroeg me af hoe dat beter en makkelijker kan.

[ Voor 23% gewijzigd door Gods Lonely Man op 02-03-2005 14:42 ]

It was that kind of a crazy afternoon, terrifically cold, and no sun out or anything, and you felt like you were disappearing every time you crossed a road.

If it weren't for Carbon-14, I wouldn't date at all.


Acties:
  • 0 Henk 'm!

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
Zoiets?
PHP:
1
2
3
4
5
6
7
8
9
10
function make_list($query,$line){
    global $db,$template;
    $result = mysql_query($query);
    $list = '';
    while($row = mysql_fetch_array($result)){
            array_unshift($row, $line);
            $list .= call_user_func_array('sprintf', $row);
    }
    return $list;
}

[ Voor 26% gewijzigd door PrisonerOfPain op 02-03-2005 15:16 ]


Acties:
  • 0 Henk 'm!

  • beetle71
  • Registratie: Februari 2003
  • Laatst online: 09-09 15:24
Mmmm.. Je bedoelt dus als je een andere query gebruikt met meer velden dat je die dan ook kan gebruiken in je gegeven pattern
Dan kun je beter werken met iets anders dan sprintf.

Bijvoorbeeld zo
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function makelist($query,$line);
    $result=mysql_query($qry) or die(mysql_error());
    if(mysql_num_rows($result))>0){
        $list='';
        while($row=mysql_fetch_assoc($result)){
            $replace=array();
            foreach($row as $value){
                $replace[]="{%".$value."%}";
            }
            $list.=str_replace($replace,$row,$line);
        }
        return($list);
    } else {
        return;
    }
}


en dan je 'call' zo:

PHP:
1
2
echo make_list('SELECT id, voornaam, achternaam FROM namen',
     '<li><a href="?id={%id%}">{%voornaam%} {%achernaam%}</a></li>');


Je hebt dan als voordeel dat je velden niet perse in de volgorde van gebruik hoeven te komen. en er met overbodige velden niks gedaan wordt en je dus evt. ook
SELECT * zou kunnen gebruiken enz.

[ Voor 7% gewijzigd door beetle71 op 02-03-2005 15:18 ]


Acties:
  • 0 Henk 'm!

  • Gods Lonely Man
  • Registratie: April 2002
  • Laatst online: 19-02-2024

Gods Lonely Man

A sidekick's sidekick

Topicstarter
Bedankt beetle71 daar kan ik verder mee _/-\o_
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function makelist($query,$line){
    $result=mysql_query($qry) or die(mysql_error());
    if(mysql_num_rows($result))>0){
        $list='';
        while($row=mysql_fetch_assoc($result)){
            $replace=array();
            foreach($row as $key => $value){
                $replace[]="{%".$key."%}";
            }
            $list.=str_replace($replace,$row,$line);
        }
        return($list);
    } else {
        return;
    }
}
?>


PrisonerOfPain's code snap ik nog niet helemaal, hij werkt met maar 1 waarde. Ga ik ook even wat verder bestuderen. iig ook bedankt.

It was that kind of a crazy afternoon, terrifically cold, and no sun out or anything, and you felt like you were disappearing every time you crossed a road.

If it weren't for Carbon-14, I wouldn't date at all.


Acties:
  • 0 Henk 'm!

Verwijderd

het enige wat je hier eigenlijk nodig hebt is vsprintf.
PHP:
1
2
3
4
5
6
7
8
9
10
<?
function make_list($query,$line){
    $result = mysql_query($query);
    $list = '';
    while($row = mysql_fetch_array($result)){
            $list .= vsprintf($line,$row);
    }
    return $list;
}
?>

Acties:
  • 0 Henk 'm!

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
Mijn fout, ik was de tweede parameter van mysql_fetch_array vergeten. Als je daar MYSQL_NUM opgeeft komt het allemaal goed :)
PHP:
1
2
3
4
5
6
7
8
9
10
function make_list($query,$line){
    global $db,$template;
    $result = mysql_query($query);
    $list = '';
    while($row = mysql_fetch_array($result, MYSQL_NUM)){
            array_unshift($row, $line);
            $list .= call_user_func_array('sprintf', $row);
    }
    return $list;
}


Mmm, vsprintf klinkt inderdaad beter :)

[ Voor 8% gewijzigd door PrisonerOfPain op 02-03-2005 16:14 ]

Pagina: 1