0

まず第一に、私は 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";

送信する前にキャスト (文字列) を試しましたが、何も動作しないようです。これをデバッグする方法についてのアイデアはありますか???

事前にどうもありがとうございました。

ポプランテ

PS: お粗末な文法で申し訳ありません。英語は私の母国語ではありません。

4

2 に答える 2

2

結果セットから行をフェッチする必要があります (何もない場合はエラー処理を追加します...):

  $q = $db->prepare($SQLq);
  $q->execute(array($id));

  $data = $q->fetch(PDO::FETCH_ASSOC);

  $username = $data['user_name']; #data-type in phpmyadming : varchar
于 2013-01-08T21:52:51.353 に答える
0

PHP コードのどこにも、クエリ結果に対して実際に何かを行っているところはありません。魔法のように に表示されるだけでなく$data、次のようにして実際に取得する必要があります

$data = $q->fetchObject();
$id = $data->user_name;
于 2013-01-08T21:54:18.397 に答える