[PHP/SQL] 2 dezelfde namen binnen tekst gedeelte weghalen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • rubjo99
  • Registratie: Februari 2011
  • Laatst online: 30-07-2020
Goeiemiddag allen,

Ik heb een vraag:

In mijn database staan verschillende records:
code:
1
2
3
4
5
INSERT INTO `timeline` (`UID`, `id`, `jaar`, `maand`, `dag`, `jaar_info`, `maand_info`, `dag_info`) VALUES
(4, 9, 1957, 'August', 12, '<h1>\r\n    HURDURDUR&nbsp;<img alt="" src="http://25.media.tumblr.com/avatar_6feb8634e3d0_128.png" style="float: left; width: 128px; height: 128px; " /></h1>\r\n', '', ''),
(4, 10, 1994, 'Augustus', 9, '<h1>\r\n  Hier mag alleen het jaar staan</h1>\r\n', '', ''),
(4, 15, 1999, 'September', 12, '', '', '<h1>\r\n    dag 12 september 1999</h1>\r\n'),
(4, 17, 1999, 'September', 0, '', '<p>\r\n  &nbsp;</p>\r\n<h1>\r\n  september 1999</h1>\r\n', '');


Die komen allemaal netjes op datum gesorteerd op mijn pagina te staan, nu komen er wel als er 2x dezelfde maand in 1 jaar zit, worden die alle 2 getoond terwijl ik er maar 1 wil hebben staan en ook maar maximaal 1. Als jullie begrijpen wat ik bedoel.

Hoe kan ik dit voor elkaar krijgen, want ik zelf kon na wat googlen niet echt iets er over vinden behalve dan natuurlijk 'str_replace'.

Ik zal hier ook even de PHP neergooien:
code:
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
<?PHP
$vorigejaar = 0;
                            $vorigemaand = 0;
                            $vorigedag = 0;
                        
                            while($row = mysql_fetch_array($result)){
                                if($row['jaar'] == $vorigejaar){
                                    if($row['maand'] == $vorigemaand){
                                        echo "<a id='activator' class='event' href='".$_SERVER['PHP_SELF']."?id=".$row['id']."'><div class='day'><h4>".$row['dag']."</h4></div></a>";
                                        $vorigedag = $row['dag'];
                                    }
                                    else {
                                    echo "";
                                    echo "<a id='activator' class='event' href='".$_SERVER['PHP_SELF']."?id=".$row['id']."'><div class='month'>".$row['maand']."</div></a>";
                                    echo "<a id='activator' class='event' href='".$_SERVER['PHP_SELF']."?id=".$row['id']."'><div class='day'><h4>".$row['dag']."</h4></div></a>";
                                    echo "";
                                    $vorigemaand = $row['maand'];
                                    }
                                    }
                                else{
                                    echo "<a id='activator' class='event' href='".$_SERVER['PHP_SELF']."?id=".$row['id']."'><div class='year'>".$row['jaar']."</div></a>";
                                    echo "<a id='activator' class='event' href='".$_SERVER['PHP_SELF']."?id=".$row['id']."'><div class='month'>".$row['maand']."</div></a>";
                                    echo "<a id='activator' class='event' href='".$_SERVER['PHP_SELF']."?id=".$row['id']."'><div class='day'><h4>".$row['dag']."</h4></div></a>";
                                    $vorigejaar = $row['jaar'];
                                }
                                
                            }
?>

Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Als je er maar één van de meerdere wilt hebben, dan moet je wel specificeren welke. Kijk verder eens naar GROUP BY.

Acties:
  • 0 Henk 'm!

  • rubjo99
  • Registratie: Februari 2011
  • Laatst online: 30-07-2020
HuHu schreef op maandag 04 juni 2012 @ 13:50:
Als je er maar één van de meerdere wilt hebben, dan moet je wel specificeren welke. Kijk verder eens naar GROUP BY.
Als ik GROUP BY maand, gebruik blijven alle dubbele maanden nog gewoon staan.
Hij moet als het ware alle records maar daarin dezelfde maand moet worden weggefiltert uit de tekst.

Of is het handiger om een andere tabel structuur te gebruiken?

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
rubjo99 schreef op maandag 04 juni 2012 @ 13:54:
[...]


Als ik GROUP BY maand, gebruik blijven alle dubbele maanden nog gewoon staan.
Hoe werkt dat GROUP BY nu eigenlijk?

Je zou een query kunnen knutselen die enkel een bepaald ID teruggeeft (criteria: nieuwste, oudste, meeste content, ... verzin iets) met daarnaast de maand/jaar. Daar kun je prima een GROUP BY op los laten. En dat geheel verander je in een subquery waarna je alsnog de overige velden erbij selecteert met een join oid.

code:
1
2
3
4
5
6
7
8
select m.id, m.maand, m.jaar, bar, baz, info, data, blah
from mytable as m
inner join (
  select maand, jaar, max(id)
  from foo
  group by maand, jaar
) as x on m.id = x.id
where...

[ Voor 48% gewijzigd door RobIII op 04-06-2012 14:13 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • rubjo99
  • Registratie: Februari 2011
  • Laatst online: 30-07-2020
RobIII schreef op maandag 04 juni 2012 @ 13:59:
[...]

Hoe werkt dat GROUP BY nu eigenlijk?

Je zou een query kunnen knutselen die enkel een bepaald ID teruggeeft (criteria: nieuwste, oudste, meeste content, ... verzin iets) met daarnaast de maand/jaar. Daar kun je prima een GROUP BY op los laten. En dat geheel verander je in een subquery waarna je alsnog de overige velden erbij selecteert met een join oid.
Hey, dankjewel :)

Ik zie nu je code, ik ga het even proberen! bedankt alvast.

Alleen sorteer ik in geen enkele manier met een id, aangezien die niet van toepassing is op sorteren :S

[ Voor 69% gewijzigd door rubjo99 op 04-06-2012 14:57 ]


Acties:
  • 0 Henk 'm!

  • rubjo99
  • Registratie: Februari 2011
  • Laatst online: 30-07-2020
