[php/mysql] van select naar fwrite()?

Pagina: 1
Acties:
  • 136 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • kramer65
  • Registratie: Oktober 2003
  • Laatst online: 26-06 12:24
Ik lees iets uit mijn databse en wil de resulterende html code vervolgens schrijven in een ander html bestand. Ik ben nu zover dat ik dit heb:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?
SELECT *
FROM lyriczz 
WHERE date > DATE_SUB(NOW(), INTERVAL 7 DAY) 
ORDER BY artist DESC LIMIT 0,10"; 
$x = mysql_query($query) or die("Selection Failed!");
while ($y = mysql_fetch_array($x)) { 

    ?>
    <A href="lyriczz.php?songid=<? echo $y['song_id']; ?>">
<? echo $y['artist'];
echo "</A>";
}

$fileopen = fopen('http://www.lyriczz.com/include/top10.html', 'w');
fwrite($fileopen, ??????);
fclose($fileopen);
?>


Maar wat moet er nou komen op de plaats van de vraagtekens om de resulterende html te schrijven in het bestand top10.html ??

[ Voor 20% gewijzigd door kramer65 op 21-11-2005 14:11 ]


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Wat heb je al uitgezocht?

http://nl3.php.net/manual/en/function.fwrite.php

Daar al naar gekeken?

Acties:
  • 0 Henk 'm!

  • kramer65
  • Registratie: Oktober 2003
  • Laatst online: 26-06 12:24
Ja daar had ik al naar gekeken. Ik begrijp ook dat op de plaats van de vraagtekens nu de variabele moet komen te staan wat geschreven moe worden. Echter, het is niet 1 variabele, maar wat code dat in een while() staat. Ik weet simpelweg niet hoe je dat dan tot 1 variabele zou kunnen reduceren omdat het 10 files zijn die uit de database gehaald worden...

Acties:
  • 0 Henk 'm!

  • sariel
  • Registratie: Mei 2004
  • Laatst online: 22-05-2024
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?
$query = "SELECT *
FROM lyriczz 
WHERE date > DATE_SUB(NOW(), INTERVAL 7 DAY) 
ORDER BY artist DESC LIMIT 0,10"; 
$x = mysql_query($query) or die("Selection Failed!");
while ($y = mysql_fetch_array($x)) { 
    $out .= "<A href=\"lyriczz.php?songid=".$y['song_id']."\">".$y['artist']."</A><br>";
}

$fileopen = fopen('http://www.lyriczz.com/include/top10.html', 'w');
fwrite($fileopen, $out);
fclose($fileopen);
?>

Copy.com


Acties:
  • 0 Henk 'm!

  • kramer65
  • Registratie: Oktober 2003
  • Laatst online: 26-06 12:24
ok ik ga t daar eens mee proberen. Nog 1 vraagje, waarom staat er een punt voor die = van $out? Ik dacht dat dat alleen is als je nog wat wil toevoegen aan een eerder gemaakte variabele?

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Omdat je dan dus die 10 links achter elkaar in 1 variabele krijgt. Wat jij wilt dus, want die voeg je toe aan je html file.

je zou ook die punt kunnen weghalen en die fwrite() in je while loop hangen. Tis maar net wat jij prettiger vind. Weet overigens niet hoe het zit met load om het op die manier aan te pakken.

(wel die fopen dan voor je while loop doen natuurlijk)

[ Voor 54% gewijzigd door Cartman! op 21-11-2005 14:19 ]


Acties:
  • 0 Henk 'm!

  • Obliterator
  • Registratie: November 2000
  • Laatst online: 19-09 14:48
Heb je uberhaupt wel schrijfrechten op die HTML file als je die via het HTTP protocol benaderd?

Acties:
  • 0 Henk 'm!

  • kramer65
  • Registratie: Oktober 2003
  • Laatst online: 26-06 12:24
maar gebruik ik het http protocol dan? Want ik gebruik gewoon een cronjob om deze file aan te roepen...
Anders kan ik de rechten van die html file natuurlijk gewoon op 777 zetten toch?

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Je opent de file via http://www.lyriczz.com/include/top10.html ipv /include/top10.html
Daar gebruik je dus het http protocol.

Acties:
  • 0 Henk 'm!

  • Mysteryman
  • Registratie: Februari 2001
  • Laatst online: 11:44

Mysteryman

kan jij wat ik kan...

