[PHP] Automatisch value toevoegen database

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • bekok
  • Registratie: Juni 2004
  • Laatst online: 05-08 12:59
Ik heb een database met 2 velden die voor de sortering van bestanden zorgen, genaamd 'orderID' en 'catID'. Nu gebruik ik deze twee velden dus om ervoor te zorgen dat ze gesorteerd kunnen worden, maar ik heb een probleem bij het toevoegen van een nieuw bestand.
Als ik namelijk een nieuw bestand wil toevoegen moet de waarde van 'orderID' en 'catID' 1 meer zijn dan de hoogste waarde die al in de database bestaat. Ik zat aan auto_increment te denken, maar dit kan blijkbaar alleen maar voor de primary 'ID' key, dus dit werkt niet.
Mijn query ziet er momenteel zo uit:

PHP:
1
2
3
4
5
6
    $sql = 'INSERT INTO nieuws (naam, bron, rapport) VALUES
            (
            "'. $naam .'",
            "'. $bron .'",
            "'. $rapport .'"
            )';


Er moet dus eigenlijk nog 2 velden bij waarbij ik orderID en catID automatisch toevoeg met een waarde hoger dan het momenteel hoogste.
Hoe doe ik dat?

20" iMac; 2.4ghz Core 2 Duo; 3GB; Ati Radeon 2600HD Pro


Acties:
  • 0 Henk 'm!

  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

Maar een primary key over ID, orderID en catID? En dan kan je die (normaal) wel als auto increment zetten.
Niet doen, is vies (volgens NMe)

[ Voor 17% gewijzigd door Snake op 02-03-2010 15:06 ]

Going for adventure, lots of sun and a convertible! | GMT-8


Acties:
  • 0 Henk 'm!

  • bekok
  • Registratie: Juni 2004
  • Laatst online: 05-08 12:59
Snake schreef op dinsdag 02 maart 2010 @ 14:43:
Maar een primary key over ID, orderID en catID? En dan kan je die (normaal) wel als auto increment zetten.
Ik dacht gelezen te hebben dat je maar 1 primary key kan hebben, of heb ik dat mis?

20" iMac; 2.4ghz Core 2 Duo; 3GB; Ati Radeon 2600HD Pro


Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

Ervan uitgaand dat je MySQL gebruikt:
For MyISAM tables you can specify AUTO_INCREMENT on a secondary column in a multiple-column index. In this case, the generated value for the AUTO_INCREMENT column is calculated as MAX(auto_increment_column) + 1 WHERE prefix=given-prefix. This is useful when you want to put data into ordered groups.

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Snake schreef op dinsdag 02 maart 2010 @ 14:43:
Maar een primary key over ID, orderID en catID? En dan kan je die (normaal) wel als auto increment zetten.
:X Ja, da's ook niet vies ofzo. 8)7

Doe gewoon een subselect voor de maximale waarde, tel daar 1 bij op en klaar.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • bekok
  • Registratie: Juni 2004
  • Laatst online: 05-08 12:59
NMe schreef op dinsdag 02 maart 2010 @ 15:05:
[...]

:X Ja, da's ook niet vies ofzo. 8)7

Doe gewoon een subselect voor de maximale waarde, tel daar 1 bij op en klaar.
Ja dit leek mij ook het handigst, maar ik kwam er niet helemaal uit hoe ik dit in de query moet verwerken..

20" iMac; 2.4ghz Core 2 Duo; 3GB; Ati Radeon 2600HD Pro


Acties:
  • 0 Henk 'm!

  • PeterSelie
  • Registratie: December 2002
  • Laatst online: 18-09 14:19
Even een subquery bakken, aflopend sorteren en alleen de IDs ophalen?

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

PHP:
1
2
3
4
5
6
7
8
    $sql = 'INSERT INTO nieuws (naam, bron, rapport, orderId, catId) VALUES
            (
            "'. $naam .'",
            "'. $bron .'",
            "'. $rapport .'",
            (SELECT MAX(orderId) + 1 FROM nieuws),
            (SELECT MAX(catId) + 1 FROM nieuws)
            )';

Bijvoorbeeld? :P

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • bekok
  • Registratie: Juni 2004
  • Laatst online: 05-08 12:59
