Waarschijnlijk zoek ik niet goed, maar ik kom er toch echt niet uit.
Ik heb een tabel nieuws:
ID
Titel
Samenvatting
Bericht
Auteur
Nu vul ik de titel, bericht en auteur in. Deze gegevens komen dan in een database.
Vervolgens denk ik: Wil toch nog wel graag een samenvatting schrijven.
Dus ik ga naar het wijzigen formulier.
Daarin vul ik de samenvatting in, om vervolgens up "bewerken" te drukken.
En je raad het vast, er gebeurt niets. En dit komt, omdat het veld samenvatting leeg is in de database en je kan niks updaten wat leeg is.
Wat ik heb geprobeert
INSERT OR REPLACE INTO
UPDATE
@@rowcount 0 etc.
$updateQuery = "UPDATE nieuws SET titel='".$this->titel."',samenvatting='".$this->samenvatting."',bericht='".$this->bericht."' WHERE id='".$this->id."'
IF @@ROWCOUNT=0
INSERT INTO (titel, samenvatting, bericht) VALUES('".$this->titel."','".$this->samenvatting."','".$this->bericht."')
Allemaal zonder succes.
Veiligheid is niet belangrijk, omdat het alleen op het intranet word gebruikt en SQL injecties etc daar niet heel waarschijnlijk gaan voorkomen.
Veiligheid is niet belangrijk, omdat het alleen op het intranet word gebruikt en SQL injecties etc daar niet heel waarschijnlijk gaan voorkomen
Dan nog is dit een slechte redenering.
Escapen garandeert dat de sql een formaat krijgt dat geldig is. Het helpt je niet enkel tegen hackers, maar ook tegen speciale tekens.
bv. deze zin: De redacteur zei:"De foto's trekken op niets".
Die zin krijg jij niet in je systeem gepompt, tenzij je escapet ... zoals het hoort en zoals je het altijd moet doen.
-----
Probeer dit eens uit.
Volgens dit stramien
<?php
// eerst proberen updaten
if (mysql_query("UPDATE ... WHERE id=" . (int) $id)) {
// Er is geen fout in de query
if(mysql_affected_rows() > 0) {
// update geslaagd
}
else {
if(mysql_query("INSERT INTO ... ")) {
// insert geslaagd
}
}
}
?>
Ik begrijp wat je bedoeld. Ik probeer er wel zoveel mogelijk rekening mee te houden, uiteraard.
Bedankt voor je tip, ik ga er mee aan de slag. Het gaat er eigenlijk om, dat wanneer een veld niet verplicht is, deze later wel ingevuld kan worden. En dit gaat dus eigenlijk mis.
En je raad het vast, er gebeurt niets. En dit komt, omdat het veld samenvatting leeg is in de database en je kan niks updaten wat leeg is.
Misschien begrijp ik je verkeerd, maar zoals het er nu staat is het onzin. Of je een record kan updaten of niet ligt aan het feit of het record bestaat, of je de juiste rechten hebt toegekend en of je query correct is, niet of een veld binnen het record leeg is of niet.
Wat ik normaal gesproken doe is een INSERT statement met een ON DUPLICATE KEY clause erbij. Zo kan je iets inserten, maar als het record al bestaat wordt het geupdate (let wel, je moet dan wel een unieke index erop hebben zitten, anders werkt het niet):
INSERT INTO nieuws(id, titel, samenvatting, bericht, auteur)
VALUES(:id, :titel, :samenvatting, :bericht, :auteur)
ON DUPLICATE KEY UPDATE
titel = VALUES(titel),
samenvatting = VALUES(samenvatting),
bericht = VALUES(bericht),
auteur = VALUES(auteur);
Hm, ik zal er dit weekend maar even weer bij zitten. Het werkt namelijk niet.
Ik haal de gegevens op uit een database
Vervolgens worden alle velden netjes getoont. Ik kan ze ook allemaal bijwerken. Betekend dat het script zijn werk doet.
Echter werkt het niet, wanneer ik alle gegevens ophaal uit de database en een van de rijen (samenvatting, bericht) leeg is. Er gebeurt dan helemaal niets wanneer ik in het formulier op "submit" druk.
Dus wel, wanneer alle velden in de database zijn gevuld en ik doe een aanpassing en niet wanneer een van de velden nog niet gevuld is en ik wil deze vullen of bijwerken...
[size=xsmall]Toevoeging op 22/10/2013 15:12:21:[/size]
ah... nu wel... heb nog even de foutafhandeling gedaan, wat ik was vergeten, bleek er een haakje verkeerd te staan.
Je kunt ook gewoon INSERT door REPLACE vervangen, dat heeft hetzelfde effect.
Aanvulling op Ger: Als je vooraf weet dat je gaat updaten dan geen INSERT ON DUPLICATE KEY UPDATE gebruiken. De ON DUPLICATE KEY UPDATE kost je performance, onder water probeert het database engine eerst te inserten maar struikelt over de unique key constraint en voert dan pas de actie ON DUPLICATE KEY UPDATE uit. Dit kost onnodig tijd in de database engine terwijl je toch al weet dat het een update betreft. Het is een fraaie feature echter gebruik het niet 'voor het gemak'
Wat is het performance verschil ten opzichte van eerst via een select query checken of je het record al bestaat en aan de hand daarvan de insert danwel update te doen? In principe gebeurt er dan precies hetzelfde, behalve dat je in 2 queries doet wat je anders met 1 doet, of is er nog iets anders aan de hand?
Wat is het performance verschil ten opzichte van eerst via een select query checken of je het record al bestaat en aan de hand daarvan de insert danwel update te doen? In principe gebeurt er dan precies hetzelfde, behalve dat je in 2 queries doet wat je anders met 1 doet, of is er nog iets anders aan de hand?
De topic starter heeft het over "bewerken", editten van een record. Hij weet dus al dat het bestaat, hij heeft het al opgehaald. Dan ga je toch niet nog een keer via een select query checken of het al bestaat??
En overigens nog iets over REPLACE (wat ik nu ook pas voor het eerst zie), REPLACE doet precies dezelfde check als ON DUPLICATE KEY UPDATE, maar update daarna het record niet, maar verwijdert het record en voegt het daarna opnieuw toe. Dat betekent twee dingen:
1) je moet delete rechten hebben op de tabel
2) als er een foreign key opzit dan kan het zijn dat er dus ook andere records verwijdert worden, of, ook interessant, het kan zijn dat de hele REPLACE operatie mislukt omdat je record niet eerst verwijdert kan worden.
Ik hoor graag verder uitleg (wat ik lees dit ook pas net), maar voorlopig houd ik het bij de door mij gekozen optie.
[size=xsmall]Toevoeging op 22/10/2013 15:55:05:[/size]
John D op 22/10/2013 15:52:17
De topic starter heeft het over "bewerken", editten van een record. Hij weet dus al dat het bestaat, hij heeft het al opgehaald. Dan ga je toch niet nog een keer via een select query checken of het al bestaat??
Correct, ik had bij de vraag misschien even moeten zeggen 'in gevallen dat je niet weet of het record al bestaat'. Als je het weet dan hebben we geen meningsverschil :-)