Avatar billede johny Nybegynder
09. marts 2008 - 13:25 Der er 13 kommentarer og
1 løsning

Skriver kun 0'er til db'en?!

Hej eksperter,

Jeg forstår simpelthen ikke hvad der er galt med min database, da det er noget der er opstået for ganske nylig. Den skriver simpelthen kun 0'er ind i databasen. Er der nogen der har en idé om hvad det kan skyldes?

Jeg kan lige komme med nogle flere detaljer:
*) Det kan godt lade sig gøre at sætte data ind via phpMyAdmin.
*) Der opstår ingen SQL fejl, men den fylder kun 0'er ind.
*) Hvis jeg forsøger at skrive min sql ud lige inden den bliver eksekveret, så ser den f.eks. sådan her ud:
INSERT INTO emails VALUES ( session = 356, type = 2, mailtext = "'[fjernet fra eksemplet]'", sent = NOW() )
Og ja, det bliver så til en række der ser sådan her ud:
0, 0, 0, 0000-00-00 00:00:00
*) Jeg kan stadig lave updates til databasen, og den selv samme sql som jeg bruger her, virker et andet sted i systemet.

Ja, nogen der har nogen idé om hvad der kan være galt?
Avatar billede erikjacobsen Ekspert
09. marts 2008 - 13:59 #1
sådan har en INSERT da aldrig set ud.  INSERT INTO tabel (felt) VALUES (værdi)
Avatar billede johny Nybegynder
09. marts 2008 - 14:42 #2
Ja? Men hvis du vil indsætte på alle felter, så skal de ikke specificeres ud? Og hvis jeg havde lavet en forkert syntax, ville det da have givet fejl?
Avatar billede showsource Seniormester
09. marts 2008 - 14:52 #3
Hvis feltet er INT bliver der sat 0 ind hvis det ikke er et tal

INSERT INTO emails VALUES (356,2,'[fjernet fra eksemplet]','NOW()')

Så'n skal den vel se ud, når du viser den?
Avatar billede erikjacobsen Ekspert
09. marts 2008 - 15:00 #4
Ja, eller

NSERT INTO emails (session,type,mailtext,sent) VALUES (356,2,'[fjernet fra eksemplet]','NOW()')

eller (kun i MySql)

INSERT INTO emails SET session = 356, type = 2, mailtext = "'[fjernet fra eksemplet]'", sent = NOW()

Din udgave, der indsætter 0-er, er formelt korrekt. Du indsætter en masse gang af "false".

Og det er simpelthen ikke korrekt at "den selv samme sql som jeg bruger her, virker et andet sted i systemet"
Avatar billede johny Nybegynder
09. marts 2008 - 15:30 #5
Nej, det prøvede jeg, det virkede ikke. Men nu fandt jeg selv fejlen. Der er var forsvundet et " tegn. Jeg aner ikke hvordan det er sket, den må have været der før, for den har virket upåklageligt over 100 gange.

@erikjacobsen: beklager, men det er altså korrekt, for med tilføjelsen af det manglede " så virker det korrekt igen.

Men det undrer mig så hvorfor det ikke har gevet en syntax fejl og bare har skrevet 0'er ind i db'en istedet?
Avatar billede johny Nybegynder
09. marts 2008 - 15:31 #6
For en god ordens skyld, så er her PHP koden jeg rettede i. Jeg har lige tilføjet det forreste " tegn i 3. sidste linje så det virker igen.

      $sql = '
        INSERT INTO
          emails
        VALUES (
          '. $this->session .',
          '. $this->mail_type .',
          "'. $res->quote_smart($this->mail_text) .'",
          NOW()
        )'

