PHP / SQL updaten leeg veld

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Jan Rever

Jan Rever

22/10/2013 13:20:26
Quote Anchor link
Hey mensen,

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."')


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!
 
PHP hulp

PHP hulp

22/12/2024 22:46:35
 
Kris Peeters

Kris Peeters

22/10/2013 13:37:11
Quote Anchor link
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)
PHP script in nieuw venster Selecteer het PHP script
1
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
    }
  }
}

?>
Gewijzigd op 22/10/2013 13:38:45 door Kris Peeters
 
Jan Rever

Jan Rever

22/10/2013 13:44:33
Quote Anchor link
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.
Gewijzigd op 22/10/2013 13:46:08 door Jan Rever
 
Erwin H

Erwin H

22/10/2013 14:13:23
Quote Anchor link
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):
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
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);
 
Kris Peeters

Kris Peeters

22/10/2013 14:17:15
Quote Anchor link
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.
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

22/10/2013 14:53:17
Quote Anchor link
Je kunt ook gewoon INSERT door REPLACE vervangen, dat heeft hetzelfde effect.
 
Jan Rever

Jan Rever

22/10/2013 15:07:57
Quote Anchor link
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...





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!!
 
John D

John D

22/10/2013 15:40:09
Quote Anchor link
Ger van Steenderen op 22/10/2013 14:53:17:
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'
 
Erwin H

Erwin H

22/10/2013 15:48:24
Quote Anchor link
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?
 
John D

John D

22/10/2013 15:52:17
Quote Anchor link
Erwin H op 22/10/2013 15:48:24:
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??
 
Erwin H

Erwin H

22/10/2013 15:53:38
Quote Anchor link
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.

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 :-)
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

22/10/2013 16:00:08
Quote Anchor link
Inderdaad, dat klopt, je moet er erg voorzichtig mee zijn, en ik gebruik het ook alleen maar als ik gegevens van derden importeer.


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
 



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.