Ik krijg helaas zelf niet de query werken :(

code:
1
2
3
4
5
6
7
8
9
10
SELECT t.UID, t.id, t.jaar, t.maand, t.dag, t.jaar_info, t.maand_info, t.dag_info, 
                            FROM timeline AS t
                            INNER JOIN (
                              SELECT jaar, maand, dag
                              FROM timeline
                              GROUP by maand
                            ) 
                            AS x on t.id = x.id
                            WHERE UID = '.$_SESSION['id'].'
                            ORDER BY jaar, maand, dag


Dit is mijn eerste keer subqueries en om eerlijk te zijn ben ik mij benieuwd hoe snel me dit gaat lukken

Acties:
  • 0 Henk 'm!

  • Bee.nl
  • Registratie: November 2002
  • Niet online

Bee.nl

zoemt

rubjo99 schreef op maandag 04 juni 2012 @ 15:31:
Ik krijg helaas zelf niet de query werken :(

code:
1
2
3
4
5
6
7
8
9
10
SELECT t.UID, t.id, t.jaar, t.maand, t.dag, t.jaar_info, t.maand_info, t.dag_info, 
                            FROM timeline AS t
                            INNER JOIN (
                              SELECT jaar, maand, dag
                              FROM timeline
                              GROUP by maand
                            ) 
                            AS x on t.id = x.id
                            WHERE UID = '.$_SESSION['id'].'
                            ORDER BY jaar, maand, dag


Dit is mijn eerste keer subqueries en om eerlijk te zijn ben ik mij benieuwd hoe snel me dit gaat lukken
Welke foutmelding krijg je dan terug? Met 'het werkt niet' kunnen we vrij weinig. Overigens zie ik een komma te veel in de eerste regel. Subqueries zijn niet zo heel moeilijk; daar valt wel het één en ander over te vinden.

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 10:54

Janoz

Moderator Devschuur®

!litemod

Ik heb geen idee wat je nu werkelijk wilt. Eerder in deze thread gingen mensen er van uit dat je per maand maar 1 item wilt hebben, maar nu ik wat langer naar je startpost kijk lijkt het er op dat je eigenlijk bedoeldt dat je maar 1 keer de maandnaam wilt hebben en daaronder de items in die maand. Toch?

Je code doet namelijk vermoeden dat dat gewoon juist zou moeten werken, en volgens mij doet dat het ook. De stringvergelijking van php is echter geen magische vergelijking die zelf wel uit kan maken dat August en Augustus vast wel hetzelfde zal zijn.

---edit---
Oh wacht, die code werkt helemaal niet. Als je er doorheen loopt dan zie je dat de verschillende 'vorige'-waarden veel te weinig aangepast worden.

Let maar op. Het toevoegen van een maand voor september in 1999 zal je probleem verstoppen...

[ Voor 20% gewijzigd door Janoz op 04-06-2012 15:50 ]

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • rubjo99
  • Registratie: Februari 2011
  • Laatst online: 30-07-2020
Bee.nl schreef op maandag 04 juni 2012 @ 15:40:
[...]

Welke foutmelding krijg je dan terug? Met 'het werkt niet' kunnen we vrij weinig. Overigens zie ik een komma te veel in de eerste regel. Subqueries zijn niet zo heel moeilijk; daar valt wel het één en ander over te vinden.
Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in

krijg ik dan te zien, dat betekent dat er iets in de SQL query niet klopt.
Janoz schreef op maandag 04 juni 2012 @ 15:42:
Ik heb geen idee wat je nu werkelijk wilt. Eerder in deze thread gingen mensen er van uit dat je per maand maar 1 item wilt hebben, maar nu ik wat langer naar je startpost kijk lijkt het er op dat je eigenlijk bedoeldt dat je maar 1 keer de maandnaam wilt hebben en daaronder de items in die maand. Toch?

Je code doet namelijk vermoeden dat dat gewoon juist zou moeten werken, en volgens mij doet dat het ook. De stringvergelijking van php is echter geen magische vergelijking die zelf wel uit kan maken dat August en Augustus vast wel hetzelfde zal zijn.

---edit---
Oh wacht, die code werkt helemaal niet. Als je er doorheen loopt dan zie je dat de verschillende 'vorige'-waarden veel te weinig aangepast worden.

Let maar op. Het toevoegen van een maand voor september in 1999 zal je probleem verstoppen...
Wat jij zegt bedoel ik inderdaad! En het werkt inderdaad :D

Maar dat betekent dat als nu iemand bijvoorbeeld zou inloggen en niet de maand augustus in 1999 heeft maar wel 2 dag in september heeft staan dat ie het nog wel laat zien toch?

Acties:
  • 0 Henk 'm!

  • Bee.nl
  • Registratie: November 2002
  • Niet online

Bee.nl

zoemt

Janoz schreef op maandag 04 juni 2012 @ 15:42:
Ik heb geen idee wat je nu werkelijk wilt. Eerder in deze thread gingen mensen er van uit dat je per maand maar 1 item wilt hebben, maar nu ik wat langer naar je startpost kijk lijkt het er op dat je eigenlijk bedoeldt dat je maar 1 keer de maandnaam wilt hebben en daaronder de items in die maand. Toch?

Je code doet namelijk vermoeden dat dat gewoon juist zou moeten werken, en volgens mij doet dat het ook. De stringvergelijking van php is echter geen magische vergelijking die zelf wel uit kan maken dat August en Augustus vast wel hetzelfde zal zijn.
Inderdaad, volgens mij is de vraagstelling van de TS niet helemaal helder. Ik denk ook dat hetgene wat jij zegt wordt bedoeld. In dat geval zou TS naar de manier waarop hij zijn data opslaat moeten kijken. Er worden nu twee verschillende talen gebruikt voor de maand, daarmee kun je natuurlijk niet vergelijken. Dan zou ik nog eerder kiezen voor de maandnummers. In de presentatie zorg je voor de juiste weergave (met de juiste locale-instelling). Wellicht is een date/datetime type handiger?
rubjo99 schreef op maandag 04 juni 2012 @ 15:53:
[...]


Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in

krijg ik dan te zien, dat betekent dat er iets in de SQL query niet klopt.
Dat betekent dus dat je query een error gaf en retourneerde de php-functie bool(false). Heb je de beschikking over iets als PhpMyAdmin? Dat is meestal handiger om je query uit te proberen en te debuggen.

[ Voor 16% gewijzigd door Bee.nl op 04-06-2012 16:00 ]


Acties:
  • 0 Henk 'm!

  • rubjo99
  • Registratie: Februari 2011
  • Laatst online: 30-07-2020
Bee.nl schreef op maandag 04 juni 2012 @ 15:54:
[...]

Inderdaad, volgens mij is de vraagstelling van de TS niet helemaal helder. Ik denk ook dat hetgene wat jij zegt wordt bedoeld. In dat geval zou TS naar de manier waarop hij zijn data opslaat moeten kijken. Er worden nu twee verschillende talen gebruikt voor de maand, daarmee kun je natuurlijk niet vergelijken. Dan zou ik nog eerder kiezen voor de maandnummers. In de presentatie zorg je voor de juiste weergave (met de juiste locale-instelling). Wellicht is een date/datetime type handiger?
Sorry voor de onduidelijkheid jongens, ik zal het nog een keer proberen uit te leggen.

Ik ben nu bezig met een tijdlijn maken voor een school opdracht, nu kan een gebruiker(UID) allemaal gebeurtenissen toevoegen aan die tijdlijn. Deze zijn verdeeld in jaar, maand en dag. Op elke van deze 3 kan een gebruiker een gebeurtenis toevoegen. Nu heeft elk jaar, maand, dag ook een info kolom, jaar_info, maand_info, dag_info.
Als een gebruiker een gebeurtenis toevoegd op bijv: 10 september 1999 en eentje op 13 september 1999 komt in de database 2 records te staan, nu was het zo dat als ik met mijn script dit liet zien kwam er 2x september te staan. Nu word dat dus schijnbaar verholpen door GROUP BY en dan ook alleen als de maand ervoor is ook in staat zoals 2 posts hierboven gezegd.

Nu wil ik dus dat ie standaard geen dubbele maand toont.

Ik hoop dat dit voor een beetje opheldering zorgt :)

in PHPmyAdmin krijg ik dit als ik de query daar uitvoer:
code:
1
2
3
4
5
6
7
8
9
10
SELECT t.UID, t.id, t.jaar, t.maand, t.dag, t.jaar_info, t.maand_info, t.dag_info, 
                            FROM timeline AS t
                            INNER JOIN (
                              SELECT jaar, maand, dag
                              FROM timeline
                              GROUP by maand
                            ) 
                            AS x on t.id = x.id
                            WHERE UID = 4
                            ORDER BY jaar, maand, dag

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FROM timeline AS t INNER JOIN ( SELECT jaar, maand, dag ' at line 2

[ Voor 16% gewijzigd door rubjo99 op 04-06-2012 16:01 ]


Acties:
  • 0 Henk 'm!

  • Bee.nl
  • Registratie: November 2002
  • Niet online

Bee.nl

zoemt

rubjo99 schreef op maandag 04 juni 2012 @ 16:00:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FROM timeline AS t INNER JOIN ( SELECT jaar, maand, dag ' at line 2
Vanaf FROM timeline gaat het fout, dus dan kijk je daarvoor en dan zie je (zoals ik hierboven al opgemerkt had) dat er een komma te veel staat aan het eind van je select-regel.

Maar is dit wel de query die je wilt hebben? Dit is een oplossing voor de vraag die er eigenlijk niet was. Je eerste query was waarschijnlijk gewoon goed (staat hier niet gepost?), maar je manier van data opslaan (de maand) is niet handig. Daarnaast is er wellicht iets mis met je php-code zoals Janoz aangeeft.

[ Voor 23% gewijzigd door Bee.nl op 04-06-2012 16:06 ]


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 10:54

Janoz

Moderator Devschuur®

!litemod

rubjo99 schreef op maandag 04 juni 2012 @ 15:53:
Wat jij zegt bedoel ik inderdaad! En het werkt inderdaad :D

Maar dat betekent dat als nu iemand bijvoorbeeld zou inloggen en niet de maand augustus in 1999 heeft maar wel 2 dag in september heeft staan dat ie het nog wel laat zien toch?
Nee, je moet nu gewoon eens in je php code gaan kijken waarom deze niet werkt. Stap er met de debugger doorheen en zie waarom een dubbele maand als eerste in het jaar dit probleem geeft. Kijk bij het debuggen vervolgens ook of elke waarde van je variabelen de waarde bevat die je denkt dat het zou moeten bevatten.

Wat mij trouwens enorm verbaast, is hoe je überhaupt zou kunnen vermoeden dat dit een probleem in je query zou kunnen zijn.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • rubjo99
  • Registratie: Februari 2011
  • Laatst online: 30-07-2020
Bee.nl schreef op maandag 04 juni 2012 @ 16:03:
[...]

Vanaf FROM timeline gaat het fout, dus dan kijk je daarvoor en dan zie je (zoals ik hierboven al opgemerkt had) dat er een komma te veel staat aan het eind van je select-regel.

Maar is dit wel de query die je wilt hebben? Dit is een oplossing voor de vraag die er eigenlijk niet was. Je eerste query was waarschijnlijk gewoon goed (staat hier niet gepost?), maar je manier van data opslaan (de maand) is niet handig. Daarnaast is er wellicht iets mis met je php-code zoals Janoz aangeeft.
Ik zie het inderdaad, over heen gelezen.

Nu ik er dit van heb gemaakt:
code:
1
2
3
4
5
6
7
8
9
10
SELECT t.UID, t.id, t.jaar, t.maand, t.dag, t.jaar_info, t.maand_info, t.dag_info
                            FROM timeline AS t
                            INNER JOIN (

                            SELECT * 
                            FROM timeline AS x
                            GROUP BY jaar, maand, dag
                            ) AS x ON t.id = x.id
                            WHERE t.UID = '.$_SESSION['id'].'
                            ORDER BY jaar, maand, dag


Het werkt nu, bijna zoals ik wil. Nu laat ie alleen bij het eerste jaar maar 1 maand zien met daarin alle dagen van alle andere maanden.
Janoz schreef op maandag 04 juni 2012 @ 16:09:
[...]


Nee, je moet nu gewoon eens in je php code gaan kijken waarom deze niet werkt. Stap er met de debugger doorheen en zie waarom een dubbele maand als eerste in het jaar dit probleem geeft. Kijk bij het debuggen vervolgens ook of elke waarde van je variabelen de waarde bevat die je denkt dat het zou moeten bevatten.

Wat mij trouwens enorm verbaast, is hoe je überhaupt zou kunnen vermoeden dat dit een probleem in je query zou kunnen zijn.
Ik heb de query intussen gewoon werkend en met welke debugger zou ik er dan doorheen moeten lopen?

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 10:54

Janoz

Moderator Devschuur®

!litemod

De fout heeft nooit in de query gezeten. Het enige wat je nu met je query voor elkaar gekregen hebt is dat hij gewoon een stukje langzamer draait en dat hij, door een mysql quirk, bij 2 items op dezelfde dag willekeurig 1 terug geeft.

Welke debugger je moet gebruiken zou ik zo niet weten. Ik ontwikkel zelf niet tot nauwelijks in php dus ben niet heel bekend met de beschikbare tooling. Ik kan je ook wel voor gaan kauwen welke bug je exact hebt, maar daar leer je niks van.

Programmeren is niet simpel maar een beetje wat lopen friemelen totdat je denkt dat je het juiste antwoordt hebt. Programmeren is begrijpen wat elke regel in je code doet. En als het resultaat dan niet is wat je verwacht dat het is, dan ga je regel voor regel bij langs om te kijken of wat er gebeurt ook datgene is wat je denkt dat er gebeurt. Dat de regels uitgevoerd worden die je denkt dat uitgevoerd worden, dat regels die overgeslagen moeten worden ook daadwerkelijk overgeslagen worden en dat variabelen ook daadwerkelijk de waarde krijgen die je denkt dat ze zouden moeten krijgen.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • rubjo99
  • Registratie: Februari 2011
  • Laatst online: 30-07-2020
Janoz schreef op maandag 04 juni 2012 @ 16:54:
De fout heeft nooit in de query gezeten. Het enige wat je nu met je query voor elkaar gekregen hebt is dat hij gewoon een stukje langzamer draait en dat hij, door een mysql quirk, bij 2 items op dezelfde dag willekeurig 1 terug geeft.

Welke debugger je moet gebruiken zou ik zo niet weten. Ik ontwikkel zelf niet tot nauwelijks in php dus ben niet heel bekend met de beschikbare tooling. Ik kan je ook wel voor gaan kauwen welke bug je exact hebt, maar daar leer je niks van.

Programmeren is niet simpel maar een beetje wat lopen friemelen totdat je denkt dat je het juiste antwoordt hebt. Programmeren is begrijpen wat elke regel in je code doet. En als het resultaat dan niet is wat je verwacht dat het is, dan ga je regel voor regel bij langs om te kijken of wat er gebeurt ook datgene is wat je denkt dat er gebeurt. Dat de regels uitgevoerd worden die je denkt dat uitgevoerd worden, dat regels die overgeslagen moeten worden ook daadwerkelijk overgeslagen worden en dat variabelen ook daadwerkelijk de waarde krijgen die je denkt dat ze zouden moeten krijgen.
Duidelijk verhaal! Maar ik ben hier nu al de hele dag mee bezig en na een tijdje verlies ik gewoon het overzicht en ik wil heel graag leren maar soms kom ik er gewoon echt niet uit. Ik hoef ook niet perse een voorgekauwd antwoord te krijgen, alleen zie ik zelf door de bomen het bos niet meer. Maar ik zal je advies opvolgen en kijken of ik er zelf nu verder achter kan komen

Acties:
  • 0 Henk 'm!

  • Barryvdh
  • Registratie: Juni 2003
  • Nu online
Probeer het anders een op te schrijven/tekenen, met wanneer hij wat moet weergeven.
En misschien beter kijken of je een bepaalde regel wel/niet weergeeft, want je hebt nu de regel voor de dag er 3x in staan, en de maand 2 keer.
(En natuurlijk wel zorgen dat je je data sorteert op jaar, maand en dan pas dag, zodat ze ook in de goede volgorde binnenkomen)
Pagina: 1