[mysql/php?] lijkt een ongewenste TRIM op de output te doen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
Vanuit php doe ik een query op een mysql database; van de output wil ik een filetje maken die een vaste opmaak moet hebben.
Nu moeten daardoor sommige waarden opgevuld worden spaties. Bijv. de achternaam. Die mag max 30 tekens zijn en moet worden opgevuld met spaties indien nodig.

Dit doe ik in mysql zo:
MySQL:
1
RPAD(C.Lastname, 30, ' ') AS LastName


De output daarvan is echter gewoon de achternaam, zonder spaties erachter. Als ik voor ' ' iets anders doe (bijv. '& nbsp;') dan blijkt ie het wel correct te doen.

Ik kan het natuurlijk wel oplossen door er inderdaad & nbsp; van te maken en dan in php de boel weer met een str_replace omzetten naar normale spaties, maar dat wil ik eigenlijk niet. Ik wil dat ie gewoon die spaties er achter zet :)
Iemand enig idee hoe dit komt en of ik het binnen mysql op een andere manier kan oplossen?

(btw, & nbsp; moet eigenlijk aan elkaar zijn, dat weet ik)

[ Voor 23% gewijzigd door marty op 07-06-2004 17:31 ]


Acties:
  • 0 Henk 'm!

Verwijderd

De MySQL manual rept er niet over dat je geen platte spatie mag gebruiken. Kan het ook niet aan een ander stuk code liggen? Zou je wat meer code kunnen posten, dit zou namelijk gewoon goed moeten werken.

/ Edit

ik bedenk me nu: echo je niet platweg de string? Zodat je in de html iets krijgt als:

code:
1
achternaam+++++++++++++++++++De rest van de tekst


De + tekens zijn dan de spaties. Een browser negeert namelijk meerdere spaties. Meerdere malen   negeert hij echter niet.

[ Voor 43% gewijzigd door Verwijderd op 07-06-2004 17:37 ]


Acties:
  • 0 Henk 'm!

  • Cavalera125
  • Registratie: December 2003
  • Laatst online: 11:15
Kun je ipv een spatie niet '\s' gebruiken?

Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

(jarig!)
Hoe bepaal je dat het 'niet werkt'?
Als je in de html-rendering kijkt, zie je inderdaad geen verschil tussen 1 of 10 spaties... In de html-broncode wel.

Acties:
  • 0 Henk 'm!

  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
ACM schreef op 07 juni 2004 @ 17:45:
Hoe bepaal je dat het 'niet werkt'?
Als je in de html-rendering kijkt, zie je inderdaad geen verschil tussen 1 of 10 spaties... In de html-broncode wel.
Zoals ik al zei schrijf ik het weg naar een file. Daar staan simpel weg de spaties niet in. Ben toen gaan klooien en heb de output voor het gemak even naar m'n browser gestuurd en ben (uiteraard) wel zo slim geweest in de broncode te kijken :)

Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

(jarig!)
Schrijf er dan eens direct nadat je de variabele hebt in php de boel weg met wat markeringen, zoals bijvoorbeeld fwrite($fp, "[" . $row['tekst'] . "]")

Acties:
  • 0 Henk 'm!

  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
Het blijkt een bug in mysql te zijn. En echt een rare.

Deze query werkt:
MySQL:
1
2
3
4
5
6
7
8
9
        SELECT
            RPAD(C.Lastname, 30, ' ')
        FROM Booking AS B, FlightDetails AS FD
            LEFT JOIN Bill ON Bill.BookingID=B.BookingID
            LEFT JOIN Clients AS C ON C.ClientID=Bill.ClientID
        WHERE
            B.FlightDetailsID = FD.FlightDetailsID
        AND FD.DateTo >= NOW()
        ORDER BY B.BookingID


