SitePoint Sponsor

User Tag List

Page 2 of 4 FirstFirst 1234 LastLast
Results 26 to 50 of 87
  1. #26
    SitePoint Zealot
    Join Date
    Mar 2002
    Location
    Perth, Australia
    Posts
    164
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    This is an excellent post!

    Great comments on OOP; As someone who only started learning OOP methodologies late last year, I found that it made a lot more sense to me once I understood that even though Objects can be used on their own, their power and flexibility is especially evident and useful when they are used with other objects that together achieve required tasks and goals.

    On the specific topic of DB classes, I have started using PEAR's DB class for my database interactions, and I have found it to be very useful. I am wondering what those of you who have used PEAR DB think of it. What do you like/dislike about it?

    The main reason that I ask this is because OOP is perfect for creating generic libraries that can be re-used over and over again. The PEAR DB class is well documented, and is part of PEAR. Don't get me wrong, I am always down for learning new things, but why re-invent the wheel when that time spent could be invested doing other things? Isn't that a large part of the Open Source Software paradigm?

  2. #27
    SitePoint Evangelist cyngon's Avatar
    Join Date
    Aug 2001
    Location
    Livonia, MI, USA
    Posts
    513
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Quote Originally Posted by peDey
    On the specific topic of DB classes, I have started using PEAR's DB class for my database interactions, and I have found it to be very useful. I am wondering what those of you who have used PEAR DB think of it. What do you like/dislike about it?
    The general consensus around this forum is that PEAR is a very poorly design OOP library. The reasons behind this have been covered at length before, so I'll refer you to Vincent's opinion of the subject (which I believe many of us share):

    http://sitepointforums.com/showthrea...374#post416374

    As an alternative to PEAR, you should consider Eclipse, Vincent's truely object oriented PHP libary. You can find it at:

    http://www.students.cs.uu.nl/people/voostind/eclipse/

    Also, I am working on an OOP database abstractin libarary, and I would like to get some feedback on it's interface. Most of it is based of Java's JDBC. Here are two of my interfaces (I have not finished ResultSet yet):

    PHP Code:
    interface Database {
        public function 
    __construct($name$host$username$password$persist false);
        public function 
    commit();
        public function 
    connect();
        public function 
    begin();
        public function 
    createStatement($sql);
        public function 
    disconnect();
        public function 
    execute($sql);
        public function 
    getAutoCommit();
        public function 
    isConnected();
        public function 
    rollback();
        public function 
    setAutoCommit($autoCommit);
    }

    interface 
    Statement {
        public function 
    __construct($sql$database);
        public function 
    executeQuery();
        public function 
    executeUpdate();
        public function 
    getMaxRows();
        public function 
    setMaxRows($maxRows);
        public function 
    clearParameters();
        public function 
    setString($parameterIndex$x);
        public function 
    setNumber($parameterIndex$x);
        public function 
    setDate($parameterIndex$x);
        public function 
    setNull($parameterIndex);
        public function 
    setTime($parameterIndex$x);
        public function 
    setTimestamp($parameterIndex$x);
        public function 
    setURL($parameterIndex$x);

    I am writing this in PHP 5, and the ability to use real interfaces is very useful. Classes will be defined for different databases that implement these interfaces, for example MysqlDatabase and MysqlStatement. Here is a usage example:

    PHP Code:
    $db = new MysqlDatabase('mydb''localhost''myuser''****');
    $statement $db->createStatement('SELECT * FROM users WHERE name = ?');
    $statement->setString(1'Joe');
    $results $statement->executeQuery();
    // Process MysqlResultSet
    $db->close(); 

  3. #28
    SitePoint Zealot codezilla's Avatar
    Join Date
    Nov 2002
    Location
    upstairs
    Posts
    110
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Quote Originally Posted by Sillysoft
    Im assuming the variables passed to the method are perhaps from a form or some other input way? Why not have the sql statement itself have the variables in it?

    Did you just do that to prepare the variables being passed? I mean what if it was numeric? Would you need to do a is_numeric check first? Or am I way off base? Will re-read to make sure.
    Good questions, I'm glad you asked -- and I'm sorry it took me so long to respond.

    I didn't specify where the variables came from since they could come from anywhere -- but, yes, they could (and often do) come from user input (form post, URL, etc).

    Unfortunately, my example did not illustrate the benefits of NOT placing the variables in the sql statement. This was intentional since it complicates things, but it's definitely worth discussion.

    Take a look at the Statement interface in Cyngon's post. Notice all the set*() methods. The setParameter() method in the MysqlStatement class that I supplied should really be broken up into several set*() methods just like the ones that Cyngon mention. Those set*() methods take care of preparing the variables for database execution so you don't get a SQL error. For example, strings should be escaped and enclosed in quotes, numbers should have only valid number characters (0-9 and '.'), dates should be in a date format that's valid for the database server you're using, etc. This is one of the main benefits of a Statement class. It figures out how to properly handle the various data types so you don't have to. That's why the '?' parameters are so nice -- you only need to worry about placement of data, not formatting the data.

    Here's a better usage example (assuming I had implemented all those set*() methods):
    PHP Code:
    $conn =& new MysqlConnection('localhost',
        
    'my_db',
        
    'my_user',
        
    'my_pass'); 
    $stmt =& $conn->createStatement('
        SELECT model FROM car 
        WHERE make_id = ? AND date >= ? AND date <= ?'
    ); 
    $stmt->setInt(1$_POST['make_id']);
    $stmt->setDate(2$_POST['start_date']);
    $stmt->setDate(3$_POST['end_date']); 
    $rs =& $stmt->execute(); 
    while (
    $rs->next()) 

        echo 
    $rs->getString('model') . '<br>'

    Hopefully this addresses all your questions, Sillysoft.

  4. #29
    SitePoint Zealot codezilla's Avatar
    Join Date
    Nov 2002
    Location
    upstairs
    Posts
    110
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Quote Originally Posted by codezilla
    It may look like my Statement class is used to build a text SQL statement, but it's really only allowing you to pass it a pre-built, parameterized SQL statement. One could argue that your SqlStatement class (assuming I understand it correctly) should be responsible for this kind of thing. I didn't do things that way for the sake of simplicity (among other reasons).
    Quote Originally Posted by Sork
    Can you comment your words, if there isn't any prob of course
    Well, basically, I would almost never use a class to build SQL statements. It's kind of like using a class to build an HTML table. Personally, I'd much rather do it manually. I think a class interface for that sort of thing is too cumbersome and I can do it more efficiently by hand. SQL is it's own language -- by abstracting it away, you lose some of its power.

  5. #30
    SitePoint Zealot codezilla's Avatar
    Join Date
    Nov 2002
    Location
    upstairs
    Posts
    110
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Quote Originally Posted by cyngon
    I am working on an OOP database abstractin libarary, and I would like to get some feedback on it's interface. Most of it is based of Java's JDBC.
    Cyngon, I love it! Although, I'm a bit biased since I recently created a remarkably similar set of classes that wrap the ADOdb library. I tried to model my classes as closely as possibly to the java.sql classes. However, mine is strictly PHP4 -- I won't be doing any PHP5 until I see it supported on a majority of shared hosting accounts.

    One thing, though. Can you explain the benefit of the setURL method()? Maybe I'm not being very imaginative, but wouldn't the setString() method work?

  6. #31
    SitePoint Evangelist cyngon's Avatar
    Join Date
    Aug 2001
    Location
    Livonia, MI, USA
    Posts
    513
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Originally I planned on having setURL exist for easily using URL objects (another class in the library I am slowly working on) as parameters. Upon futher consideration I have since removed this method because it is reduntant. Instead it makes more sense to use:

    PHP Code:
    myStatement.setString(1myUrl.toString()); 
    I realized the set*() methods should match with SQL column types and not classes in my library.

    Anyway, I decided against wrapping an existing database abstraction library because the extra tier of classes doesn't seem to provide any benifit besides making the code for my library easier to write. And also that would add another dependency for this library and I'm trying hard to avoid those right now.

  7. #32
    ********* Member website's Avatar
    Join Date
    Oct 2002
    Location
    Iceland
    Posts
    1,238
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    "a big point of OO, is not the individual objects themselves, but their interactions with other objects"
    Exacly that is what eg I and many other people don't get. I simply think oh, lets make a class that contacts with the db, then I do new Class and turn it into a global variable in my script and use it all the time. As voostind (and others) have proved, that doesn't make my code very 're-usable' which is ofcourse, the whole point.

    Maybe php isn't the best language to learn OOP, maybe I really should do that bridge program for my father in java, that might clear up some stuff, or what do you think?

    I have been coding a bit in java and inserting objects into eg arrays is very good example I think of how objects are useful, but I don't realise how objects would interact, I hope to see a little better how that works when I read the (long) post that codezilla posted, it has given me some headage though (great post btw!)

    One thing I don't get though, what does the & that is everywhere on the variables and the equal signs do?
    - website

  8. #33
    SitePoint Member kmeister's Avatar
    Join Date
    May 2003
    Location
    MI
    Posts
    7
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    The & is used to refer to access a variable by reference.
    from the php manual:
    $bar = &$foo; // Reference $foo via $bar.

  9. #34
    SitePoint Member
    Join Date
    Jun 2003
    Location
    NY
    Posts
    2
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Hi,

    I was reading this thread from the beginning and have a question about the style of coding here. In the beginning of the thread it suggests that we make seperate classes for our connection, statements etc.

    So I'm guessing that we should make these classes into seperate files.

    My question is, what is the best way to include all of these files?

    Should I make 1 file called globals.php which includes all of these mysql class files and then include the globals.php whenever i need to access a database?

    Or should I just include the mysql class files on an as needed basis?

    I'm wondering if there's any difference in overhead.

    tia

  10. #35
    ********* Member website's Avatar
    Join Date
    Oct 2002
    Location
    Iceland
    Posts
    1,238
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    If I were you, I would include the files when needed, not just include every file you might possibley need. And then in the Connection class before you do 'new Statement' you would require_once (_once is very important) the name of the Statement class file, in most cases named Statement.php or Statement.class.php
    - website

  11. #36
    SitePoint Member
    Join Date
    Jun 2003
    Location
    NY
    Posts
    2
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    cool! thanks for the response.

  12. #37
    SitePoint Member
    Join Date
    Jun 2003
    Location
    Vancouver BC
    Posts
    11
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    What should i do if i want to limit the amount of results? or acending order? or stuff like that?

  13. #38
    ********* Member website's Avatar
    Join Date
    Oct 2002
    Location
    Iceland
    Posts
    1,238
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    You would just have write the query with LIMIT and ORDER BY ASC, just the same, don't let the ? confuse you, you don't *have* to use it but it is better.
    - website

  14. #39
    SitePoint Member
    Join Date
    Jun 2003
    Location
    Vancouver BC
    Posts
    11
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Can i overload that function?
    so that, if theres one more param, then it will add LIMIT $parm2 to the query?
    i mean, is this a way of doing stuff the OOP way?

  15. #40
    ********* Member website's Avatar
    Join Date
    Oct 2002
    Location
    Iceland
    Posts
    1,238
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    well, basicly you would do
    PHP Code:
    $connection->createStatment('SELECT col FROM table WHERE column = ? ORDER BY column ASC LIMIT ?, ?'); 
    or you know, something like this, this class doesn't have some ->addLimitClause etc. methods, you just write the query but place ? for every variable that goes in.
    At least this is how I understand this class...
    - website

  16. #41
    Non-Member coo_t2's Avatar
    Join Date
    Feb 2003
    Location
    Dog Street
    Posts
    1,819
    Mentioned
    1 Post(s)
    Tagged
    1 Thread(s)
    I decided to make my own version of codezilla's Mysqlstatement class, since
    I don't think he posted all of his. I think he just posted a stripped down version,
    and I didn't wanna bug him about it so I just decided to expand on it myself.
    I'm currently using it with eclipse.

    I figure you don't need to deal with a limit Clause or anything in the
    MysqlStatement class because you send the sql statement(for the most part)
    that you want it to use. The limit clause stuff could probably be abstracted
    out in a Dao object couldn't it? At least I'm using a Dao object that uses
    the MysqlStatement class to construct its sql for it.


    I haven't ran this code yet so I'm not sure if it works, but I think
    you'll get the general idea anyway.

    I need to add more error checking to it, and probably some other methods.
    But that stuff'll come after I actually start running the code and figure
    what else needs to be added/modified.

    Let me know if you think there's anything about this code that sucks, or if
    there's something I could do to make it better.

    PHP Code:
    <?php

    DEFINE
    ('DE_DB_QUERY_ERROR''DB_QUERY_ERROR');
    DEFINE('DE_FILE_OPERATION_ERROR''FILE_OPERATION_ERROR');
    // DE_ERROR - for general errors or error types that probably won't occur a lot.
    DEFINE('DE_ERROR''DE_ERROR'); 
    DEFINE('DE_PARAMETER_TYPE_ERROR''PARAMETER_TYPE_ERROR');
    DEFINE('DE_MALFORMED_SQL_ERROR''MALFORMED_SQL_ERROR');

    class 
    MysqlStatement 

        var 
    $parameters
        var 
    $sql
        var 
    $preparedSql;

        function 
    MysqlStatement($sql
        { 
            
    $this->parameters = array(); 
            
    $this->sql $sql
        } 
         
        function 
    prepareSql()
        {
            if ( 
    substr_count($this->sql'?') > count($this->parameters) )
            {   
                
    $this->_createErrorObjOnce();

                
    $errorType DE_ERROR;
                
    $errorMsg DE_ERROR.' in method '.
                            
    'MysqlStatement::prepareSql : '.
                            
    'You must provide parameters for all occurences of \'?\' in your sql statement';
                
    $errorArrArg = array('type'=>$errorType'msg'=>$errorMsg);
                
    $this->errorObj->addToErrorStack($errorArrArg);
                return 
    false;
            }

            
    $sql_parts explode('?'$this->sql); 
            
    $sql $sql_parts[0]; 
            for (
    $i 1$max count($sql_parts); $i $max$i++) 
            { 
                
    $this->preparedSql .=  $this->parameters[$i] . $sql_parts[$i]; 
            } 
            return 
    true
        }
         
        function 
    getPreparedSql() 
        {   
            if (
    $this->errorObj->hasErrors())
            {   return 
    false;
            }
            else
            {   return 
    $this->preparedSql;
            }
        } 

        function 
    setString($index$val
        {   
            if (!
    get_magic_quotes_gpc())
            {   
    $val mysql_escape_string($val);
            }
            
    $this->parameters[$index] = "'" $val "'"

            return 
    true;
        }

        function 
    setNumeric($index$val)
        {   
            
    $val trim($val);

            if ( 
    is_numeric($val) )
            {  
                
    $this->parameters[$index] = $val

                return 
    true;
            }
            else
            {   
    $this->_createErrorObjOnce();

                
    $errorType DE_PARAMETER_TYPE_ERROR;
                
    $errorMsg DE_PARAMETER_TYPE_ERROR.' in method '.
                            
    'MysqlStatement::setNumeric : '.
                            
    $val.' is not a numeric value';
                
    $errorArrArg = array('type'=>$errorType'msg'=>$errorMsg);
                
    $this->errorObj->addToErrorStack($errorArrArg);
                return 
    false;
            }

        }

        function 
    hasErrors()
        {   return (isset(
    $this->errorObj) && $this->errorObj->hasErrors() );
        }

        function &
    getErrorObj()
        {   
    $this->_createErrorObjOnce();
            return 
    $this->errorObj;
        }

        function 
    _createErrorObjOnce()
        {   if (!isset(
    $this->errorObj) )
            {   
    $this->errorObj =& new ErrorManager;
            }
        }
    }


    class 
    ErrorManager {

        var 
    $errorStack;

        function 
    ErrorManager()
        {   
    $this->errorStack = array();
        }

        function 
    hasErrors()
        {   return (!empty(
    $this->errorStack) );
        }

        function 
    addToErrorStack($errorArr)
        {   
    $this->errorStack[] = $errorArr;
        }

        function 
    getLastError()
        {   return 
    $this->errorStack[(count($this->errorStack)-1)];
        }

        function 
    getErrors()
        {   return 
    $this->errorStack;
        }

    }

    $dbObj =& new MyDatabase('dbName''dbHost');

    if (!
    $dbObj->connect('userName''password') )
    {   echo 
    'db connection failed : ';
        
    error_log((DE_DB_QUERY_ERROR.' : '.$dbObj->getErrorMessage().' : '.time()), 3'errorLog.log');
        die(
    'you screwd up pal.');
    }

    $username 'ed';
    $id 1;
    $sql 'SELECT * FROM users WHERE username=? and id=?';
    $stmtObj =& new MysqlStatement($sql);
    $stmtObj->setString(1$username);
    $stmtObj->setNumeric(2$id);
    $stmtObj->prepareSql();

    if (!
    $stmtObj->hasErrors() )
    {   
    $preparedSql $stmt->getPreparedSql();
    }
    else
    {   
    $errorObj =& $stmt->getErrorObj();
        
        foreach (
    $errorObj->getErrors() as $currErrorArr)
        {   
    $logLine $currErrorArr['type'].' : '.$currErrorArr['msg'].' : '.time();
            
    error_log($logLine3'errorLog.log');
        }

        die(
    'problem with sql statment');
    }

    $resultObj =& $dbObj->query($preparedSql);

    // do more stuff......


    ?>
    --ed

    P.S. I hope codezilla don't mine me using his code in my library?

  17. #42
    SitePoint Zealot codezilla's Avatar
    Join Date
    Nov 2002
    Location
    upstairs
    Posts
    110
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Quote Originally Posted by phpjack
    My question is, what is the best way to include all of these files?
    Personally, I put all calls to dependent classes at the top of my class files using require_once(). It's not the most efficient way, since some class files may be require_once()'d even though they are not used, but I find it's much easier see and check the dependencies. For example:

    PHP Code:
    require_once('PreparedStatement.class.php');
    require_once(
    'ResultSet.class.php');
    require_once(
    'Statement.class.php');

    class 
    Connection
    {

        
    // . . . 

  18. #43
    ********* Member website's Avatar
    Join Date
    Oct 2002
    Location
    Iceland
    Posts
    1,238
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    I do it differently, example of method in my database class (which has infact lot in common with yours )
    PHP Code:
        function & newStatment($sql) {
            require_once(
    'MyStatement.class.php');
            return new 
    MyStatement($this$sql);
        } 
    As you see I load the file at the same time I instaniate (wasn't it spelled like that?) when needed, mostly because I may have high amount of files that are not needed and requiring them all at the top of my file would just be wasting time and resources IMO.
    - website

  19. #44
    SitePoint Zealot codezilla's Avatar
    Join Date
    Nov 2002
    Location
    upstairs
    Posts
    110
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Quote Originally Posted by kyefun
    What should i do if i want to limit the amount of results? or acending order? or stuff like that?
    Quote Originally Posted by kyefun
    Can i overload that function?
    so that, if theres one more param, then it will add LIMIT $parm2 to the query?
    i mean, is this a way of doing stuff the OOP way?
    Which function do you want to overload? I don't know that any of the existing function would be appropriate to overload for imposing a LIMIT. website's suggestion is probably your best bet for these classes as they were presented.

  20. #45
    SitePoint Zealot codezilla's Avatar
    Join Date
    Nov 2002
    Location
    upstairs
    Posts
    110
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Quote Originally Posted by coo_t2
    I figure you don't need to deal with a limit Clause or anything in the MysqlStatement class because you send the sql statement(for the most part) that you want it to use. The limit clause stuff could probably be abstracted out in a Dao object couldn't it? At least I'm using a Dao object that uses the MysqlStatement class to construct its sql for it.
    Actually, a Statement class is the best place to abstract LIMIT clauses. The reason is that practically every database vendor handles LIMITs differently and it makes the most sense to put code that abstracts database functionality in a database-related class (i.e. Statement), not in a data accessing class (i.e. DAO).

    Quote Originally Posted by coo_t2
    P.S. I hope codezilla don't mine me using his code in my library?
    I don't mind at all. I wouldn't have posted it if I didn't want anyone to use it.

    In fact, if anyone's interested, I've attached the most up-to-date version of my code. It's actually a sub-set of a class library/application framework (sort of) that I developed called Bosc (a type of pear ). These particular classes are basically a bunch of wrapper classes for the ADODB library, so you'll need to update Connection.class.php to reflect the location of the ADODB files (downloaded separately at http://php.weblogs.com/adodb#downloads), but otherwise they should work pretty much "out of the box". Here's some example usage:

    PHP Code:
    require_once('DataSource.class.php');

    $dsn = 'mysql://example_user:example_pass@localhost/example_db';
    $conn =& DataSource::getConnection($dsn);

    $sql = '
        SELECT
            name,
            description
        FROM
            example_table
        WHERE
            date < ?
    ';
    $stmt =& $conn->prepareStatement($sql);
    $stmt->setTimestamp(1, time());
    $stmt->setMaxRows(10);

    $rs =& $stmt->executeQuery();

    while ($rs->next())
    {
        ?>
        <h1><?php echo $rs->getString('name'); ?></h1>
        <p><?php echo $rs->getString('description'); ?></p>
        <?php
    }
    Attached Files Attached Files

  21. #46
    Non-Member coo_t2's Avatar
    Join Date
    Feb 2003
    Location
    Dog Street
    Posts
    1,819
    Mentioned
    1 Post(s)
    Tagged
    1 Thread(s)
    Quote Originally Posted by codezilla
    Actually, a Statement class is the best place to abstract LIMIT clauses. The reason is that practically every database vendor handles LIMITs differently and it makes the most sense to put code that abstracts database functionality in a database-related class (i.e. Statement), not in a data accessing class (i.e. DAO).
    Well I guess I still don't completely understand the exact role of a Dao.
    I thought I did, but that's best left to another thread.

    Quote Originally Posted by codezilla
    I don't mind at all. I wouldn't have posted it if I didn't want anyone to use it.
    Yeah, I figured that.

    ---------
    Thanks for posting Bosc.
    I'll probably get to tearing it to shreds pretty soon.
    I'm sure it's a good library to use off the shelf, but right now
    I'm learning OOP. And I think the best way to learn is to take perfectly
    good code and make changes to it.(which means turn it into code which is not [perfectly] good. )

    --ed

  22. #47
    SitePoint Zealot codezilla's Avatar
    Join Date
    Nov 2002
    Location
    upstairs
    Posts
    110
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Quote Originally Posted by coo_t2
    Well I guess I still don't completely understand the exact role of a Dao.
    I thought I did, but that's best left to another thread.
    Take another look at the responses to your "keeping queries out of classes" thread. Let me know if you have any questions.

    Quote Originally Posted by coo_t2
    Thanks for posting Bosc.
    No problem. But I didn't post the whole thing, just the database-related classes.

  23. #48
    SitePoint Enthusiast
    Join Date
    May 2003
    Location
    Poland
    Posts
    89
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    check this db library
    http://scg.milc.pl/cagret/mgcLib/DB/

  24. #49
    Who Me? JeremyL's Avatar
    Join Date
    Dec 1999
    Location
    Dallas, TX
    Posts
    296
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Doing a search for a DB class I must say this is the best thread on the subject. Someone should really take the base discussion here and expand on it with an article including error handling and more. Very nice.

  25. #50
    SitePoint Addict shad0w's Avatar
    Join Date
    Aug 2003
    Location
    PA
    Posts
    239
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    What does the '&' sign mean in your examples? I searched through the manual, the forums, and google and can't find anything.


Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •