Clancy wrote:
For some time I have been working on a text based database, in which each entry 
one or more lines of data, with the various fields delimited by semicolons, e.g.

a;Federation Square;;;
p;9663 9900;;;9663 9901;;;

All was going well but recently I decided to allocate every entry a unique 
and, in what with hindsight was clearly misguided enthusiasm, decided that each 
should be a four digit base 36 number (the 20GM in the first line). This did 
not cause any
problems until yesterday, when I tried to load a name beginning with 'R', and 
got the
first name on the list. When I investigated I found that I was searching the 
containing the data using:

        if ($ident == $data[$i]['group']['ident'])  { ......

I then found that I was searching for 20E2, but was getting a match on 2000. I tried 'if ((string) $ident == (string) $data[$i]['group']['ident'])', but this still matched. However 'if($ident === ' worked, as did
        'if (!strcmp($ident, $data[$i])) {...'.

After puzzling about this for a long time, I realised that the comparison 
process must
have been treating the second value as a floating point number, and converting 
it to
integer, or vice versa.  (In floating point notation 20E2 = 20*10^^2 = 2000).  
I had
thought that the (string) override meant to treat the actual value as a string, 
but in
this case it must be converting the (assumed) actual value to a string, and 
then comparing
the results.

This surprised me considerably as it is clear from the results I achieve in 
circumstances that the data is actually stored as a raw string.

$data is a variable format array, and when the original data is read each line 
is exploded
into a term of the data array: $data[][] = explode(';',$line[$i]);.  If I print 
the value
of the ident (or any other field) it is always shown as the original string, 
and when I
save an updated version of the data, each term of the data array is imploded 
into a line
of the data file in its original format. However if this value were actually 
converted to
a floating point number when it was entered I would have to specify a format 
before I
could write it out again, and as 20E2 is a rather  non-standard format it is 
most unlikely
that it would come out as this unaided.
Is there any way to specify that each field is always to be treated as a string 
when I
originally explode the input file into the data array?  For someone brought up 
on rigidly
defined data types dynamic typing can be very confusing!

first you need to know what you're working with

var_dump( array( $ident , $data[$i] ); and check the output for types, then do at various decent locations higher up the script till you find what's causing the problem.

or post the source code in questions (however large)

PHP General Mailing List (
To unsubscribe, visit:

Reply via email to