Swappen van ID's

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Frans van Berendonk

Frans van Berendonk

18/01/2007 15:08:00
Quote Anchor link
Ik heb een SQL tabel met daarin een kolom 'id', een kolom 'title' en een kolom 'text'. De kolom met 'id' is een auto-incrementing primary key. Met het Update commando probeer ik 2 'id' met elkaar te wisselen zodat een gebruiker straks zelf een volgorde kan bepalen.

Die krijgt een form te zien met daarin de invulvelden 'swap1' en 'swap 2'. Hierin kan de gebruiker invullen welke twee 'id' er gewisseld moeten worden. In dit script...

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$swap3
= $swap1;
$swap4 = $swap2;
echo"swap 3 = $swap3<br>";
echo"swap 4 = $swap4<br>";

$query = "UPDATE content SET id = $swap4 WHERE id = $swap1";
mysql_query($query) or die ("Zoekopdracht is mislukt: deel1");

$query = "UPDATE content SET id = $swap3 WHERE id = $swap2";
mysql_query($query) or die ("Zoekopdracht is mislukt: deel2");

?>



... krijg ik steeds een foutmelding, wellicht omdat 'SET id = $swap3' incorrecte syntax is. Moet ik dat fetchen? En hoe doe ik dat dan? Het idee van bovenstaand script is:

> Bewaar de waarden van 1 + 2 als 3 + 4
> Geef 1 de waarde van 3
> Geef 2 de waarde van 4
Gewijzigd op 01/01/1970 01:00:00 door Frans van Berendonk
 
PHP hulp

PHP hulp

19/11/2024 19:36:55
 
Jurgen assaasas

Jurgen assaasas

18/01/2007 15:17:00
Quote Anchor link
Kun je niet gewoon beter een query opbouwen waarbij de gebruiker de volgorde selecteert? en deze vervolgens in een cookie stoppen zodat hij zijn volgorde behoudt.
 
Frans van Berendonk

Frans van Berendonk

18/01/2007 15:28:00
Quote Anchor link
Met de 'gebruiker' bedoel ik in dit geval de Admin, die moet kunnen bepalen in welke volgorde de items worden weergegeven. Vandaar dat de 'bepalende factor' in de database moet zijn opgeslagen.
 
Robert Deiman

Robert Deiman

18/01/2007 15:34:00
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$swap3
= $swap1;
$swap4 = $swap2;
echo"swap 3 = $swap3<br>";
echo"swap 4 = $swap4<br>";

$query = "UPDATE content SET id = ".$swap4." WHERE id = ".$swap1;
mysql_query($query) or die ("Zoekopdracht is mislukt: deel1");

$query = "UPDATE content SET id = ".$swap3." WHERE id = ".$swap2;
mysql_query($query) or die ("Zoekopdracht is mislukt: deel2");

?>


Edit:

foutje :S:S
Gewijzigd op 01/01/1970 01:00:00 door Robert Deiman
 
Frans van Berendonk

Frans van Berendonk

18/01/2007 15:46:00
Quote Anchor link
Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING on line 18

Ik blijf foutmeldingen krijgen... ik zie in de post hierboven trouwens een verschil in de twee commano's: ... welke is de goede syntax?

WHERE id = ".$swap1;
WHERE id = ."$swap2
Gewijzigd op 01/01/1970 01:00:00 door Frans van Berendonk
 
Robert Deiman

Robert Deiman

18/01/2007 15:54:00
Quote Anchor link
De 1e die je noemde is de goede.. heb het ook aangepast in de post hiervoor. Maar wat het probleem zou kunnen zijn is dat je dan dubbele id's krijgt, terwijl een id altijd uniek moet zijn.

verander:

'or die ("Zoekopdracht is mislukt: deel1");' eens in:
'or trigger_error(mysql_error());'

En zo ook voor je 2e zoekopdracht. Dan zou je moeten zien (in het engels, dat wel) wat er fout gaat.
 
Frans van Berendonk

Frans van Berendonk

19/01/2007 10:35:00
Quote Anchor link
Bedankt voor de syntax! Ik heb het nog niet werkende, maar bedoel je hierboven dat er iets verkeerd zou kunnen gaan door de volgende logica:

De inhoud van swap1 sla ik ff op in swap3, die van swap2 sla ik ff op in swap4. Voordat ik de inhoud van swap4 in swap1 plaats, en die van swap3 in swap2 (en ze dus omwissel) zou ik de id's in de tabel eerst even moeten vullen met een uniek nummer. Want anders zou er tussen de 2 UPDATE queries een moment zijn waarop 2 id's gelijk zijn, en dat kan niet.

Klopt deze logica? En kan ik die id dan ook gewoon tijdelijk leeg maken? Alvast bedankt voor al jullie tips trouwens, ik heb er al meerdere andere scripts mee aan de gang gekregen. Leerzame webstek hier! :-)
 
