Okay, let me try a reduced version of this problem.

I have a short script that does nothing but establish a connection to
MySQL via DBI/DBD::MySQL:

    $ cat test.pl
    #!/usr/bin/perl -wT

    use DBI;

    my $host = "localhost";
    my $db   = "[....]";
    my $user = "[....]";
    my $pass = "[....]";
    my $dsn  = "DBI:mysql:host=$host;database=$db";
    my $dbh = DBI->connect( $dsn, $user, $pass )
              or die "Cannot connect to database: \n$DBI::errstr\n $!";

    print qq[Content-type: text/plain

    If you can read this then DBI connected.
    ];

This file is hard-linked to test.mpl. Apache is configured to serve .pl
files as normal CGI scripts, but will use Apache::Registry to serve .mpl
files.

Here's what happens when I request the corresponding url, first as a CGI:

    $ lynx -dump http://devers.homeip.net:8080/test/test.pl
    If you can read this then DBI connected.


No error there. Here's the mod_perl version:

    $ lynx -dump http://devers.homeip.net:8080/test/test.mpl

                                Software error:

    Cannot connect to database:
    Protocol mismatch. Server Version = 0 Client Version = 10
      at /Library/WebServer/Documents/test/test.mpl line 10.

    For help, please send mail to the webmaster
    ([EMAIL PROTECTED]), giving this error
    message and the time and date of the error.

    $


Again with the "protocol mismatch."

According to the MySQL manual --

    <http://www.mysql.com/doc/en/Upgrading-from-3.20.html>

-- the following advice should apply:

    If you are not using the --old-protocol option to mysqld, old clients
    will be unable to connect and will issue the following error message:

      ERROR: Protocol mismatch. Server Version = 10 Client Version = 9

    The new Perl DBI/DBD interface also supports the old mysqlperl interface.
    The only change you have to make if you use mysqlperl is to change the
    arguments to the connect() function. The new arguments are:  host,
    database, user, and password (note that the user and password
    arguments have changed places). See section 11.5.2 The DBI Interface.

Which is close, but [a] that's not the client version I'm seeing reported
(not sure if that matters...), and [b] the connection syntax I'm using
seems to be the same as what they're requesting:

  My version:
    my $dsn  = "DBI:mysql:host=$host;database=$db";
    my $dbh = DBI->connect( $dsn, $user, $pass )

  Their suggestions:
    $dbh = DBI->connect("DBI:mysql:$database", $user, $password);
    $dbh = DBI->connect("DBI:mysql:$database:$hostname",
                        $user, $password);
    $dbh = DBI->connect("DBI:mysql:$database:$hostname:$port",
                        $user, $password);

Substantially the same, right? Okay maybe not identical, but even if I use
verbatim what they're describing here, the results I'm seeing are still
the same -- works as a CGI, fails through mod_perl. Weird.

Beyond that, the closest relevant advice I can find is stuff like this:

<http://www.phpbuilder.com/mail/php3-list/199810/1957.php>

    This means that PHP was compiled with an old version of the MySQL
    client library. Make sure you have the libmysqlclient.a library
    which matches your installed server and rebuild PHP from scratch.

Okay, but [a] I'm not using PHP, and [b] it seems like I'm using current
versions of the relevant material -- Apache::DBI installed via CPAN, and
MySQL kept up to date with Fink.


Hmm, this Interchange post seems promising...

    Actually, this is only a MySQL versioning problem and has nothing
    to do with Interchange.

    Try

        perl -MCPAN -e 'force install Mysql'

    to re-install DBD::mysql and see if that makes a difference.

<http://icdevgroup.org/pipermail/interchange-users/2000-August/000030.html>


Which may work, but I still don't get why I'm getting the two different
results depending on how the script gets called...



-- 
Chris Devers

Reply via email to