en deze geeft het probleem zoals ik in m'n openingspost beschreef:
MySQL:
1
2
3
4
5
6
7
8
9
10
        SELECT
            RPAD(C.Lastname, 30, ' ')
        FROM Booking AS B, FlightDetails AS FD, Destinations AS D
            LEFT JOIN Bill ON Bill.BookingID=B.BookingID
            LEFT JOIN Clients AS C ON C.ClientID=Bill.ClientID
        WHERE
            B.FlightDetailsID = FD.FlightDetailsID AND
            B.DestinationID = D.DestinationID
        AND FD.DateTo >= NOW()
        ORDER BY B.BookingID


Het verschil is dat er bij die laatste nog een extra tabel is gejoined op het geheel. Nader onderzoek leert dat het niet uitmaakt welke tabel: iedere extra tabel veroorzaakt de bug :? :?
schiet mij maar lek....

Acties:
  • 0 Henk 'm!

Verwijderd

Als je een bug vermoedt is het misschien handig deze aan te melden bij MySQL. Je kunt ook vooraf de boel bespreken op de MySQL mailing lijst http://lists.mysql.com/
Wat men daar wel nodig heeft is:
- OS gegevens en versie gegevens MySQL
- query
- zo simpel mogelijke tabelstructuur
- voorbeeld set data
(de laatste twee zo simpel mogelijk, waarbij het probleem nog steeds optreedt)
Een behoorlijk aantal (senior) developers van MySQL zitten ook op die lijst, plus talloze ervaren gebruikers. De kans is groot dat of het probleem wordt gevonden, of als bug wordt opgenomen om in komende versies gefixt te worden.

Een losse query als hierboven is erg lastig verder te beoordelen...

Acties:
  • 0 Henk 'm!

  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
Heb ik gister al gedaan:
http://bugs.mysql.com/bug.php?id=4048
:)

ik was ook wel van plan hier te posten als ze daar tot een conclusie komen, maar die matthew is er nog mee bezig.

dus wordt vervolgd

Acties:
  • 0 Henk 'm!

Verwijderd

Waarom gebruik je niet gewoon de Tab delimiter?

\t is ook een goede, en je hoeft niets op te vullen.

nog eens stuk netter ook.

Acties:
  • 0 Henk 'm!

  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
Ik bepaal zelf het formaat van de output niet. Het zijn transferlijsten die Transavia persee in dit formaat wil hebben

Acties:
  • 0 Henk 'm!

  • slm
  • Registratie: Januari 2003
  • Laatst online: 12-11-2023

slm

vreemde bug..

iig zou je kunnen proberen of het volgende werkt:
code:
1
SELECT LEFT(CONCAT(C.Lastname, '                              '),30) etc


maar beter zou zijn het BUITEN mysql op te lossen (alhoewel je al aangaf dat niet te willen) door PHP de padding te laten doen:
code:
1
str_pad($row["veld"], 30);

To study and not think is a waste. To think and not study is dangerous.


Acties:
  • 0 Henk 'm!

  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
slm schreef op 09 juni 2004 @ 16:17:
vreemde bug..

iig zou je kunnen proberen of het volgende werkt:
code:
1
SELECT LEFT(CONCAT(C.Lastname, '                              '),30) etc
Grappig, dit vertoont dezelfde bugverschijnselen!
maar beter zou zijn het BUITEN mysql op te lossen (alhoewel je al aangaf dat niet te willen) door PHP de padding te laten doen:
code:
1
str_pad($row["veld"], 30);
Waarom vind je dat beter??

Acties:
  • 0 Henk 'm!

  • slm
  • Registratie: Januari 2003
  • Laatst online: 12-11-2023

slm

Waarom? Om de database te laten databasen en de scripts te laten scripten, m.a.w. de betreffende applicatie dat laten doen waar het goed in is, dus de database de gegevens opzoeken en de scripting de bewerkingen daarop te laten doen.

To study and not think is a waste. To think and not study is dangerous.


Acties:
  • 0 Henk 'm!

  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