Tak for forsøget ellers. :)
Avatar billede erikjacobsen Ekspert
09. marts 2008 - 15:48 #7
Ja, den du viser her til sidst er korrekt. Men det er jo heller ikke den SQL-sætning du viser i dit spørgsmål.
Avatar billede johny Nybegynder
09. marts 2008 - 15:52 #8
Jo det er det nu. Det er bare efter de forskellige værdier er sandt ind. Det var et echo fra $sql variablen jeg viste i starten..
Avatar billede erikjacobsen Ekspert
09. marts 2008 - 15:56 #9
Jamen, nej. Den SQL-sætning du viser i spørgsmålet kan ikke andet end sætte 0-er (og sommetider 1-er) ind. Det er ikke måden at indsætte værdier i felter i en tabel - med mindre de skal være 0, og så ville der nok være en bedre måde at gøre lige det på ;)
Avatar billede thesurfer Nybegynder
09. marts 2008 - 17:34 #10
Avatar billede johny Nybegynder
09. marts 2008 - 18:58 #11
Øv, jeg ved ikke lige hvad det er med Opera, men den skriver kun min kommentar ind hver anden gang eller noget i den stil.. :-/ Så jeg prøver lige igen.

@erikjacobsen: Det har du da ret i, det går rigtig godt for mig med at se mig blind på ting lige nu. Jeg testede med din løsning, og det virkede ikke, så ville jeg gå tilbage til min gamle løsning, og så rette det med " tegnet der manglede, men det må jeg åbenbart ikke have gjort. Så ja, de to rettelser tilsammen fik det til at virke.

Hvordan koden så er blevet så forkert det fatter eg ikke, for jeg har skrevet over 100 rækker ind i db'en med den metode som det her er fra, og jeg plejer at følge "don't fix something that ain't broken". :)

Men ja, du havde så hjulpet mig med at løse den, så jeg beklager at jeg bare tog points'ne selv, og lavede derfor et nyt spørgsmål som du kunne svare på for at få dine points. thesurfer har så lige forklaret at du ikke skal have points så det går da bare rigtig godt for mig idag.. ;)

Jeg overvejede dog også om du var en af dem der ikke tog mod point, men ville ikke spørge, da det at sige "du kan få point hvis du vil have nogen" implicit siger at jeg ikke vil af med dem, og det ville jeg jo nødig have det til at lyde sådan.. ^^

Men mange tak for hjælpen i hvert fald!

Lige en follow up på fejlen:
Jeg forstår stadig ikke hvorfor det ikke gav en syntax fejl. For det første vidste jeg ikke at man kunne bede MySQL om at sammenligne to ting og indskrive resultatet, og kan heller ikke se grunden til det, når man lige så godt kan gøre det på laget ovenover (i det her tilfælde i PHP); men ok, det er så fedt nok at den metode er her, men hvorfor det så virker med et DateTime felt, det fatter jeg ikke. ^^

Altså, hvem kan have brug for at sammenligne et tekstuelt udtryk med et klokkeslæts tekstuelle værdi hvorefter at skrive det ind i DateTime tabellen som en række 0'er? (Hvad ville der foriøvrigt ske hvis resultatet havde været 1?)
Avatar billede erikjacobsen Ekspert
09. marts 2008 - 19:15 #12
Jeg samler slet ikke på point, tak.

Om det virker eller ikke i Opera er nok ikke noget med SQL-sætningen.

Om man har brug for at kunne lave en sammenligning på det sted i en SQL-sætning? Næh, det har man nok ikke, men man kan jo skrive et generelt udtryk på det sted, og derfor også en sammenligning.

Og en sammenligning med 0, fx.  session = 0  vil være sandt og indsætte et 1-tal ;)
Avatar billede johny Nybegynder
09. marts 2008 - 19:22 #13
Nej det med at virke, det var at skrive her på eksperten.dk. En gang imellem bliver mit indlæg simpelthen ikke lagt op på siden når jeg trykker på "Send". Var bare derfor der ikke var nogen forklaring her på at jeg havde lavet et nyt spørgsmål til points'ne.

Jeg kan selvfølgelig godt se det med sammenligningen, idet den løser udtrykket før den sætter ind i databasen, men hvad hvis jeg havde forsøgt at sætte et 1-tal ind i DateTime, ville den kunne det? Det var bare mere det, at det generede mig at der ikke kom nogen fejl fra SQL, så jeg ledte et helt forkert sted efter problemet. :)
Avatar billede erikjacobsen Ekspert
09. marts 2008 - 19:28 #14
Ja, hvis du sætter et 1-tal ind i en datetime, så får du et en sjov dato - tæt på det samme som med 0.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester