[PHP - MSSQL] Vreemde spatie-waarde na invoer lege variabele

Pagina: 1
Acties:
  • 102 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Gegevens:
Ik heb een webserver draaiend op Windows 2003 SBS, IIS 6 met PHP en MSSQL 2000.
Voorheen draaide ik mijn betreffende webapplicatie op Windows XP met Apache en MySQL en PHP.
Mijn webapplicatie draait nu na een aantal aanpassingen op de nieuwe server.

Het probleem is:
Als ik een lege variabele invoer (een tekstveld waar niks wordt ingevoerd en wordt verstuurd naar de database), dan schrijft PHP iets in de database weg, dat anders is dan "".
Ook is het geen NULL (Ik heb bij mijn database velden ingevulde dat ze geen NULL mogen zijn (NOT NULL) en dat hij als standaardwaarde ('') in moet vullen).
Ook is het niet de normale spatie " ".
Ook niet de html-spatie "&nbsp"; .

Mijn vraag aan jullie:
Wat is het dan wel?

Ik heb dit alles getest met if-statements:
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
27
28
29
30
31
32
// Ik heb uiteraard hiervoor wat functies uitgevoerd 
// om het veld email uit de database te halen
// De variabele is een value, gehaald uit een niet ingevuld tekstvak

$legevariabele = $list->email;
if($legevariabele <> "null") { 
      echo "Damn, wat staat er dan?";
} 
else { 
      echo "Jeej, ik heb dat gekke teken gevonden!"; 
}

if($legevariabele <> "") { 
      echo "Damn, wat staat er dan?";
} 
else { 
      echo "Jeej, ik heb dat gekke teken gevonden!"; 
}

if($legevariabele <> " ") { 
      echo "Damn, wat staat er dan?";
} 
else { 
      echo "Jeej, ik heb dat gekke teken gevonden!"; 
}

if($legevariabele <> "&nbsp;") { 
      echo "Damn, wat staat er dan?";
} 
else { 
      echo "Jeej, ik heb dat gekke teken gevonden!"; 
}

[ Voor 9% gewijzigd door Verwijderd op 05-10-2005 13:44 ]


Acties:
  • 0 Henk 'm!

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Wat voor datatype is het betreffende veld?

Oops! Google Chrome could not find www.rijks%20museum.nl


Acties:
  • 0 Henk 'm!

  • Equator
  • Registratie: April 2001
  • Laatst online: 09-09 15:29

Equator

Crew Council

#whisky #barista

De default waarde is '' (niets dus) maar hij mag niet NULL zijn.
NULL is niets, en de string '' is ook niets.. Conflicteerd dat niet :?

Probeer eens een default waarde '-' Dus alleen een dash of underscore.

Acties:
  • 0 Henk 'm!

  • sjroorda
  • Registratie: December 2001
  • Laatst online: 20:03
Doe eens iets als
PHP:
1
2
3
$legevariabele = $list->email;
for ($i = 0; $i < strlen($legevariabele); $i++)
  echo ord($legevariabele).'<br>';


Dan krijg je precies wat erin staat. Eventueel kan je ook eerst even een echo strlen($legevariabele) doen, kijken wat die teruggeeft.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Het is een varchar(50) met een DEFAULT('')

Acties:
  • 0 Henk 'm!

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
CyberJ schreef op woensdag 05 oktober 2005 @ 13:51:

NULL is niets, en de string '' is ook niets.. Conflicteerd dat niet :?
Er zit een groot verschil tussen een lege string en NULL. Je mag die 2 niet door elkaar halen. Immers "" == "" maar NULL != NULL.

Waarom gebruikt de TS ook "" als default waarde. Als je niet weet wat erin moet, waarom dan niet NULL. Die is daarvoor bedoeld.

[ Voor 22% gewijzigd door P_de_B op 05-10-2005 13:55 ]

Oops! Google Chrome could not find www.rijks%20museum.nl


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
sjroorda schreef op woensdag 05 oktober 2005 @ 13:51:
Doe eens iets als
PHP:
1
2
3
$legevariabele = $list->email;
for ($i = 0; $i < strlen($legevariabele); $i++)
  echo ord($legevariabele).'<br>';


Dan krijg je precies wat erin staat. Eventueel kan je ook eerst even een echo strlen($legevariabele) doen, kijken wat die teruggeeft.
Ik krijg waarde 32, iemand enig idee wel teken dit is?

[ Voor 8% gewijzigd door Verwijderd op 05-10-2005 13:55 ]


Acties:
  • 0 Henk 'm!

  • sjroorda
  • Registratie: December 2001
  • Laatst online: 20:03
Dat is gewoon een spatie / een gewone spatie. Waarom je eerste check dan iets anders geeft weet ik niet, dat is een beetje vreemd...

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
sjroorda schreef op woensdag 05 oktober 2005 @ 13:55:
[...]

Dat is gewoon een spatie / een gewone spatie. Waarom je eerste check dan iets anders geeft weet ik niet, dat is een beetje vreemd...
Toch een beetje raar. Ik voeg "" aan de database toe en hij vult " " in... Best vervelend voor mijn applicatie.

Acties:
  • 0 Henk 'm!

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Verwijderd schreef op woensdag 05 oktober 2005 @ 13:56:
[...]


Toch een beetje raar. Ik voeg "" aan de database toe en hij vult " " in... Best vervelend voor mijn applicatie.
Waat je zeker dat je PHP script dat niet doet? SQL Server voegt echt geen " " in als jij als default waarde "" hebt staan.

Oops! Google Chrome could not find www.rijks%20museum.nl


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
P_de_B schreef op woensdag 05 oktober 2005 @ 13:57:
[...]