NMe schreef op dinsdag 02 maart 2010 @ 15:11:
PHP:
1
2
3
4
5
6
7
8
    $sql = 'INSERT INTO nieuws (naam, bron, rapport, orderId, catId) VALUES
            (
            "'. $naam .'",
            "'. $bron .'",
            "'. $rapport .'",
            (SELECT MAX(orderId) + 1 FROM nieuws),
            (SELECT MAX(catId) + 1 FROM nieuws)
            )';

Bijvoorbeeld? :P
Ja ik wist niet hoe ik dat precies moest formuleren (moest nog wel " toevoegen aan begin en eind) :P
Krijg nu alleen nog wel de foutmelding 'Column count doesn't match value count at row 1 '

20" iMac; 2.4ghz Core 2 Duo; 3GB; Ati Radeon 2600HD Pro


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Wat heb je dan precies toegevoegd?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • bekok
  • Registratie: Juni 2004
  • Laatst online: 05-08 12:59
PHP:
1
2
3
4
5
6
7
8
    $sql = 'INSERT INTO nieuws (naam, bron, rapport, orderID, catID) VALUES
            (
            "'. $naam .'",
            "'. $bron .'",
            "'. $rapport .'"
            "(SELECT MAX(orderId) + 1 FROM nieuws)",
            "(SELECT MAX(catId) + 1 FROM nieuws)"
            )';


Database ziet er als volgt uit: http://img193.imageshack....hermafbeelding2010030.png

[ Voor 15% gewijzigd door bekok op 02-03-2010 16:00 ]

20" iMac; 2.4ghz Core 2 Duo; 3GB; Ati Radeon 2600HD Pro


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Die quotes moeten daar dus absoluut niet omheen tenzij je een string wil invoegen, en je bent een komma vergeten achteraan regel 5. Ik stel voor dat je even gaat opzoeken wat subqueries zijn. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • cariolive23
  • Registratie: Januari 2007
  • Laatst online: 18-10-2024
Accepteert MySQL inmiddels subqueries op dezelfde tabel als waar je de INSERT doet?Dat was in het verleden in elk geval niet, geen idee wat de huidige status is.

Acties:
  • 0 Henk 'm!

  • bekok
  • Registratie: Juni 2004
  • Laatst online: 05-08 12:59
cariolive23 schreef op dinsdag 02 maart 2010 @ 16:07:
Accepteert MySQL inmiddels subqueries op dezelfde tabel als waar je de INSERT doet?Dat was in het verleden in elk geval niet, geen idee wat de huidige status is.
Nope, krijg daar inderdaad ook een foutmelding van. Ik zal mezelf echter wat meer inlezen in subqueries!

20" iMac; 2.4ghz Core 2 Duo; 3GB; Ati Radeon 2600HD Pro


Acties:
  • 0 Henk 'm!

  • bekok
  • Registratie: Juni 2004
  • Laatst online: 05-08 12:59
Ik heb het als volgt opgelost. Eerst doe ik:

PHP:
1
2
3
4
5
6
7
8
9
10
11
    $sql1 = 'SELECT MAX(catID) FROM nieuws';
    $result1 = mysqli_query($link, $sql1);
    if (!$result1) {
        $error = 'Fout bij het ophalen van het nieuws';
        include 'error.html.php';
        exit();
    }

    $row = mysqli_fetch_array($result1);
    $catID = $row['MAX(catID)'];
    $catIDNew = $catID + 1;


Waarna ik het zo in de database toevoeg:

PHP:
1
2
3
4
5
6
7
8
    $sql = 'INSERT INTO nieuws (naam, bron, rapport, orderID, catID) VALUES
            (
            "'. $naam .'",
            "'. $bron .'",
            "'. $rapport .'",
            "'. $catIDNew .'",
            "'. $catIDNew .'"
            )';


Misschien iet heel netjes ofzo, maar het werkt in ieder geval. Bedankt :)

20" iMac; 2.4ghz Core 2 Duo; 3GB; Ati Radeon 2600HD Pro


Acties:
  • 0 Henk 'm!

Verwijderd