Terence Hersbach

Terence Hersbach

19/01/2007 10:41:00
Quote Anchor link
de logica klopt niet, zo krijg je tabellen die helemaal vast gaan lopen.

Maak een kolom aan met de naam volgorde, en wijzig daar alles in.
 
- SanThe -

- SanThe -

19/01/2007 10:45:00
Quote Anchor link
Okee, even samenvatten:

Je wilt bijvoorbeeld id 2 en 3 omdraaien.
Dus je update id 2 naar 3
En daarna 3 naar 2. Welke van de twee id's met nummer 3 moet je dan hebben?

Oplossing:
Maak een extra veld aan in de tabel en zet daar het nummer van de volgorde in zodat je ORDER BY heel simpel kan gebruiken.
 
Frank -

Frank -

19/01/2007 10:54:00
Quote Anchor link
BLIJF MET JE VINGERS VAN DE KOLOM MET DE AUTO_INCREMENT AF!

Of je moet echt wanhopig op zoek zijn naar grote problemen.

Een kolom waarop auto_increment staat, gebruik je uitsluitend om een uniek record te herkennen. Het heeft helemaal niets met ouderdom of sortering te maken, ga het daar dan ook niet voor gebruiken.

Houd altijd in gedachten dat een query op ieder ongewenst moment kan mislukken. Wanneer je dan met de auto_increment loopt te kloten, kun je daarmee eenvoudig de hele database om zeep helpen.

Verder mag ik hopen dat je de innoDB-engine van MySQL gebruikt en dat je de queries in een TRANSACTION zet. Wanneer dan een query mislukt, kun je de vorige query ongedaan maken. Wederom om jouw database te redden van de ondergang...
 
Frans van Berendonk

Frans van Berendonk

19/01/2007 11:08:00
Quote Anchor link
Whoooo dat gaat me allemaal eventjes boven mijn pet! Maar je waarschuwing hierboven betreffende de auto_increment is zeker wel nuttig. Ik gebruikte het dus wel zo, omdat ik merkte dat als je een nieuwe row maakt dat-ie dan netjes onderaan kwam te staan. Die auto_increment kan er dus uit.

Verder mag ik hopen dat je mij eens verteld wat de innoDB-engine van MySQL is en hoe je de queries in een TRANSACTION zet...! ;-)
Gewijzigd op 01/01/1970 01:00:00 door Frans van Berendonk
 
Terence Hersbach

Terence Hersbach

19/01/2007 11:17:00
Quote Anchor link
Quote:
Die auto_increment kan er dus uit.


NEE zeker niet eruithalen!

je moet ziezo een ID geven aan elke row. Hier baseer je je sleutel van je tabel op. Anders zal je database op een gegeven moment ook weer in elkaar lopen.

dus alleen een kolom toevoegen zoals al eerder vermeld, verder alles met rust laten.
 
Frank -

Frank -

19/01/2007 11:43:00
Quote Anchor link
Quote:
Verder mag ik hopen dat je mij eens verteld wat de innoDB-engine van MySQL is en hoe je de queries in een TRANSACTION zet...! ;-)
Helaas, dat ga ik niet voor je doen, dat mag je zelf uitzoeken. Ik wil je wel even een zetje in de juiste richting geven:

Wikipedia
MySQL-handleiding

Succes!

Ps. innoDB is de enige engine van MySQL die (enigzins) als relationele database bruikbaar is. De rest is volkomen onbetrouwbaar en mag de naam database (als in DBMS) eigenlijk niet hebben. Tip: Gebruik PostgreSQL, dat werkt vele malen beter en vooral veiliger.
 
- SanThe -

- SanThe -

19/01/2007 11:58:00
Quote Anchor link
@Frank: Heb je soms aandelen bij PostgreSQL......LoL ;-))
 
Frans van Berendonk

Frans van Berendonk

28/02/2007 15:19:00
Quote Anchor link
Die website heb ik eens gelezen maar ik heb er niet veel aan. Wij hebben geen eigen server op ons reclamebureau dus we moeten het doen met de 'gewone' MySQL die bij de meeste cheapo hostingbedrijven te krijgen zijn.

Tja en verder... mijn probleem is nog steeds niet opgelost, ik vind PHP inmiddels uitermate frustrerend en omslachtig (vergeleken bij ActionScript) om zelf te schrijven. Ik heb na uren klooien geen zin meer om me hier nog verder in te verdiepen.

Ik ben best leergierig, maar het is voor ons als bedrijf de moeite gewoon niet waard om zelf te gaan zitten prutsen, als dit al 100 keer door een ander (met meer kennis) verzonnen is. Ik installeer Joomla wel, dan kan ik tenminste meteen aan de slag met het ontwerp (CSS) zonder me druk te hoeven maken over een om zeep te helpen database.
Gewijzigd op 01/01/1970 01:00:00 door Frans van Berendonk
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.