Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP脚本中调用时,无法通过Perl建立MySQL连接_Php_Mysql_Perl - Fatal编程技术网

在PHP脚本中调用时,无法通过Perl建立MySQL连接

在PHP脚本中调用时,无法通过Perl建立MySQL连接,php,mysql,perl,Php,Mysql,Perl,我正在一个由PHP脚本调用的Perl脚本中创建到MySQL数据库的连接。以下是两个脚本: Perl: #!/usr/bin/perl # script name = MyCode.pl use DBI; my $data_source = q/dbi:mysql:name:localhost/; my $user = q/myname/; my $pwd = q/pword/; print "before...\n"; # Connect! $dbhandle= DBI->connect

我正在一个由PHP脚本调用的Perl脚本中创建到MySQL数据库的连接。以下是两个脚本:

Perl:

#!/usr/bin/perl
# script name = MyCode.pl
use DBI;
my $data_source = q/dbi:mysql:name:localhost/;
my $user = q/myname/;
my $pwd = q/pword/;

print "before...\n";
# Connect!
$dbhandle= DBI->connect($data_source,$user,$pwd) or die "can't connect
       $data_source: $DBI::errstr \n";
print "...after \n";
<?php
 // script name = Test.php
 $myResult=shell_exec("perl /path/MyCode.pl");
 echo $myResult;
?>
PHP:

#!/usr/bin/perl
# script name = MyCode.pl
use DBI;
my $data_source = q/dbi:mysql:name:localhost/;
my $user = q/myname/;
my $pwd = q/pword/;

print "before...\n";
# Connect!
$dbhandle= DBI->connect($data_source,$user,$pwd) or die "can't connect
       $data_source: $DBI::errstr \n";
print "...after \n";
<?php
 // script name = Test.php
 $myResult=shell_exec("perl /path/MyCode.pl");
 echo $myResult;
?>


在命令行上执行时,Test.php打印“before…”和“…after”,并且在Perl代码中确实建立了DB连接。但是,当从我的(Chrome)浏览器执行Test.php时,所有打印内容都是“before…”,并且没有连接。并且不显示任何错误消息


为什么在命令行上成功,而不是在web服务器上成功?

我的第一个猜测是:在PHP中,您使用“perl/path/MyCode.pl”执行它

Apache打开的shell位于与您不同的用户之下,并且该用户不在其路径中使用perl

尝试从完整路径使用Perl:“/full/path/to/Perl/path/MyCode.pl”

仅供参考:使用perl“scriptname”执行脚本不是一个好做法。相反,在shebang中定义Perl的完整路径,并始终使用完整路径启动脚本。这样可以避免这样的错误

问候,, Andras

是的,PHP
shell_exec()
函数不捕获STDERR

要调试代码,可以在系统命令末尾添加
2>&1
,将STDERR重定向到STDOUT

$myResult = shell_exec("perl /path/script.pl 2>&1");
此外,如果在运行时发生错误,您可以将DBI模块设置为die:

$dbh = DBI->connect($data_source,$user, $pwd, { RaiseError => 1, PrintError => 0}) or die $DBI::errstr;

问题已修复…我需要正确的路径规范:这是通过使用(在godaddy上)完成的:

use cPanelUserConfig;

在Perl脚本中访问我安装的DBD::mysql模块。

问得好。好奇你为什么要这样做?当它在命令行而不是浏览器中工作时,我总是先进入权限。您的web服务器(apache?)是否具有运行perl和访问/path/MyCode.pl的权限?我有一个用perl编写的“后端”例程,它模拟了我的一个业务客户机的流程。事情在我需要的地方发生了变化a@MikeP离题,但你可以在发布评论的前五分钟内编辑评论。尝试更改
或使用
死亡
,或打印
。这会让事情更清楚!现在我看到错误消息:install_driver(mysql)failed:在(eval 4)第3行的@INC(@INC-contains:/usr/local/lib64/perl5/usr/local/share/perl5/usr/lib64/perl5/vendor/usr/share/perl5/vendor_perl/usr/usr/lib64/perl5.)中找不到DBD/mysql.pm。可能DBD::mysql perl模块尚未完全安装,或者“mysql”的大写不正确。可用驱动程序:DBM、ExampleP、文件、Gofer、代理、SQLite、海绵。在家里……如果
RaiseError
处于启用状态,则不需要在
connect
之后安装
或die
。另外,
PrintError
是多余的,如果您已经在使用
RaiseError
@MikeP,那么Web服务器用户可能正在运行与您在命令行上运行的
perl
不同的
perl。尝试在
shell\u exec
中传递完整路径。您可能在从命令行执行之前设置了PERL5LIB确定感谢所有这些伟大的帮助。问题已修复…我需要正确的路径规范:这是通过在Perl脚本中使用:use cPanelUserConfig访问我安装的DMD::mysql模块来完成的(在godaddy上)。