pas wel op dat niet iemand anders toevallgi ook nieuws toevoegd, ik weet niet hoe dat ivm vertragingen gaat, maar dan kan de max welleens de andere waarde zijn en zo wordt het verkeerd gekoppeld en klopt de reeks daarna ook niet meer. hier is heeeeeeeeeel weinig kans op maar het kan toch. (met toeval had ik dit namelijk ook tijdens ontwikkeling van een bedrijfs systeem)

Acties:
  • 0 Henk 'm!

  • bekok
  • Registratie: Juni 2004
  • Laatst online: 05-08 12:59
Verwijderd schreef op dinsdag 02 maart 2010 @ 17:37:
pas wel op dat niet iemand anders toevallgi ook nieuws toevoegd, ik weet niet hoe dat ivm vertragingen gaat, maar dan kan de max welleens de andere waarde zijn en zo wordt het verkeerd gekoppeld en klopt de reeks daarna ook niet meer. hier is heeeeeeeeeel weinig kans op maar het kan toch. (met toeval had ik dit namelijk ook tijdens ontwikkeling van een bedrijfs systeem)
Bedankt voor de tip, dat klopt inderdaad! Gelukkig is er in principe maar 1 persoon die überhaupt nieuws toevoegt, dus dat moet wel goed zitten :)

20" iMac; 2.4ghz Core 2 Duo; 3GB; Ati Radeon 2600HD Pro


Acties:
  • 0 Henk 'm!

  • _eXistenZ_
  • Registratie: Februari 2004
  • Laatst online: 19-09 01:03
Daarvoor heb je table locking toch :P

There is no replacement for displacement!


Acties:
  • 0 Henk 'm!

  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

Maar waarom sla je orderID en catID appart op als het toch altijd hetzelfde nummer is?
Overigens: geef MAX(catID) een alias, dan kan je die 'mooier' ophalen uit je array.

Maar jouw code is gevoelig voor errors he. Wat als iemand iets insert terwijl er een insert bezig is. Je zou de database moeten locken (read/write) door middel van een transactie of iets dergelijks, zodat een andere insert wacht :).

Going for adventure, lots of sun and a convertible! | GMT-8


Acties:
  • 0 Henk 'm!

  • Luqq
  • Registratie: Juni 2005
  • Laatst online: 19-09 14:23
Ben ik nou de eerste in dit topic die iets over SQL injectie wil zeggen?

Acties:
  • 0 Henk 'm!

Verwijderd

Luqq schreef op dinsdag 02 maart 2010 @ 17:43:
Ben ik nou de eerste in dit topic die iets over SQL injectie wil zeggen?
naja ik dacht er wel aan, maar ik dacht dat zal die overal nog wel moeten doen haha

maarem table locking hoe bedoel je dat precies?

Acties:
  • 0 Henk 'm!

  • bekok
  • Registratie: Juni 2004
  • Laatst online: 05-08 12:59
Het hele systeem is niet op en top beveiligd, daar ben ik het zeker mee eens. Maar om nieuws toe te kunnen voegen moet je sowieso inloggen en er is over het algemeen maar 1 persoon die iets toevoegt. Daardoor heeft functionaliteit hier eventjes de prioriteit boven veiligheid :)

20" iMac; 2.4ghz Core 2 Duo; 3GB; Ati Radeon 2600HD Pro


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
bekok schreef op dinsdag 02 maart 2010 @ 17:54:
Het hele systeem is niet op en top beveiligd, daar ben ik het zeker mee eens. Maar om nieuws toe te kunnen voegen moet je sowieso inloggen en er is over het algemeen maar 1 persoon die iets toevoegt. Daardoor heeft functionaliteit hier eventjes de prioriteit boven veiligheid :)
Moet je de redactie eens een stukje laten schrijven over SQL injection, kun je lachen :X
*poof* weg DB.

Of je ingelogd moet zijn of niet: SQL injection moet je gewoon voorkomen. Daarbij gaat je systeem al op z'n bek als de redactie schrijft over een gebeurtenis in 's Hertogenbosch om maar wat te noemen.

[ Voor 17% gewijzigd door RobIII op 02-03-2010 18:03 ]

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!

  • _eXistenZ_
  • Registratie: Februari 2004
  • Laatst online: 19-09 01:03