Waat je zeker dat je PHP script dat niet doet? SQL Server voegt echt geen " " in als jij als default waarde "" hebt staan.
Ik heb exact hetzelfde script gebruikt als die ik gebruikte bij MySQL. Bij MySQL vulde hij wel netjes "" in en haalde hij dat ook op. Ik zal de scripts nog even goed doorspitten voor de zekerheid... Hij doet het nu trouwens wel als ik de gewone spatie ingeef in de if-statement (" "). Ben dus in ieder geval een heel stuk verder geholpen. Echter blijf ik het vreemd vinden dat hij een spatie teruggeeft ipv niks. In de Enterprice manager geeft hij trouwens geen spatie aan. Dat zou dus betekenen dat het óf aan PHP moet liggen óf aan mijn script, die dus anders werkt met MSSQL dan met MySQL. Het laatste lijkt mij het meest voor de hand liggend uiteraard.

[ Voor 37% gewijzigd door Verwijderd op 05-10-2005 14:07 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben er denk ik al achter wat het eerste probleem bij mij was: een header probleem.
Het bestand die php maakte wordt ergens gecached op mijn pc, zodat er als er geen verandering in de door-php-gegenereerd-html-file optreedt, het html-bestand niet wordt veranderd.

Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 18-09 16:28

Bosmonster

*zucht*

NOT NULL is in feite alleen voor keys. Alle 'normale' velden kun je beter op NULL laten staan.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Bosmonster schreef op woensdag 05 oktober 2005 @ 14:41:
NOT NULL is in feite alleen voor keys. Alle 'normale' velden kun je beter op NULL laten staan.
Wat geeft mij dat dan als extra voordeel?

Acties:
  • 0 Henk 'm!

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Verwijderd schreef op woensdag 05 oktober 2005 @ 14:48:
[...]

Wat geeft mij dat dan als extra voordeel?
NULL staat voor 'onbekend' of niet relevant. En dat is het uiteindelijk ook, het emailadres is geen lege string, het is gewoon niet bekend.

Oops! Google Chrome could not find www.rijks%20museum.nl


Acties:
  • 0 Henk 'm!

  • ShadowLord
  • Registratie: Juli 2000
  • Laatst online: 18-09 22:12
Dit si een bekend MSSQL - PHP probleem. Als je de standaard drivers van PHP gebruikt zullen lege strings altijd terug gegeven worden als een spatie. Waar dit precies vandaan komt lijkt eiegenlijk niemend te weten (zelf vermoet ik dat het een bug is in de mssql driver van Microsoft die PHP gebruikt. Deze driver is al aardig gedateerd.)

Niemand bij PHP lijkt wat om deze bug te geven (zoek maar eens in de bugtrack van PHP, het issue wordt door de devs gewoon afgekapt met botte replies die neerkomen op 'het is geen bug').

Je kan dit probleem op 3 manieren verhelpen:
1) Gebruik MySQL, deze werkt toch al een stuk beter met PHP samen en de aansturing hiervan door PHP is veel beter ontwikkeld.
2) Als MySQL geen optie is, trim dan alle strings die je terug krijgt van de DB. Ook zou je kunnen kijken of je een enkele spatie terug krijgt en in dat geval de string leegmaken. Nadeel hiervan is dat je de data aanpast en je nooit zeker kan weten of die spatie nu de bedoeling wel of niet was. In de meeste gevallen is dit geen issue, maar soms dus wel. Maar dat ligt helemaal aan je applicatie. Deze oplossing gebruik ik zelf trouwens (trim() bij strings) voor een project waar ik aan werk.
3) Als data 'manipulatie' echt niet kan en MSSQL is het enige alternatief, dan zou je een andere database aansturing kunnen gebruiken, zoals AdoDB (er zijn nog een paar anderen trouwens).

You see things; and you say, "Why?" But I dream things that never were; and I say, "Why not?"


Acties:
  • 0 Henk 'm!

Verwijderd

ShadowLord schreef op woensdag 05 oktober 2005 @ 17:01:
Dit si een bekend MSSQL - PHP probleem. Als je de standaard drivers van PHP gebruikt zullen lege strings altijd terug gegeven worden als een spatie. Waar dit precies vandaan komt lijkt eiegenlijk niemend te weten (zelf vermoet ik dat het een bug is in de mssql driver van Microsoft die PHP gebruikt. Deze driver is al aardig gedateerd.)
[...]
offtopic:
Het zou wel behoorlijk bizar zijn om bewust een verouderde driver te gebruiken. Als dit werkelijk zo is, maken de PHP developers wel gebruik van een taktiek waar MS zelf al jaren van beschuldigd is.

Acties:
  • 0 Henk 'm!

  • ShadowLord
  • Registratie: Juli 2000
  • Laatst online: 18-09 22:12
Het is wel zo :)
Dit komt volgens mij trouwnes niet omdat PHP niet wil, maar omdat het niet mogelijk is om van nieuwere drivers gebruik te maken. Of dit een technische beperking on een licentie beperking is weet zo even niet.

You see things; and you say, "Why?" But I dream things that never were; and I say, "Why not?"


Acties:
  • 0 Henk 'm!

  • Not Pingu
  • Registratie: November 2001
  • Laatst online: 05-08 09:21

Not Pingu

Dumbass ex machina

Dit gedrag van PHP is misschien te verklaren door een bug die optreedt als je MySQL gebruikt in een Windows-omgeving. Een bekende bug hierbij is dat MySQL vastloopt als je een lege string (dus geen null) insert in een varchar veld. Wellicht is dit gedrag in PHP zo gedaan om te voorkomen dat de MySQL bug ooit optreedt en wordt dit ook toegepast op andere databases?

Certified smart block developer op de agile darkchain stack. PM voor info.

Pagina: 1