首先,我要说我是Perl的新手。
我在将一个php参数传递给我的perl脚本时遇到了一些问题。该参数来自SQL查询。这是代码的示例和解释。
此代码用于发送ID并从数据库中检索用户的全名,然后将其发送到perl脚本,以便从Fortinet无线设备中删除用户。
PHP代码
function deleteUser($db){
$id = $POST['param'];
$SQLq = 'delete from users where id = ?';
$q = $db->prepare($SQLq);
$q->execute(array($id));
$data = $q->fetch();
$username = $data['user_name']; #data-type in phpmyadming : varchar
exec('perl /var/www/xxx/deleteUserWifi.pl'.' '.escapeshellarg($id).' '.escapeshellarg($username),$output);
}
这是我的perl脚本中的代码
#!/usr/bin/perl -w
use strict;
use Net::SSH::Perl;
#login info to log on the fortinet device
my $hostname = "192.168.0.2";
my $username = "aaaa";
my $password = "xxxx";
my $userID= $ARGV[0];
my $userName = $ARGV[1];
#connection to the FORTINET device
my $ssh = Net::SSH::Perl->new($hostname);
$ssh->login($username, $password);
#string to execute
my $cmd = "config vdom \n
edit root \n
config system dhcp server \n
edit 2 \n
config reserved-address \n
delete ". $userID ." \n
end \n
end \n
config firewall address \n
delete \"" .$userName "\" \n
end \n
end \n
exit"
my($stdout,$stderr,$exit) = $ssh->cmd($cmd);
发送我的ID并从发送的ID中删除用户的ip保留没有问题。出于某种原因,我无法从设备中删除用户名条目,但如果我进入php代码并硬编码这样的用户名,它就可以完美地运行:
PHP代码
$username = "test test";
我在发送之前尝试了一个演员(字符串),但似乎没有任何作用。所以关于如何调试这个???
的任何想法非常感谢你。
PoPlante
PS:抱歉语法不好,英语不是我的第一语言。
答案 0 :(得分:2)
您需要在结果集中添加fetch行(如果没有,则添加错误处理...):
$q = $db->prepare($SQLq);
$q->execute(array($id));
$data = $q->fetch(PDO::FETCH_ASSOC);
$username = $data['user_name']; #data-type in phpmyadming : varchar
答案 1 :(得分:0)
在您的PHP代码中,您实际上对查询结果做了什么。它不仅仅是神奇地出现在$data
中,您需要通过执行类似
$data = $q->fetchObject();
$id = $data->user_name;