webForumDet fria alternativet

PDO, decimaler och setlocale skapar problem

PHPur PHP

2 svar · 382 visningar · startad av Troxy

Troxys avatarTroxyMedlem sedan mars 20041 505 inlägg
Frågan#1

Hej,
när jag sätter en svensk locale så fungerar det inte att utföra en simpel SELECT-fråga med PDO som returnerar kolumner med decimaler. Det blir tvärstopp:

CGI Error
The specified CGI application misbehaved by not returning a complete set of HTTP headers.

Här är min testkod:

<?php
setlocale(LC_ALL, 'sve');
$dbHost = new PDO('mssql:host=127.0.0.1;dbname=test', 'test', 'test');
$stmt = $dbHost->query("SELECT (13.37) AS TEST");
$post = $stmt->fetch();
echo $post['TEST'];

Om jag raderar setlocale() så försvinner felet. Själva anropet till setlocale() lyckas eftersom dess returvärde blir "Swedish_Sweden.1252".
Det är bara decimaltal i SQL-frågan som ställer till problem. Om jag ändrar till en varchar, datetime eller integer så uppstår inget fel.
Jag kör PHP 5.2.3 på IIS 6.0, och SQL Server 2000.
Tacksam för hjälp om hur jag kan felsöka detta!

SuPeR_ToBBeMedlem sedan mars 2001185 inlägg
#2

Din locale-sträng är fel, för att få svensk (till skillnad från finländsk) svenska, skriv sv_SE.

Såg nu att du får korrekt värde ändå, men vad händer om du ändrar till sv_SE? Har du installerat localen/finns localen i MSSQL?

http://www.faqs.org/rfcs/rfc1766 skrev:

In the primary language tag:
- All 2-letter tags are interpreted according to ISO standard 639, "Code for the representation of names of languages" [ISO 639].
...
In the first subtag:
- All 2-letter codes are interpreted as ISO 3166 alpha-2 country codes denoting the area in which the language is used.

Troxys avatarTroxyMedlem sedan mars 20041 505 inlägg
#3

Jag följde PHP-manualen där det står såhär:

http://se.php.net/manual/en/function.setlocale.php skrev:

Windows users will find useful information about locale strings at Microsoft's MSDN website. Supported language strings can be found at » http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/html/_crt_language_strings.asp

Hur vet jag om min locale finns i MSSQL? Vad behövs installeras?
Varför påverkas ens PDO av detta?

Nu inser jag dock att jag egentligen bara ska använda setlocale() till att skriva ut dagarnas namn på svenska. Så det räcker nog med LC_TIME, vilket även gör att felet försvinner.

Men varför felar det så fatalt med LC_ALL? :P

124 ms totalt · 3 externa anrop · v20260731065814-full.58439ac5
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
121 ms — hämta tråd, inlägg och bilagor (db)