使用 DBI 连接到 MySQL 数据库

Connecting to a MySQL database using DBI

我正在尝试连接到 MySQL 数据库。

我找到了这个脚本,我正尝试在我的 PC 和网络主机上使用它,但它没有显示任何输出。

请看一下这段代码。我是 运行 perl xampp。

#!C:\xampp\perl\bin\perl.exe

print "Content-type: text/html\n\n";

use DBI;
use strict;

my $driver   = "localhost"; 
my $database = "data";
my $dsn      = "DBI:$driver:database = $database";
my $userid   = "root";
my $password = "";

my $dbh = DBI->connect($dsn, $userid, $password ) or die $DBI::errstr;

我正在使用与 PHP 相同的数据库。

but it doesn't show any output.

根据您显示的 CGI header 判断,我认为您 运行 这是一个 CGI 程序。在这种情况下,您没有看到任何输出也就不足为奇了——您没有发送任何输出。

如果你 运行 它是一个命令行程序(在进入 CGI 编程之前先在命令行上运行通常是个好主意),那么你会看到 "Content-Type" header。或者,您可以向您的程序添加一些输出,然后查看它是否出现在您的浏览器中。像这样简单的东西:

print 'It works!';

我还想补充一点,现在 CGI 看起来相当过时,并且有更好(我的意思是更简单和更强大)的方法来使用 Perl 编写 Web 应用程序。您可能想阅读 CGI::Alternatives 以了解可用的内容。

更新:

我刚刚在 Facebook 上看到这个问题(请不要 cross-post 不告诉别人)我注意到你的 $driver 变量是错误的。如果您连接到 MySQL,那么 $driver 应该是 "mysql"(以便 DBI 加载 "DBD::mysql")。

MySQL driver 的 DSN 如下所示

DBI:mysql:database=$database;host=$hostname;port=$port

其中 hostport 字段是可选的。 (database 也是可选的,但您不想将其遗漏。)还有几个更深奥的选项,但它们在这里无关紧要

但你正在供应

DBI:localhost:database = data

它甚至没有指定 MySQL 连接,所以如果它不起作用我并不感到惊讶!我不知道这些空格是否合法,但我会保留它们以与文档保持一致。

您应该将该语句更改为

my $dsn = "DBI:mysql:database=$database;host=$driver"

如果您愿意,您可以删除 ;host=$driver(为什么将主机名命名为 "driver"?),因为 localhost 是默认值。仅指定数据库名称并对所有其他字段使用默认值的 DSN 可能会缩减为

my $dsn = "DBI:mysql:$database"

一开始只写 print 语句来生成一些输出可能更容易。您需要打印 text/plain 的 MIME 内容类型 header 而不是 text/html。现在尝试 print "$DBI::errstr\n" 而不是 die,因为后者写入 stderr,不会出现在您的浏览器中

您可以添加:

if ($dbh) {
 print 'connect ok';
} else {
 print 'connect failed';
}