abonnement Unibet Coolblue Bitvavo
pi_44350438
Ik ben bezig met een bookmark manager, gewoon om PHP en mySQL te leren verder. Maar nu heb ik iets waar ik niet uit kom. Ik heb deze query:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
$query
= "
SELECT *
FROM bookmark_cat, bookmark_links
WHERE bookmark_cat.id = bookmark_links.cat_id
GROUP BY cat_id"
;

$result = mysql_query($query) or die (mysql_error());
while(
$row = mysql_fetch_array($result)) {
    echo
'<h2>'. $row['cat_naam'] . '</h2>';    
    echo
'<p>' . $row['naam'] . '</p>';
    
}
?>


en de (logische) output is dit:

1
2
3
4
5
6
7
8
CAT NAAM 1
link 1

CAT NAAM 1
link 2

CAT NAAM 1
link 3


enzo voorts.

maar ik wil het dus zo hebben:

1
2
3
4
5
6
7
8
CAT NAAM 1
link 1
link 2
link 3

CAT NAAM 2
link 4
link 5


Ik heb al vele manier geprobeerd maar ik kom er niet uit
pi_44350868
@super-muffin

Je krijgt bij een JOIN bijna altijd redundante data (zolang het een 1:n- of m:n-JOIN is) dus die moet je eruit filtreren. Je kunt vast wel een manier verzinnen om in dat loopje de header telkens maar één keer weer te geven
pi_44351276
hm ja, ik had eerst een query in een while loop. Maar dat lijkt me te server belastend. Ik dacht dat er wel een andere manier moet zijn.
pi_44352220
quote:
Op dinsdag 12 december 2006 11:25 schreef super-muffin het volgende:
hm ja, ik had eerst een query in een while loop. Maar dat lijkt me te server belastend. Ik dacht dat er wel een andere manier moet zijn.
Je query kun je zo laten. Maar je hele probleem is toch dat je de header maar één keer wilt weergeven? Als je nou eens de header in het loopje telkens opslaat in een variabele en de header alleen weergeeft als ie niet meer overeenkomt met wat er in de variabele staat?
pi_44352725
Zoals dit? :?

Dit staat in de while loop:
1
2
3
4
5
6
7
<?php
$titel
= $row['cat_naam'];
    
if(
$titel != $row['cat_naam']) {
    echo
'<h2>'. $row['cat_naam'] . '</h2>';
}
?>

Dan krijg ik geen headings.
pi_44353110
quote:
Op dinsdag 12 december 2006 12:18 schreef super-muffin het volgende:
Zoals dit? :?

Dit staat in de while loop:
[ code verwijderd ]

Dan krijg ik geen headings.
Dat komt omdat je $titel éérst vult met de header en daarna controleert of het verschilt met de header. (:?)

Dus, vóór de loop:
1$titel = '';


In de loop:
1
2
3
4
5
if ($titel != $row['cat_naam'])
{
    $titel = $row['cat_naam'];
    echo '<h2>etc</h2>';
}


:)
pi_44354213
uh ja dat was niet echt logisch

maar thnx, zo werkt het. Nu ga ik verder stoeien
pi_44358467
Ik draai PHP 5 op Windows Server 2003 R2 met IIS 6.0. Maar ik heb een probleem met het verwijderen van bestanden. De unlink() functie wil niet werken, wegens een "permission denied".

Nu kan ik er maar erg weinig over vinden en al helemaal niets nuttigs. Weet iemand hier toevallig hoe ik dit kan fixen?
Schuimpje... mijn liefste. Verlaat mij nimmer weer...
pi_44358724
quote:
Op dinsdag 12 december 2006 15:23 schreef papernote het volgende:
Ik draai PHP 5 op Windows Server 2003 R2 met IIS 6.0. Maar ik heb een probleem met het verwijderen van bestanden. De unlink() functie wil niet werken, wegens een "permission denied".
Een aanroep naar unlink() is in Windows weinig meer dan een wrapper om de API-call om een bestand te verwijderen. Kennelijk vindt Windows dat de gebruiker waaronder IIS wordt uitgevoerd niet genoeg rechten heeft om het bestand te verwijderen dus hoe zit het met de permissies van gebruikers op het bestand dat je wilt verwijderen?
pi_44359369
quote:
Op dinsdag 12 december 2006 15:31 schreef JeRa het volgende:

[..]