Dat ben ik niet met je eens.
Het is ten eerste vaak veel sneller een bewerking door je database uit te laten voeren dan in php alles in variabelen te mieteren en daarmee te klooien
Maar zelfs als dat niet zo was (en het verschil gering, wat het in dit geval ongetwijfeld is), dan nog zou ik het liever door m'n database laten doen.
- Ik kan nu namelijk in php gewoon de variabele $row['veldnaam'] aan spreken en dat zegt mij veel meer dan een variabele waarvan ik moet gaan opzoeken waar die z'n waarde heeft gekregen.
- Ik kan deze query zo ergens anders plakken als ik dit nog eens nodig heb zonder dat ik ook stukjes php-code moet gaan toevoegen.
Maw, het is - imo - een stuk overzichtelijker.

Maar ieder z'n eigen manier van werken natuurlijk :)

edit:
btw, ook je argument
Om de database te laten databasen en de scripts te laten scripten,
gaat niet op. Die functies zitten niets voor niets in mysql. Je script ook niet echt naar mijn mening (wat toch al een vage term is in deze context), je laat gewoon de data in een bepaald formaat uit je database rollen. En volgens mij is dat o.a. waarom je queries kunt doen.

[ Voor 22% gewijzigd door marty op 10-06-2004 14:28 ]


Acties:
  • 0 Henk 'm!

  • slm
  • Registratie: Januari 2003
  • Laatst online: 12-11-2023

slm

Je mag het uiteraard met me oneens zijn :) maar je vroeg waarom ik dit vond.

Dat het "vaak" sneller is, is niet juist. De snelheid zal vaak vrijwel niets of zeer weinig uitmaken. Alhoewel het wel "soms" of in bepaalde gevallen sneller is. Met name als het resultaat minder data behapt is jouw methode sneller volgens mij.

Die snelheid is dan ook geen reden om dit soort string manipulaties uit te voeren in PHP in tegenstelling tot in MySQL. Het is (en dat geef je later zelf al aan) eerder een (persoonlijke) manier van denken/werken. En die stukjes code toevoegen of wijzigen in een ander script zul je meestal toch wel moeten doen.

Dat die functies niet voor niets in MySQL zitten heeft daar verder vrij weinig mee te maken. Je kan de database ook zonder server side scripting of API gebruiken en dan heb je die functies wel degelijk nodig.

To study and not think is a waste. To think and not study is dangerous.


Acties:
  • 0 Henk 'm!

  • pistole
  • Registratie: Juli 2000
  • Laatst online: 16:08

pistole

Frutter

wat voor php + mysql versie draai je?
Want als ik iets vergelijkbaars doe (php-4.2.2-17.2, php-mysql-4.2.2-17.2, mysql-server-3.23.58-1.9, mysql-3.23.58-1.9) dan werkt het prima:

PHP:
1
2
3
4
$row_id=mysql_query("select RPAD('bla', 30, ' ') as bla");
$row=mysql_fetch_row($row_id);
echo "van hier ->".$row[0]."&lt;- tot daar<br>";
echo "<input type=text size=100 value=\"van hier->".$row[0]."<- tot daar\">";

Output:
Afbeeldingslocatie: http://www.kiekeboe.cc/~pistole/phpmysql.png

Ook in de commandline mysql client werkt het prima:
code:
1
2
3
4
5
6
7
8
9
10
11
12
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 48 to server version: 3.23.58

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> select RPAD('bla', 30, ' ') as bla;
+--------------------------------+
| bla                            |
+--------------------------------+
| bla                            |
+--------------------------------+
1 row in set (0.00 sec)


* pistole moet beter leren lezen, het probleem treedt alleen op bij het joinen over meer dan 1 tabel

[ Voor 57% gewijzigd door pistole op 11-06-2004 00:16 ]

Ik frut, dus ik epibreer

Pagina: 1