[MySQL/PHP] Revisie en Pagina id gelijk wegschrijven

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • martin149
  • Registratie: Augustus 2009
  • Laatst online: 10-09 08:19
Ik ben bezig met een site waar het ook mogelijk is om een pagina te updaten. Nu wortd er voor elke update het volgende gedaan:
Revisie wordt opgeslagen als een nieuwe record in de revisions tabel:
SQL:
1
INSERT INTO revisions (id,content,time,user_id,description) VALUES (NULL , '".$body."', '".$time."', '', '".$desc."');

Vervolgens pak ik de id en doe het volgende:
SQL:
1
UPDATE pages SET rev_id = '".$id."' WHERE link = '".$page."' LIMIT 1 ;


Nu heb ik echter het probleem dat ik graag de revisies voor een pagina op wil vragen, maar ik wil graag de id van de pagina dus bij de revisies erin hebben. Je kan natuurlijk een aantal queries in elkaar vlechten, maar is hier niet een simpele oplossing voor? Ik heb al eens gezocht op google, maar kan het niet goed vinden. Ik hoef geen hele stukken code, maar een klein opzetje zal ik wel mee uit de voeten kunnen

Acties:
  • 0 Henk 'm!

Verwijderd

Ik begrijp je niet. Leg eens niet uit wat je aan het doen bent, leg uit wat de bedoeling is zonder het over jouw eigen implementatie te hebben.

Acties:
  • 0 Henk 'm!

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

martin149 schreef op zaterdag 14 april 2012 @ 19:49:
Nu heb ik echter het probleem dat ik graag de revisies voor een pagina op wil vragen, maar ik wil graag de id van de pagina dus bij de revisies erin hebben. Je kan natuurlijk een aantal queries in elkaar vlechten, maar is hier niet een simpele oplossing voor? Ik heb al eens gezocht op google, maar kan het niet goed vinden.
Jawel, het heet normalisatie, een goed database ontwerp dus. Als je bij de revisies tabel ook aangeeft bij welke pagina de revisie hoort (een aparte kolom dus) kun je daar toch op selecteren? Vervolgens sorteer je op datum wanneer de revisie is aangemaakt.

Sowieso vind ik het vreemd om de revision een ID als waarde 'null' te geven, laat het dan weg of geef dat veld de waarde van de pagina waar het een revisie van is. :)

[ Voor 23% gewijzigd door CH4OS op 14-04-2012 19:56 ]


Acties:
  • 0 Henk 'm!

  • martin149
  • Registratie: Augustus 2009
  • Laatst online: 10-09 08:19
CptChaos schreef op zaterdag 14 april 2012 @ 19:53:
[...]
Jawel, het heet normalisatie, een goed database ontwerp dus. Als je bij de revisies tabel ook aangeeft bij welke pagina de revisie hoort kun je daar toch op selecteren? Vervolgens sorteer je op datum wanneer de revisie is aangemaakt.
Ja, dat wil ik dus ook ,maar ik vroeg me af of je een insert en een update kunt doen en dan de id's aan elkaar door kunt spelen.
DUS
INSERT revision, met de ID van de pagina
UPDATE page, met de ID van de revisie

en dat dan in een query doen, zonder een wirwar van subquery's

Acties:
  • 0 Henk 'm!

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

Hier stond onzin.

@ Hieronder, dat is idd wat TS lijkt te zoeken.

[ Voor 173% gewijzigd door CH4OS op 14-04-2012 20:00 ]


Acties:
  • 0 Henk 'm!

  • Exhar
  • Registratie: Februari 2007
  • Niet online
Je zoekt mysql_insert_id?

Hangt er beetje vanaf of je een auto_increment gebruikt, maar daar zeg je niets over :)

[ Voor 12% gewijzigd door Exhar op 14-04-2012 19:58 ]


Acties:
  • 0 Henk 'm!

  • Devil
  • Registratie: Oktober 2001
  • Niet online

Devil

King of morons

CptChaos schreef op zaterdag 14 april 2012 @ 19:53:
[...]

Sowieso vind ik het vreemd om de revision een ID als waarde 'null' te geven, laat het dan weg of geef dat veld de waarde van de pagina waar het een revisie van is. :)
Is waarschijnlijk een auto increment column.

After all, we are nothing more or less than what we choose to reveal.


Acties:
  • 0 Henk 'm!

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

Devil schreef op zaterdag 14 april 2012 @ 20:05:
[...]

Is waarschijnlijk een auto increment column.
Dan hoeft die column niet meegenomen te worden in de query zelf. :)

Acties:
  • 0 Henk 'm!

  • Devil
  • Registratie: Oktober 2001
  • Niet online

Devil

King of morons

CptChaos schreef op zaterdag 14 april 2012 @ 20:13:
[...]
Dan hoeft die column niet meegenomen te worden in de query zelf. :)
Hoeft niet, mag wel. En als ik een column zie die id heet waar een null in geinsert wordt dan denk ik aaha auto_increment en niet een column die id heet waar overal de waarde 'null' instaat :+

After all, we are nothing more or less than what we choose to reveal.


Acties:
  • 0 Henk 'm!

  • martin149
  • Registratie: Augustus 2009
  • Laatst online: 10-09 08:19
Het is inderdaad een auto increment column. Hij staat daar dan ook een beetje slordig. Ik ben er gewoon aan gewend om een id veld aan alles te geven en vervolgens phpmyadmin de insert code te laten maken, om typefouten te voorkomen.
Dit is de huidige code:
PHP:
1
2
3
$result = mysql_query("INSERT INTO revisions (content,time,user_id,description) VALUES ('".$body."', '".$time."', '', '".$desc."');") or die(mysql_error());
$id = mysql_insert_id();
$result = mysql_query("UPDATE pages SET rev_id = '".$id."' WHERE link = '".$page."' LIMIT 1 ;") or die(mysql_error());


Dit zijn de tables:
Pages:
id, name, time, state, rev_id, link

Revisions:
id, page_id, content, time, user_id, description

En het moet dus zoiets worden:
PHP:
1
2
3
4
5
$result = mysql_query("INSERT INTO revisions (content,time,user_id,description) VALUES ('".$body."', '".$time."', '', '".$desc."');") or die(mysql_error());
$id = mysql_insert_id();
$result = mysql_query("UPDATE pages SET rev_id = '".$id."' WHERE link = '".$page."' LIMIT 1 ;") or die(mysql_error());
$id2 = mysql_insert_id();
$result = mysql_query("UPDATE revisions SET page_id = '".$id2."' WHERE id = '".$id2."' LIMIT 1 ;") or die(mysql_error());


Maar dat zou dus eigenlijk makkelijker moeten kunnen als ik het zo bekijk...

Acties:
  • 0 Henk 'm!

  • Struikrover
  • Registratie: Juni 2005
  • Laatst online: 22-09 23:53
Uhm, een gokje, maar zou je niet een foreign key kunnen gebruiken (moet je wel InnoDB hebben bij het aanmaken van je tabel) die de pagina id propageert naar de revisions tabel? dus met een 'on update cascade' bij het aanmaken van de foreign key op je tabellen?

Acties:
  • 0 Henk 'm!

  • Devil
  • Registratie: Oktober 2001
  • Niet online

Devil

King of morons

Ik snap die laatste regel niet. Waarom zou je revisions weer updaten, de page id is toch niet veranderd door de update query?
En waar dient $id2 voor? Daar zit namelijk 0 in, aangezien een update geen auto_increment triggert.

Leg nou eerst gewoon even uit wat je precies wilt bereiken. Wat is de begin situatie en wat is het gewenste resultaat. Want half werkende code posten maakt het niet echt duidelijker.

After all, we are nothing more or less than what we choose to reveal.


Acties:
  • 0 Henk 'm!

Verwijderd

Waarvoor heb je $id2? Wat insert je precies met die 2e query?
Misschien moet je ook eens kijken naar LAST_INSERT_ID()

Maar wat ik eigelijk probeerde te zeggen: stop eens met bedenken hoe het moet als je al een halve applicatie hebt. Bedenk eens -los van wat je nu hebt- hoe het zou moeten werken. Nou bouw je voort op iets wat misschien niet goed is ontworpen.

En dan nog snap ik niet waarom je moeite hebt met het schrijven van wat code. Volgens mij heb je niet genoeg ervaring om überhaupt te bepalen wat "makkelijker" is en wat niet. Ik zie namelijk niet in wat er moeilijk aan is.

Misschien is het een idee om met een framework te gaan werken die e.e.a. voor je doet.

Acties:
  • 0 Henk 'm!

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

martin149 schreef op zaterdag 14 april 2012 @ 20:24:
Het is inderdaad een auto increment column. Hij staat daar dan ook een beetje slordig. Ik ben er gewoon aan gewend om een id veld aan alles te geven en vervolgens phpmyadmin de insert code te laten maken, om typefouten te voorkomen.
Niet elke record heeft per se een uniek ID nodig (en er zijn ook andere wegen om een row terug te krijgen uit een query, zónder er een limiet aan te hangen), denk bijvoorbeeld maar aan koppeltabellen, daar wil je zoiets juist niet hebben. ;)

[ Voor 10% gewijzigd door CH4OS op 14-04-2012 20:50 ]


Acties:
  • 0 Henk 'm!

  • martin149
  • Registratie: Augustus 2009
  • Laatst online: 10-09 08:19
Een oplossing zouden dus koppeltabellen kunnen zijn. Ik heb er over na zitten denken, maar ik weet niet of het een groot voordeel heeft. Ik wil dus gewoon 2 kanten op linken bij wijze van spreken, dus bij een pagina één revisie (degene die op dat moment er staat) en bij elke revisie een pagina.
Het lijkt mij het handigste om bij een pagina geen revisie meer te verbinden, en gewoon de laatste te pakken. Je hoeft dan enkel vanaf de revisie naar een pagina-id te verwijzen, en als er een revisie wordt teruggezet, plaats je gewoon een nieuwe revisie revisie in de database.
Dit lijkt me de beste oplossing. Op die manier hoef ik dan ook geen aanpassingen aan het pagina-veld te maken.

Acties:
  • 0 Henk 'm!

  • Devil
  • Registratie: Oktober 2001
  • Niet online

Devil

King of morons

Dat ligt er aan hoeveel records je in je database hebt en of je slim gebruik kunt maken van indexen. Want als er elke keer dat er een pagina wordt opgevraagd een filesort nodig is, dan kun je beter elke keer als je een pagina update een extra update query uitvoeren.

Je kunt dan denken aan een tabel page_revision met 2 kolommen: page_id en revision_id bij elke revisie insert je dan de revision en update je page_revision.

Bij het opvragen van de pagina heb je dan alleen een select op de primary key nodig, wat altijd sneller is dan een order by (om de laatste revisie te vinden)

[ Voor 15% gewijzigd door Devil op 16-04-2012 17:42 ]

After all, we are nothing more or less than what we choose to reveal.


Acties:
  • 0 Henk 'm!

  • Patriot
  • Registratie: December 2004
  • Laatst online: 09:10

Patriot

Fulltime #whatpulsert

martin149 schreef op zondag 15 april 2012 @ 12:34:
Een oplossing zouden dus koppeltabellen kunnen zijn. Ik heb er over na zitten denken, maar ik weet niet of het een groot voordeel heeft. Ik wil dus gewoon 2 kanten op linken bij wijze van spreken, dus bij een pagina één revisie (degene die op dat moment er staat) en bij elke revisie een pagina.
Sorry hoor, maar dat héb je toch al. Je revisions table bevat een page_id, dus als je alle revisions wilt hebben die bij een page horen doe je dit:

PHP:
1
2
3
4
5
6
<?php

$page_id = 15; // in de praktijk zal je deze natuurlijk niet hardcoded hebben staan
$revisions = mysql_query("SELECT * FROM revisions WHERE page_id = " . $page_id);

?>


Dan heb je toch keurig een lijstje met revisions die bij de page met het id 15 horen?
Pagina: 1