Skip to Content.
Sympa Menu

freetds - Re: Hungry PHP

freetds AT lists.ibiblio.org

Subject: FreeTDS Development Group

List archive

Chronological Thread  
  • From: Brian Bruns <camber AT umcc.ais.org>
  • To: TDS Development Group <freetds AT franklin.oit.unc.edu>
  • Subject: Re: Hungry PHP
  • Date: Sun, 12 Sep 1999 17:59:18 -0400 (EDT)



Ok, looking at things, I may not need to be so drastic. PHP does something
like this:

res_length = dbdatlen(dbproc, offset);
dbconvert(NULL,coltype(offset),dbdata(sybase_ptr->link,offset),
res_length,SYBCHAR,res_buf,-1);

So it should indeed null terminate them (the -1 means to null term the
result), however dbdatlen() returns an incorrect value. I fixed that and
also fixed it for the NULL case as well. I'm going to try all the test
cases tommorow on a real dblib machine and then I think I should be able
to fix the other cases. But try the latest CVS and let me know.

Brian

On Sat, 11 Sep 1999, Paul Schaap wrote:

> Brian,
>
> On 09/11/99, "Brian Bruns <camber AT umcc.ais.org>" wrote:
> > Netscape browser by chance? Have you tried it under IE or lynx by chance
>
> I'm embarassed to say I dreamt I should have tried those last night, please
> forgive me ! Unfortunately my machine at home is largely a M$ free zone,
> and my Linux side will dial into everything but work so I'll double check
> tomorrow at work.
>
> > and did it work there? If so check the PHP FAQ, you have a null trailing
> > 'Schaap' after which netscape kindly discards everthing (until a newline?)
>
> This is kinda what I thought may be going on !
> More and more I'm finding Netscape less appealing for many such reasons
> ...
>
> > Anyway, I'm going to guess the real problem is varchar handling in
> > FreeTDS. Sybase's libs track the length of varchars in a structure
> > something like:
> >
> > struct _cs_varchar {
> > CS_CHAR array[CS_MAX_STRING];
> > CS_INT length;
> > } CS_VARCHAR
> >
> > and then the dblib structure is #define'd to this
> >
> > (This is off the top of my head, I don't remember exactly what the ctlib
> > structure looks like, but close enough for this discussion). FreeTDS
> > doesn't track the length as such, it just always null terms. So there are
> > (under dblib) two basic ways to bind a string NTBSTRINGBIND (null term'd)
> > and STRINGBIND. I believe what is happening is one of the cases is
> > putting a null where it is not supposed to. It basically doesn't
> > have enough information to do the right thing.
> >
> > So the short story is probably varchar has to be fixed, and that's going
> > to break alot of things. PHP probably stopped working because of changes
> > that were put to fix DBD::Sybase's behaviour.
>
> Ouch !
>
> >
> > So, anybody mind if I really screw up things for a few days?
>
> What have I started .... :-0
>
> >
> > brian
> >
> > On Sat, 11 Sep 1999, Paul Schaap wrote:
> >
> > > Brian,
> > >
> > > Following on from my previous MS SQL post here is some further details
> > > on
> > > the odd behaviour under php. Please note that under sqsh there is no
> > > problem.
> > >
> > > Here is a phtml
> > > ############################################################################
> > > <HTML>
> > > <HEAD>
> > > <TITLE>freetds kicks butt</TITLE>
> > > </HEAD>
> > > <BODY>
> > > <CENTER><H1><U>Hungry PHP</U></H1></CENTER>
> > > <?
> > > $cnn = sybase_pconnect("Your MS SQL Server","Login","Password")
> > > or die("Connect");
> > > $db = sybase_select_db("A Database",$cnn)
> > > or die("Select");
> > >
> > > // Surname is a VARCHAR
> > > $sql = "SELECT ID, Surname, ID
> > > FROM Customer
> > > WHERE ID = 10000696";
> > > echo "$sql<BR>";
> > > $qry = sybase_query($sql);
> > > if($qry){
> > > list($i1,$i2,$i3) = sybase_fetch_row($qry);
> > > echo "$i1 $i2 eat me $i3<BR>\n";
> > > echo "$i1 $i2 <B> eat me $i3</B><BR>\n";
> > > }
> > > sybase_free_result($qry);
> > >
> > > // WITH A CONVERT
> > > $sql = "SELECT ID, CONVERT(CHAR(20),Surname), ID
> > > FROM Customer
> > > WHERE ID = 10000696";
> > > echo "$sql<BR>";
> > > $qry = sybase_query($sql);
> > > if($qry){
> > > list($i1,$i2,$i3) = sybase_fetch_row($qry);
> > > echo "$i1 $i2 eat me $i3<BR>\n";
> > > echo "$i1 $i2 <B> eat me $i3</B><BR>\n";
> > > }
> > > sybase_free_result($qry);
> > > ?>
> > > </BODY>
> > > </HTML>
> > > ############################################################################
> > >
> > > Heres a possible schema, I'm not 100% on the MS SQL DB syntax ...
> > > ############################################################################
> > > CREATE TABLE Customer (
> > > ID INTEGER,
> > > Surname VARCHAR(255)
> > > );
> > > ############################################################################
> > >
> > > Heres the output on the Browser
> > > ############################################################################
> > > Hungry PHP
> > >
> > > SELECT ID, Surname, ID FROM Customer WHERE ID = 10000696
> > > 10000696 Schaap
> > > 10000696 Schaap eat me 10000696
> > > SELECT ID, CONVERT(CHAR(20),Surname), ID FROM Customer WHERE ID =
> > > 10000696
> > > 10000696 Schaap eat me 10000696
> > > 10000696 Schaap eat me 10000696
> > > ############################################################################
> > > notice the first 'eat me 10000696' on the first query just doesnt turn
> > > up.
> > > But the second one does turn up ? The tag entered on the second one
> > > somehow
> > > saves the data from dissappearing. A view source on the page also doesnt
> > > reveal the missing info hidden in a tag or anything, it just vanished !
> > >
> > > In the second query when I CONVERT all is well and as expected.
> > >
> > > REGARDS
> > > Paul
> > >
>
> REGARDS
> Paul
>
> ---
> You are currently subscribed to freetds as: camber AT ais.org
> To unsubscribe, forward this message to $subst('Email.Unsub')
>
>





Archive powered by MHonArc 2.6.24.

Top of Page