PHP / SQL updaten leeg veld
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.
Quote:
$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."')
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.
Kunnen jullie mij helpen?
Alvast bedankt!
Jan Rever op 22/10/2013 13:20:26:
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
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
<?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
}
}
}
?>
// 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
}
}
}
?>
Gewijzigd op 22/10/2013 13:38:45 door Kris Peeters
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.
Gewijzigd op 22/10/2013 13:46:08 door Jan Rever
Jan Rever op 22/10/2013 13:20:26:
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):
Erwin H op 22/10/2013 14:13:23:
... INSERT statement met een ON DUPLICATE KEY clause erbij. Zo kan je iets inserten, maar als het record al bestaat wordt het geupdate ...
Klinkt interessant. Moet ik eens proberen.
Je kunt ook gewoon INSERT door REPLACE vervangen, dat heeft hetzelfde effect.
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...
Toevoeging op 22/10/2013 15:12:21:
ah... nu wel... heb nog even de foutafhandeling gedaan, wat ik was vergeten, bleek er een haakje verkeerd te staan.
Thanks voor jullie hulp!!
Ger van Steenderen op 22/10/2013 14:53:17:
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'Je kunt ook gewoon INSERT door REPLACE vervangen, dat heeft hetzelfde effect.
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?
Erwin H op 22/10/2013 15:48:24:
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??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?
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.
Toevoeging op 22/10/2013 15:55:05:
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 :-)
Toevoeging op 22/10/2013 16:02:25:
Als antwoord op je opmerking over REPLACE
Gewijzigd op 22/10/2013 16:02:57 door Ger van Steenderen