Luqq schreef op dinsdag 02 maart 2010 @ 17:43:
Ben ik nou de eerste in dit topic die iets over SQL injectie wil zeggen?
Je weet toch helemaal niet wat ervóór met zijn variabelen gebeurt? Escapen is een must maar om dat in elk topc te noemen is toch ook overkill Afbeeldingslocatie: http://exhost.nl/etc/tweakers.net/opsekopse.gif

[ Voor 8% gewijzigd door _eXistenZ_ op 02-03-2010 18:47 ]

There is no replacement for displacement!


Acties:
  • 0 Henk 'm!

  • mbaltus
  • Registratie: Augustus 2004
  • Laatst online: 14-09 16:55
Standaard MySQLi gebruiken met prepared queries, dan is dat probleem gelijk voor je opgelost.
en inderdaad wat table-locking erover heen en/of voor de veiligheid misschien in je tabel voor die velden een Unique opgeven en fouten afvangen!

The trouble with doing something right the first time is that nobody appreciates how difficult it is


Acties:
  • 0 Henk 'm!

  • CyBeRSPiN
  • Registratie: Februari 2001
  • Laatst online: 00:12

CyBeRSPiN

sinds 2001

MySQL ondersteunt tegenwoordig toch triggers, dit lijkt me nu typisch een voorbeeld waar je een ON INSERT trigger wilt toepassen..

Acties:
  • 0 Henk 'm!

  • naam
  • Registratie: Oktober 2007
  • Laatst online: 22:03
RobIII schreef op dinsdag 02 maart 2010 @ 18:02:
[...]

Moet je de redactie eens een stukje laten schrijven over SQL injection, kun je lachen :X
*poof* weg DB.

Of je ingelogd moet zijn of niet: SQL injection moet je gewoon voorkomen. Daarbij gaat je systeem al op z'n bek als de redactie schrijft over een gebeurtenis in 's Hertogenbosch om maar wat te noemen.
Jij weet hier iets van hea? :> vertel :>

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)

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!

  • naam
  • Registratie: Oktober 2007
  • Laatst online: 22:03
Die ken ik :) maar ik bedoelde meer over de redactie een stukje laten schrijven erover :P je post klonk alsof er een verhaal achter zit :P

Acties:
  • 0 Henk 'm!

  • Alain
  • Registratie: Oktober 2002
  • Niet online
mbaltus schreef op donderdag 04 maart 2010 @ 15:06:
Standaard MySQLi gebruiken met prepared queries, dan is dat probleem gelijk voor je opgelost.
Dan moet je host wel mysqli ondersteunen. ;)

You don't have to be crazy to do this job, but it helps ....


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
marabunta2048 schreef op donderdag 04 maart 2010 @ 19:10:
[...]

Die ken ik :) maar ik bedoelde meer over de redactie een stukje laten schrijven erover :P je post klonk alsof er een verhaal achter zit :P
Ik bedoelde TS's redactie, niet de onze 8)7 8)7
En ik doelde er dus op dat, als ze voorbeelden in hun artikel gaan geven, het risico lopen hun eigen DB om zeep te helpen.

[ Voor 16% gewijzigd door RobIII op 04-03-2010 20:19 ]

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!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Ik hoopte op een voorbeeld zoals bij informatie. :p

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
CyBeRSPiN schreef op donderdag 04 maart 2010 @ 16:11:
MySQL ondersteunt tegenwoordig toch triggers, dit lijkt me nu typisch een voorbeeld waar je een ON INSERT trigger wilt toepassen..
Hoe zie je dit voor je?

Eerst een handmatige insert waarna een trigger aangeroepen wordt ( kost tijd ) die een select doet en daarna weer een update statement uitvoert?
Lijkt me leuk in een tabel met ietwat grotere indexen, 2x een indexupdate...

Dan kan je beter gewoon eerst 1 select doen en dat resultaat in 1 insert statement stoppen en het totaal in 1 transactie verpakken. Scheelt je 1 indexupdate en een update statement plus wat extra trigger logica...
Die transactiekosten maakt mysql toch ook al met een trigger
Pagina: 1