je hebt in dit geval 2 opties namelijk:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<? 
SELECT * 
FROM lyriczz  
WHERE date > DATE_SUB(NOW(), INTERVAL 7 DAY)  
ORDER BY artist DESC LIMIT 0,10";  
$x = mysql_query($query) or die("Selection Failed!"); 
while ($y = mysql_fetch_array($x)) {  

    echo $blaat= "<A href='lyriczz.php?songid=$y['song_id']'>".$y['artist']."</A>"; 

$fileopen = fopen('http://www.lyriczz.com/include/top10.html', 'a'); 
fwrite($fileopen, $blaat); 
fclose($fileopen); 
} 
?>


MAAR persoonlijk vind ik dit vrij slordig (dit omdat je 10x het bestand opend en sluit :) )

het is netter om alles in een array te pushen en dan aan het einde alles van de array in de file te schrijven :)

(of net zoals sariel .= te gebruiken)

[ Voor 13% gewijzigd door Mysteryman op 21-11-2005 14:26 ]

Everybody happy??? I soon change that here we go...


Acties:
  • 0 Henk 'm!

  • kramer65
  • Registratie: Oktober 2003
  • Laatst online: 26-06 12:24
Ik moest er ook nog wat andere dingen aan toe voegen. En de query had ik even versimpeld. De gehele query en schrijfgerei zoals ik het nu heb is als volgt:
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
<?
$query = "
SELECT COUNT(song_idlog) AS song_idlog, song_id, feat, title, artist 
FROM log_table, lyriczz 
WHERE date > DATE_SUB(NOW(), INTERVAL 7 DAY) AND lyriczz.song_id = log_table.song_idlog 
GROUP BY song_id
ORDER BY 1 DESC LIMIT 0,10"; 
$x = mysql_query($query) or die("Selection Failed!");
while ($y = mysql_fetch_array($x)) { 

    $artist = $y['artist'];
    $title = $y['title'];

    if ($y['feat'] == NULL) {               
        $all = "$artist - $title";
    } else {
        $feat = $y['feat'];
        $all = "$artist - $title ft. $feat";
    }

    $part = substr($all, 0, 40);
    if ( strlen ( $all ) >= 40) {
        $dots = '...';
    }

    $out .= "<A href=\"lyriczz.php?songid=" .$y['song_id']."\">".$part $dots."</A><BR>";

 } 

$fileopen = fopen('http://www.lyriczz.com/include/top10.html', 'w');
fwrite($fileopen, $out);
fclose($fileopen);
?>

Maar als ik nu naar de link ga via mn browser krijg ik een parse error in de regel waar ik de $out variabele opbouw. Wat is daar nu mis mee?

En het moet overigens wel zo zijn dat elke keer als ik die top10 ernaartoe schrijf het html file eerst leeggehaald moet worden, omdat je anders natuurlijk 2 top10's onder elkaar krijgt.. Zou die dat nu ook doen?

[ Voor 22% gewijzigd door kramer65 op 21-11-2005 14:40 ]


Acties:
  • 0 Henk 'm!

  • Obliterator
  • Registratie: November 2000
  • Laatst online: 19-09 14:48
Er staat $part $dots, op regel 26 dat is niets. Het staat buiten de string. Lees de documentatie van fopen ook even, dan zul je zien wat er gebeurd met de file als je het met "w" opent.

[ Voor 55% gewijzigd door Obliterator op 21-11-2005 14:43 ]


Acties:
  • 0 Henk 'm!

  • kramer65
  • Registratie: Oktober 2003
  • Laatst online: 26-06 12:24
Dus... Ik begrijp eigenlijk niet zo goed hoe die variabele word opgebouwd. Ik heb geprobeerd logica te zien in dat voorbeeldje van sariel en mysteryman. Ik dacht dat dit wel logisch was.. Hoe zou het het dan moeten zijn en waarom?

Acties:
  • 0 Henk 'm!

  • disjfa
  • Registratie: April 2001
  • Laatst online: 03-07 14:47

disjfa

be

Je zou bijvoorbeeld een goed boek over php kunnen pakken en php leren. Of gewoon even in de documentation een kijkje nemen.

Dat helpt meer dan dat wij je heel php moeten gaan uitleggen over hoe wat werkt.

disjfa - disj·fa (meneer)
disjfa.nl


Acties:
  • 0 Henk 'm!

Verwijderd

Beetje appart dat je vorig jaar dit roept: 'Ik heb inmiddels wel redelijke ervaring in php' en nu met basic string-opbouw de boel niet meer goed begrijpt en volledig aan het handje genomen moet worden.
Een . (punt) koppelt strings. Een variabele telt (in php) ook gewoon als string, net als iets tussen enkele of dubbele quotjes. Dus tussen $part en $dots zal een puntje ook wonderen doen.
Split de boel zelf eerst eens op in meerdere regels of vereenvoudig je programmeerwerk eens op andere manieren als het niet werkt. Dat is wel normaal in het debuggen, voordat je bij elke foutmelding dat hier moet vragen...

Edit: Ik zou $out ook voor de loop nog even initialiseren: $out = ""; Daarmee voorkom je problemen als dit onderdeel van een groter geheel zou zijn. (zou worden)

[ Voor 15% gewijzigd door Verwijderd op 21-11-2005 14:58 ]


Acties:
  • 0 Henk 'm!

  • Obliterator
  • Registratie: November 2000
  • Laatst online: 19-09 14:48
Als je op regel 26 eens een punt tussen die twee variabelen zet, hierdoor wordt de inhoud van die twee variabelen achter elkaar in een string gezet.

Ik ben het overigens helemaal met disjfa eens. Een programmeertaal (voor zover je PHP daar onder kunt vatten) kun je niet zomaar gaan proberen. Je zult toch eerst de basis moeten snappen.

Heb je overigens door dat je php script ook gewoon dynamisch de top10 zou kunnen laten zien, dus op het moment dat een gebruiker erom vraagt? Of ben je bang dat de site zovaak wordt bekeken dat je database het niet trekt om die query zo vaak uit te voeren?

Acties:
  • 0 Henk 'm!

Verwijderd

En nog iets: Die $dots gaat zo nooit meer leeg en dus éénmaal een te lange regel en daarna hebben alle volgenden extra puntjes.

Weer een edit: Die query ziet er nu ook wel raar uit. Of heeft dat nog een hoger doel?

[ Voor 27% gewijzigd door Verwijderd op 21-11-2005 15:06 ]


Acties:
  • 0 Henk 'm!

  • kramer65
  • Registratie: Oktober 2003
  • Laatst online: 26-06 12:24
Mijn excuses voor het domme vraagje. Jullie hebben helemaal gelijk. Maar ik leer dingen altijd meer door het inderdaad gewoon te proberen. Ik zal de regel van het puntje in ieder geval onthouden :)

De reden dat ik dit doe is dat het inderdaad te vaak word aangevraagd. Het lijstje staat namelijk op mijn hoofdpagina en die word wel een paar duizend keer per dag geopend. Bovendien is die table waarin die logs staan inmiddels groter dan 2 miljoen. Ik kan ze natuurlijk gaan deleten maar ik wil ze liever bewaren omdat het natuurlijk ook gewoon informatie blijft die je op een gegeven moment misschien kan gebruiken voor bijvoobeeld een top 10 allertijden ofzo.

Hij werkt nu in ieder geval! Super bedankt echt!

edit: wat is er mis met die query?
Wat ik doe is het volgende. Ik haal uit 1 table alle nummers van de afgelopen week, groepeer ze in dezelfden, zet ze op een top 10 en haal dan de titels uit de lyriczz table waar alle teksten in staan..
Zou dat sneller kunnen dan?

en over die dots. Ik heb er nu een elseif bij gezet zodat ie ook weer op niets word gezet als ie niet zo lang is. Bedankt voor de opmerking.

[ Voor 23% gewijzigd door kramer65 op 21-11-2005 15:13 ]


Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 18-09 16:28

Bosmonster

*zucht*

Mysteryman schreef op maandag 21 november 2005 @ 14:23:
je hebt in dit geval 2 opties namelijk:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<? 
SELECT * 
FROM lyriczz  
WHERE date > DATE_SUB(NOW(), INTERVAL 7 DAY)  
ORDER BY artist DESC LIMIT 0,10";  
$x = mysql_query($query) or die("Selection Failed!"); 
while ($y = mysql_fetch_array($x)) {  

    echo $blaat= "<A href='lyriczz.php?songid=$y['song_id']'>".$y['artist']."</A>"; 

$fileopen = fopen('http://www.lyriczz.com/include/top10.html', 'a'); 
fwrite($fileopen, $blaat); 
fclose($fileopen); 
} 
?>


MAAR persoonlijk vind ik dit vrij slordig (dit omdat je 10x het bestand opend en sluit :) )

het is netter om alles in een array te pushen en dan aan het einde alles van de array in de file te schrijven :)

(of net zoals sariel .= te gebruiken)
Als je dan al zoiets doet, waarom dat continue je file openen en sluiten? Zet die fopen en fclose lekker buiten de while, dan maakt het qua performance allemaal niets uit.
Pagina: 1