Een aanroep naar unlink() is in Windows weinig meer dan een wrapper om de API-call om een bestand te verwijderen. Kennelijk vindt Windows dat de gebruiker waaronder IIS wordt uitgevoerd niet genoeg rechten heeft om het bestand te verwijderen dus hoe zit het met de permissies van gebruikers op het bestand dat je wilt verwijderen?
Ik heb de IIS user Full Control gegeven over alle bestanden in de wwwroot. Ik heb zelfs Everyone Full Control gegeven over de wwwroot. Beide werkt niet.
Schuimpje... mijn liefste. Verlaat mij nimmer weer...
pi_44359654
Hmm... het verwijderen heb ik opgelost door een fclose() voor de unlink() te zetten. Vergeten .
Schuimpje... mijn liefste. Verlaat mij nimmer weer...
pi_44359742
-edit: al opgelost
pi_44362202
Ben voor mijn school bezig met een filebeheer te maken. Het probleem is echter dat dit via het netwerk gaat.

Het uitlezen van de bestanden gaat perfect "//server/bla/leerlingmap", echter bij het uploaden van files gaat het fout. Dan krijg ik een "permission denied", de server kan wel mappen aanmaken?

De pc waarop de Apache server draait met PHP5 heeft alle rechten op de netwerkmap.

Heeft iemand hier ervaringen/tips/oplossingen met/voor dit probleem?
pi_44402318
quote:
Op dinsdag 12 december 2006 17:06 schreef fokME2 het volgende:
Ben voor mijn school bezig met een filebeheer te maken. Het probleem is echter dat dit via het netwerk gaat.

Het uitlezen van de bestanden gaat perfect "//server/bla/leerlingmap", echter bij het uploaden van files gaat het fout. Dan krijg ik een "permission denied", de server kan wel mappen aanmaken?

De pc waarop de Apache server draait met PHP5 heeft alle rechten op de netwerkmap.

Heeft iemand hier ervaringen/tips/oplossingen met/voor dit probleem?
Ben ik nou topickiller?
pi_44403413
Hoe upload je je bestanden? Welke functies, waar worden de tijdelijke bestanden opgeslagen, etc?
quote:
Op woensdag 13 december 2006 19:44 schreef fokME2 het volgende:

[..]

Ben ik nou topickiller?
Beetje wel
pi_44404998
quote:
Op woensdag 13 december 2006 20:19 schreef JeRa het volgende:
Hoe upload je je bestanden? Welke functies, waar worden de tijdelijke bestanden opgeslagen, etc?
[..]

Beetje wel
Probeer mbv php en move_uploaded_file(), of copy() de file te verplaatsen. Dan krijg ik de error . Uploaden naar het path van het PHP bestand gaat wel.

De tijdelijke bestanden worden lokaal op de webserver opgeslagen (waar precies moet ik even uitzoeken, kan alleen op school zelf bij de bestanden enzo).
Zal morgen proberen wat meer info te plaatsen, in de hoop dat de systeembeheerder er is
quote:
On windows I made the directory writable, by changing the Apache httpd.conf file.

The problem I had, was with the upload directory. The move_uploaded_file produced an error like: failed to open stream: Permission denied.

I changed my php.ini to specify an upload directory:
upload_tmp_dir = "d:/temp/php/uploads/"

and I added the following in the Apache hpptd.conf file:

<Directory "D:/temp/php/uploads">
Options None
AllowOverride None
Order allow,deny
Allow from all
</Directory>

restarted Apache, and the upload succeeded.
Dat lees ik net op php.net. Weet iemand of je bij Apache misschien het netwerkpath zou moeten instellen? En of dat uberhaupt kan?

Sorry voor het killen
  FOK!-Schrikkelbaas woensdag 13 december 2006 @ 23:22:57 #137
1972 Swetsenegger
Egocentrische Narcist
pi_44411294
Ik zit weer eens in de knoop met wat queries.

Ik had een eenvoudig polletje gebouwd. Nu heb ik dat script verbouwd zodat ik meerdere polls kan gaan aanmaken via m'n cmsje. Waarbij het idee is dat je onbeperkt aantal polls en bijbehorende vragen kan aanmaken en uiteraard daarop antwoorden.

database structuur.

Tabel Polls
1
2
3
4
Poll_Id | Poll_Name | Archive
--------+-----------+--------
   1    |   Smaak   |    0
   2    |   Test    |    1


Table Poll_Questions
1
2
3
4
5
6
7
Poll_Question_Id |      Question        | Poll
-----------------+----------------------+-------
   1             |   Smaakt uw vlees    |    1
   2             |   Smaakt uw koffie   |    1
   3             |   Smaakt uw groente  |    1
   4             |   Testvraag 1        |    2
   5             |   Testvraag 2        |    2


Tabel Poll_Answers
1
2
3
4
5
6
7
8
9
10
11
Poll_Answer_Id |  Poll | Question  | IP
---------------+-------+-----------+-------
   1           |   1   |    2      | ip van voter
   2           |   1   |    2      |
   3           |   1   |    1      |
   4           |   1   |    1      |
   5           |   1   |    1      |
   6           |   1   |    2      |
   7           |   2   |    1      |
   1           |   2   |    1      |
   1           |   2   |    2      |


Uiteraard is het de bedoeling dat ik vervolgens per poll het aantal vragen en percentage stemmen daarop laat zien.

Maar dat krijg ik niet voor elkaar. Ik moet met joins aan de slag, want de query van basale vorige scriptje zal in bovenstaand voorbeeld bv nooit vraag 3 van poll 1 tonen met 0 stemmen:
1
2
3
<?php
SELECT Question
, COUNT(Question) as vote FROM Poll_Answers WHERE Poll=".$poll." GROUP BY Question
?>


Deze toont alleen de stemmen waar minimaal 1 keer op gestemt is.

Ik heb het volgende al geprobeerd:
1
2
3
<?php
SELECT q
.Question, COUNT(a.Question) as vote FROM Poll_Questions q JOIN Poll_Answers a ON (q.Poll=a.Poll) WHERE a.Poll=".$poll."  GROUP BY a.Question
?>

Maar die geeft bv 2 maal dezelfde vraag terug met verschillend aantal votes

HELP!
(volgens mij moet ik gaan left of right joinen ofzo, omdat er immers niet altijd een relatie HOEFT te zijn. Innerjoins gaan er toch vanuit dat er altijd een relatie is?)

[ Bericht 3% gewijzigd door Swetsenegger op 13-12-2006 23:31:47 (domme fok ubb parser :() ]
pi_44412198
Volgens mij kan je gewoon een inner join doen als ik dit zo lees: http://www.w3schools.com/sql/sql_join.asp

Echter als ik dit zo lees:
http://en.wikipedia.org/wiki/Join_(SQL)

Lijkt het erop dat je een left outer join moet doen.
pi_44416335
quote:
Op woensdag 13 december 2006 21:01 schreef fokME2 het volgende:

[..]

Dat lees ik net op php.net. Weet iemand of je bij Apache misschien het netwerkpath zou moeten instellen? En of dat uberhaupt kan?
PHP draait als apart proces met de rechten van de gebruiker van de webserver, dus daar hoef je niet voor in httpd.conf te zijn. Lukt het je wel om de bestanden in een lokale map (op de eigen harde schijf) op te slaan?
pi_44416462
@Swetsenegger

Een normale LEFT JOIN (== LEFT OUTER JOIN) zou afdoende moeten zijn. Je hebt gelijk dat er geen relatie hoeft te bestaan, dus pak je de tabel met de rijen die je wilt hebben (de questions) en join je daar hetgene op waar je informatie over wilt hebben (de answers). Let wel op dat je formeel een NULL-waarde krijgt van MySQL in het geval dat er geen rijen gevonden zijn bij een bepaalde question.

Verder een tip voor Poll_Answers; als je Poll_Answer_Id dropt en een PRIMARY KEY op de kolommen (IP, Poll) legt dan zorg je ervoor dat er in MySQL een restrictie komt: elk IP-adres kan maar één keer op één bepaalde poll stemmen.

En over het algemeen zal deze opzet niet de snelste qua performance zijn; MySQL is niet zo geweldig met GROUP BY's (zelfs niet als je de juiste indices aanlegt). Persoonlijk zou ik een aparte tabel hebben gemaakt met de scores per antwoord op een poll zodat je die simpel kunt incrementen bij een stem. Je Poll_Answers-tabel kun je dan zo versimpelen Dat je 'IP' en 'Poll' overhoudt (inclusief de eerder genoemde PRIMARY KEY natuurlijk).
pi_44418784
Kent iemand toevallig een class die tekst kan vertalen naar duits en engels?
..///
  donderdag 14 december 2006 @ 10:48:35 #142
52200 ViPeRII
It's a good day to die
pi_44418865
Lol dat is nooit een class. Dat is een lijst met woorden die vertaalt worden.
-- ViPeRII --
  FOK!-Schrikkelbaas donderdag 14 december 2006 @ 11:05:09 #143
1972 Swetsenegger
Egocentrische Narcist
pi_44419200
quote:
Op donderdag 14 december 2006 08:38 schreef JeRa het volgende:
@Swetsenegger

Een normale LEFT JOIN (== LEFT OUTER JOIN) zou afdoende moeten zijn. Je hebt gelijk dat er geen relatie hoeft te bestaan, dus pak je de tabel met de rijen die je wilt hebben (de questions) en join je daar hetgene op waar je informatie over wilt hebben (de answers). Let wel op dat je formeel een NULL-waarde krijgt van MySQL in het geval dat er geen rijen gevonden zijn bij een bepaalde question.

Verder een tip voor Poll_Answers; als je Poll_Answer_Id dropt en een PRIMARY KEY op de kolommen (IP, Poll) legt dan zorg je ervoor dat er in MySQL een restrictie komt: elk IP-adres kan maar één keer op één bepaalde poll stemmen.

En over het algemeen zal deze opzet niet de snelste qua performance zijn; MySQL is niet zo geweldig met GROUP BY's (zelfs niet als je de juiste indices aanlegt). Persoonlijk zou ik een aparte tabel hebben gemaakt met de scores per antwoord op een poll zodat je die simpel kunt incrementen bij een stem. Je Poll_Answers-tabel kun je dan zo versimpelen Dat je 'IP' en 'Poll' overhoudt (inclusief de eerder genoemde PRIMARY KEY natuurlijk).
Ik kom er vanavond even op terug, ik zit voornamelijk nog met hoe ik een count van rijen kan koppelen aan 1 vraag uit de andere tabel in m'n query. Je performance verhaal lees ik even als ik niet meer op mijn werk zit. Het database model kan nu nog volledig op de schop

-edit- oeh, je primary key tip voor de poll answers tabel is wel een goeie. Ik wist niet eens dat je twee kolommen in 1 tabel primary key kan maken?

-edit2-
Hmz, een aparte score tabel incrementen is ook wel aardig idee
pi_44419659
quote:
Op donderdag 14 december 2006 10:48 schreef ViPeRII het volgende:
Lol dat is nooit een class. Dat is een lijst met woorden die vertaalt worden.
Dan ben je erg beperkt met vertalen een vertaling bestaat uit méér dan alleen str_replace()'s, dus daarvoor zou goed een class gebruikt kunnen worden om instanties van vertalers te maken.
quote:
Op donderdag 14 december 2006 10:45 schreef wipes66 het volgende:
Kent iemand toevallig een class die tekst kan vertalen naar duits en engels?
Nope. Lijkt me ook raar nu de paar beste (en zelfs dan nog matige) oplossingen commerciëel zijn
pi_44419874
quote:
Op donderdag 14 december 2006 11:05 schreef Swetsenegger het volgende:

[..]

Ik kom er vanavond even op terug, ik zit voornamelijk nog met hoe ik een count van rijen kan koppelen aan 1 vraag uit de andere tabel in m'n query.
Dit kan vrij simpel omdat je telkens maar één poll opvraagt. Je koppelt de stemmen aan de vragen:
1SELECT v.vraag, s.id FROM vragen v LEFT JOIN stemmen s 

Door nu te GROUP BY'en op de vragen zorg je ervoor dat je het aantal stemmen per vraag kunt tellen:
1SELECT v.vraag, COUNT(s.id) FROM vragen v LEFT JOIN stemmen s GROUP BY v.id (of v.vraag)

COUNT() is dan dus een aggregate function die werkt op alle rijen in de tabel 'stemmen' die gekoppeld zijn aan een bepaalde vraag. Maar dit is natuurlijk niet meer relevant als je dat idee gebruikt van een aparte tabel met scores.
quote:
-edit- oeh, je primary key tip voor de poll answers tabel is wel een goeie. Ik wist niet eens dat je twee kolommen in 1 tabel primary key kan maken?
Een PRIMARY KEY is niets anders dan een UNIQUE INDEX met een extra tagje zodat je bij natural joins niet hoeft aan te geven hoe je tabellen koppelt. Een INDEX kun je gewoon over meerdere kolommen leggen, dat heb ik een tijd geleden in deze topicreeks redelijk uitgebreid besproken. UNIQUE zorgt ervoor dat je altijd unieke combinaties van die kolommen moet hebben. In het geval van de combinatie IP,PollID is dat dus een unieke combinatie van IP-adres en Poll-ID voor een stem
quote:
-edit2-
Hmz, een aparte score tabel incrementen is ook wel aardig idee
Je hebt in je huidige opzet een hoop redundante informatie, aangezien je geen informatie aan een stem koppelt (het is een primitieve, een integer 1 waarvan je het totaal wilt weten). Dan is zo'n aparte tabel een erg goed idee aangezien je er zo ook voor zorgt dat MySQL na een tijdje zich niet verslikt in de GROUP BY (en je hoeft iets minder rekening te houden met de juiste indices).
pi_44420379
quote:
Op donderdag 14 december 2006 10:45 schreef wipes66 het volgende:
Kent iemand toevallig een class die tekst kan vertalen naar duits en engels?
Ik zou eerder denken aan een soort van webservice die je kunt aanroepen met SOAP of iets dergelijks. Volgens mij bestaan er wel dergelijke vertaalwebservices.
pi_44421530
Vraagje: kun je ook ergens een soort van voorbeeld database downloaden met bv alle landen, of een aantal namen er in?

Die heb ik namelijk nodig voor een testje, maar heb geen zin om zelf al die informatie bij elkaar te zoeken.
pi_44421604
quote:
Op donderdag 14 december 2006 12:31 schreef super-muffin het volgende:
Vraagje: kun je ook ergens een soort van voorbeeld database downloaden met bv alle landen, of een aantal namen er in?

Die heb ik namelijk nodig voor een testje, maar heb geen zin om zelf al die informatie bij elkaar te zoeken.
Google met de magische keywords: "sql countries"
pi_44421812
lol bedankt
(ik zocht op te moeilijke keywords, daarom kon ik het niet vinden)
  FOK!-Schrikkelbaas donderdag 14 december 2006 @ 16:31:06 #150
1972 Swetsenegger
Egocentrische Narcist
pi_44429188
quote:
Op donderdag 14 december 2006 11:31 schreef JeRa het volgende:

[..]

Dit kan vrij simpel omdat je telkens maar één poll opvraagt. Je koppelt de stemmen aan de vragen:
[ code verwijderd ]

Door nu te GROUP BY'en op de vragen zorg je ervoor dat je het aantal stemmen per vraag kunt tellen:
[ code verwijderd ]

COUNT() is dan dus een aggregate function die werkt op alle rijen in de tabel 'stemmen' die gekoppeld zijn aan een bepaalde vraag. Maar dit is natuurlijk niet meer relevant als je dat idee gebruikt van een aparte tabel met scores.
1SELECT q.Question, COUNT(s.Poll_Answers_Id) as aantal FROM Poll_Questions q LEFT JOIN Poll_Answers s GROUP BY q.Question
quote:
You have an error in you SQL syntax ... ~ ... syntax to use near 'GROUP BY q.Question' at line 1
Ik zie geen fout in de syntax?
-edit-
On clausule vergeten, deze werkt
1SELECT q.Question, COUNT(a.Question) as aantal FROM Poll_Questions q LEFT JOIN Poll_Answers a ON(q.Poll_Question_Id=a.Question) GROUP BY q.Question DESC
quote:
Een PRIMARY KEY is niets anders dan een UNIQUE INDEX met een extra tagje zodat je bij natural joins niet hoeft aan te geven hoe je tabellen koppelt. Een INDEX kun je gewoon over meerdere kolommen leggen, dat heb ik een tijd geleden in deze topicreeks redelijk uitgebreid besproken. UNIQUE zorgt ervoor dat je altijd unieke combinaties van die kolommen moet hebben. In het geval van de combinatie IP,PollID is dat dus een unieke combinatie van IP-adres en Poll-ID voor een stem
[..]

Je hebt in je huidige opzet een hoop redundante informatie, aangezien je geen informatie aan een stem koppelt (het is een primitieve, een integer 1 waarvan je het totaal wilt weten). Dan is zo'n aparte tabel een erg goed idee aangezien je er zo ook voor zorgt dat MySQL na een tijdje zich niet verslikt in de GROUP BY (en je hoeft iets minder rekening te houden met de juiste indices).
Hier ga ik ook mee aan de slag Hoewel ik me bedenk dat ik dan nog een tabel met polls en ip's moet gaan bijhouden.

[ Bericht 6% gewijzigd door Swetsenegger op 14-12-2006 16:55:25 ]
abonnement Unibet Coolblue Bitvavo
Forum Opties
Forumhop:
Hop naar:
(afkorting, bv 'KLB')