我在php(index.php)中有两个页面,在Perl(dbcon.pl)中有另一个页面。
基本上我希望我的php文件只显示UI,所有数据操作都将在Perl文件中完成。
我试过了 在index.pl
<?php include("dbcon.pl");?>
<html>
<br/>PHP</br>
</html>
和dbcon.pl有
#!/usr/bin/perl
use strict;
use warnings;
use DBI;
use CGI::Simple;
my $cgi = CGI::Simple->new;
my $dsn = sprintf('DBI:mysql:database=%s;host=%s','dbname','localhost');
my $dbh = DBI->connect($dsn,root =>'',{AutoCommit => 0,RaisError=> 0});
my $sql= "SELECT * FROM products";
my $sth =$dbh->prepare($sql);
$sth->execute or die "SQL Error: $DBI::errstr\n";
while (my @row = $sth->fetchrow_array){
print $cgi->header, <<html;
<div> @row[0] @row[1] @row[2] @row[3] @row[4]</div>
html
}
但是当我在浏览器中运行index.php时,它会打印dbcon.pl文件中的所有代码而不是执行它
如何克服这个问题?
注意:我在Windows环境中运行它
有没有其他方法可以做到这一点?
答案 0 :(得分:5)
请问问题到底是什么?我在Perl代码中看不到任何“特殊”,所以你要么:
a)不知道如何从PHP访问您的数据库(即您不了解PHP)或
b)不知道Perl在做什么(即你不知道Perl)或
c)可能你的环境已经设置好了,你可以使用Perl DBI,但不能用PHP做同样的事情。
这个 link 应该指导您直接从PHP执行Perl中的操作。您可以轻松找到各种PHP / DB组合的几十个示例。
唯一的另一种方法是做另一张海报建议的内容:调用Perl脚本并解析结果(打印到标准输出)。
这是rubygoldbergsque,脆弱且不可接受作为解决方案,除非您绝对不顾一切地使用仅作为Perl模块提供的东西(在您发布的示例中不是这种情况)。
一般情况下,如果你想用一种语言完成某些事情并从其他语言中使用它,最好的方法是使(在你的情况下)Perl作为一种“服务器”运行,即一个单独的过程 - 并使用XML-RPC或其他一些轻量级协议使其公开服务。
使用exec()或类似结构调用程序是非常糟糕的做法。
答案 1 :(得分:2)
你正在尝试的是不容易的。您必须使用PHP执行perl脚本,捕获输出并将其打印为:
<?php echo exec('perl dbcon.pl'); ?>
如上所述,这不是一件好事。为了在后端和用户界面之间实现良好的分离,您应该查看现有的PHP框架。
答案 2 :(得分:2)
有Perl PECL package将Perl集成到PHP中。
P.S。恕我直言,最好在Perl中使用像Template Toolkit这样的模板系统。你甚至可以在模板中使用Perl。
答案 3 :(得分:0)
如果您正在使用Catalyst,我们可以Catalyst::View::PHP我怀疑它会为您提供更多关于如何使用php作为模板系统的线索。它还提到了PHP::Interpreter