[MySQL] veld geeft 0 ipv NULL

Pagina: 1
Acties:

  • BierPul
  • Registratie: Juni 2001
  • Laatst online: 00:01

BierPul

2 koffie graag

Topicstarter
Ik ben een uitslagen database voor een bingo spel aan het neerzetten.

Ik krijg eens per week een csvtje waarin de uitslagen staan.

De opmaak ziet er als volgt uit.

26,51,74,55,68,,

Het eerste veld is de trekkingsdag de 6 opvolgende plaatsen is voor het maximaal aantal bal nummers wat getrokken kan worden.

Het kan dus zijn dat er die dag 6 ballen getrokken worden maar het kan ook dat er 1 getrokken wordt (in extreme gevallen)

Nu is het nadeel dat bal 0 ook bestaat.

Dus als ik die CSV inlees via de volgde code

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$rijen = file ( 'bestand.csv' );

$maand = 9;
$jaar = 2002;

foreach ( $rijen as $r ) {
    $cells = preg_split( '","', $r );
    $unix_tijd = mktime (0,0,0,$maand, $cells[0], $jaar);
    $dag = date(w, $unix_tijd);  #dag nummer 0 = zondag 6 is zaterdag 



mysql_query("INSERT into tbl_uitslagen (uits_datum, uits_bal1, uits_bal2, uits_bal3, uits_bal4, uits_bal5, uits_bal6) values ('$unix_tijd', '$cells[1]', '$cells[2]', '$cells[3]', '$cells[4]', '$cells[5]', '$cells[6]', '$cells[7]')");
}


Dan krijgen de velden die niet ingevuld waren automatisch nummer 0 in de database, waardoor de applicatie denkt dat bal 0 is getrokken.

Dit gebeurt ondanks dat het een INT veld is met een standaardwaarde NULL en waar NULL is toegestaan.

code:
1
uits_bal1 tinyint(4) default NULL,


Als ik gewoon via MyAdmin een lege insert op een bal veld doe krijg ik wel een NULL waarde in mn veld :(

Nu zou ik het natuurlijk gewoon een varchar veld kunnen maken , echter lijkt dat me een te makkelijke weg }:O

[ Voor 0% gewijzigd door BierPul op 13-09-2002 12:04 . Reden: Tabel verneuken zuigt :P ]

Ja man


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Als je een waarde invult zal mysql ook die waarde erin zetten, ongeacht de default die je opgeeft.

ZELFS als je een lege string oid meegeeft.
Als je de default in wilt laten vullen, laat veld dan weg bij de VALUES in insert (en er ook geen waarde voor opgeven).
En als je NULL wilt, zet dan NULL neer en niet '' :)

  • Scorpion
  • Registratie: April 2000
  • Laatst online: 18-01-2024

Scorpion

not to lame to read BitchX.doc

-> opmerking die nergens op sloeg <- :)

  • RM-rf
  • Registratie: September 2000
  • Laatst online: 21:52

RM-rf

1 2 3 4 5 7 6 8 9

code:
1
2
3
4
5
6
7
8
INSERT into tbl_uitslagen 
   (uits_datum, 
    uits_bal1, uits_bal2, uits_bal3, 
    uits_bal4, uits_bal5, uits_bal6) 
values 
   ($unix_tijd, $cells[1], 
    $cells[2], $cells[3], $cells[4], 
    $cells[5], $cells[6], $cells[7])
dus zonder de enkele quotes om de waardes, is als query waarschijnlijk een stuk beter, een INSERT van waarde '' voor een integer zal waarschijnlijk er parseInt('') van maken en dan op 0 uitkomen.

Ook mogelijk dat de waarde van je variabele $cells[n] al fout is

Intelligente mensen zoeken in tijden van crisis naar oplossingen, Idioten zoeken dan schuldigen


  • BierPul
  • Registratie: Juni 2001
  • Laatst online: 00:01

BierPul

2 koffie graag

Topicstarter
code:
1
('$unix_tijd', '$cells[1]', $cells[2], $cells[3], $cells[4], $cells[5], $cells[6],'NULL')");


Geeft ook een 0 terug :(

Als ik de query afdruk krijg ik dit terug

code:
1
INSERT into tbl_lingo_uitslagen (lingo_uits_datum, lingo_uits_vak, lingo_uits_bal1, lingo_uits_bal2, lingo_uits_bal3, lingo_uits_bal4, lingo_uits_bal5, lingo_uits_bal6) values ('1033336800', 'c', 16, 34, 9, 86, 76,'NULL')

Ja man


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

En als $cells[2] dan niet bestaat RM-rf ? :)
Dan krijg je nu een parse-error van mysql terug...

Zal dus nog een extra check bij moeten dat als ie niet bestaat er NULL wordt ingevoerd.

'NULL' != NULL

(int)'NULL' = 0

Verwijderd

LOST_GUNT schreef op 13 september 2002 @ 12:25:
code:
1
('$unix_tijd', '$cells[1]', $cells[2], $cells[3], $cells[4], $cells[5], $cells[6],'NULL')");


Geeft ook een 0 terug :(

Als ik de query afdruk krijg ik dit terug

code:
1
INSERT into tbl_lingo_uitslagen (lingo_uits_datum, lingo_uits_vak, lingo_uits_bal1, lingo_uits_bal2, lingo_uits_bal3, lingo_uits_bal4, lingo_uits_bal5, lingo_uits_bal6) values ('1033336800', 'c', 16, 34, 9, 86, 76,'NULL')
code:
1
INSERT into tbl_lingo_uitslagen (lingo_uits_datum, lingo_uits_vak, lingo_uits_bal1, lingo_uits_bal2, lingo_uits_bal3, lingo_uits_bal4, lingo_uits_bal5, lingo_uits_bal6) values ('1033336800', 'c', 16, 34, 9, 86, 76,NULL)


:?

  • BierPul
  • Registratie: Juni 2001
  • Laatst online: 00:01

BierPul

2 koffie graag

Topicstarter
Ok die laatste hebben we niet gezien }:O

Ja man


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 28-08 12:00

Janoz

Moderator Devschuur®

!litemod

hmm, misschien is het ook een idee om, waneer je tijd hebt, je nog eens f over je gekozen database model te buigen.......

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Stilgar
  • Registratie: Maart 2002
  • Niet online
Die NULL moet natuurlijk niet tussen quotjes staan, want dan denkt MySQL dat het gewoon een string is. En omdat een string niet echt past in een INT veld, maakt hij er 0 van.

Wat volgens mij wel werkt is het volgende

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?
$rijen = file ( 'bestand.csv' );

$maand = 9;
$jaar = 2002;

foreach ( $rijen as $r ) {
    $cells = preg_split( '","', $r );

    for ($i=0;$i<count($cells);$i++) {
        if (empty($cells[$i])) {
             $cells[$i]="NULL";
         } else {
              $cells[$i]="'".$cells[$i]."'";
         }
    }

    $unix_tijd = mktime (0,0,0,$maand, $cells[0], $jaar);
    $dag = date(w, $unix_tijd);  #dag nummer 0 = zondag 6 is zaterdag



mysql_query("INSERT into tbl_uitslagen (uits_datum, uits_bal1, uits_bal2, uits_bal3, uits_bal4, uits_bal5, uits_bal6) 
values ('$unix_tijd', $cells[1], $cells[2], $cells[3], $cells[4], $cells[5], $cells[6], $cells[7])");
}
?> 


[edit]ff die query doormidden gehakt om leesbaarheid te verhogen

Verwijderd

spuit 11 :O :X :*)
Pagina: 1