PDA

Visualizza la versione completa : passaggio di parametri


mcgyver75
10-01-2005, 10:24
Scusate ho bisogno di un aiutino!
Io ho una subroutine in cui c'è dapprima le istruzioni di visualizzazione di un form x creare utenti, quindi con i campi:
Username:
Password:
ConfirmPassword:
OK

Quindi segue la'istruzione:
%newUser = $connection->create ("user",
{
"LoginName" => qui devo passargli il parametro username inserito da form,

"Password" => "qui devo passargli la pwd",

"Profile" => [$idProfile + 0]#idprofile è una costante

});
Mi spiegate come devo passare a "create" i parametri inseriti da form?
E soprattutto questa sub che ho chiamato createuser come va richiamata da programma principale?

:dhò: :dhò:
Vi prego datemi una mano!
Grazie a tutti

Claudio Vituzzi
10-01-2005, 10:41
Mi spiegate come devo passare a "create" i parametri inseriti da form?


lo puoi fare con questo codice:



#!/perl

use strict;
use warnings;
use CGI;

my $q = new CGI();

my $username = $q->param('Username') || undef;
my $password = $q->param('Password') || undef;
...


ora gestisciti $username e $password come vuoi!

do per scontato che nel form .html c'erano questi campi:



...
<form method="POST" ACTION="your_script.cgi">
<input type="text" NAME="Username">
<input type="password" NAME="Password">
</form>
...


poi...



E soprattutto questa sub che ho chiamato createuser come va richiamata da programma principale?


quà dovrai spiegarti un pò meglio...

mcgyver75
10-01-2005, 10:49
Questo è ciò che avevo fatto e che non funziona:

Prog principale

#!/opt/InfoVista/ivperl/bin/perl -w

use lib qw(/opt/InfoVista/ivperl/lib/site_perl/5.6.1);

use CGI;
use infovista;

require "Funzioni.pl";

open(OUT, ">debug.txt");

$query = new CGI;

print $query->header();
print $query->start_html(-title=>'View',
-bgcolor=>'9999FF'
);
&ivConnectionCookie; #### funzioni.pl ####

print "<font face='Lucida Console'>";
print "Login ('Login.cgi')
";
print "Home ('Instances.cgi')
";

print $query->startform();

print "<hr color='blue'>";



if ($query->param('userAdd')) #userAdd proviene da uno script precedente
{
print "<center>";
print "
Create User

";
&createUser;
print "<center>";
}

if ($query->param('password') ne $query->param('passwordcopy'))
{
&createUser("err passwd");
}

if ($query->param('Ok'))
{

&createUser;
}
print $query->endform;
print $query->end_html;

Questa è la subroutine:

sub createUser
{

my $errore = shift; #prende il primo parametro passato alla subroutine e lo elimina dalla coda

if ($errore ne '')
{

print $errore; #stampa l'errore
};
print "<center>";

print $query->startform();
print $query->start_table();

print "<tr><td>Username</td><td>";
print $query->textfield(-name=>'username',
-size=>'30');
print "</td></tr>";

print "<tr><td>
Password</td><td>";
print "
";
print $query->password_field(-name=>'password',
-size=>'30');
print "</td></tr>";

print "<tr><td>
Confirm Password</td><td>";
print "
";
print $query->password_field(-name=>'passwordcopy',
-size=>'30');
print "</td></tr>";


print $query->end_table;
print $query->submit('Ok','Ok');
print $query->endform;

print "</center>";

$idProfile = 3; #numero identificativo del profilo administrator
$nome = $query->param("username");
$passwd = $query->param("password");

%newUser = $connection->create ("user",
{
"LoginName" => "$nome",

"Password" => "$passwd",

"Profile" => [$idProfile + 0]

});


$msg = ($connection->getStatusMessage())[0];
if ($msg ne "ok") {
print "<center>";
print "$msg
";
print "Warning! This user already exists!
";
&getUserMgmt;
print "</center>";
}
else{
print $query->hidden(
-name => "newUserHidden",
-override => 1,
-value => $nome
);

print "Ok, User created!
";
}

}

Claudio Vituzzi
10-01-2005, 11:01
Mi è venuto il malditesta .. lascio la parola al moderatore :prrr:

shishii
10-01-2005, 16:27
Ciao,

Se scrivi:



%newUser = $connection->create ("user",
{
"LoginName" => "$nome",

"Password" => "$passwd",

"Profile" => [$idProfile + 0]

});


si suppone che hai già inizializzato l'oggetto a cui punta $connection

dove lo hai fatto?

qual'è la struttura del metodo "create"?

Infine il modo che usi per richiamare userCreate è corretto, ma tutto lo script soffre di molta confusione, in buona parte derivante dal fatto che non usi all'inizio 'use strict;' con la successiva necessità di dichiarare le variabili.

mcgyver75
10-01-2005, 16:53
Ciao,
il metodo create recita così:

sub create
{
my ($obj, $className, $refHv) = @_;
my $newObj = Create ($obj->{apiSession},
$className,
$refHv);
return unless ref ($newObj);
return %{$newObj};
}

I miei problemi nascono dal fatto che senza avere grande esperienza di programmaz mi han messo a scrivere uno script x la creazione e inserimento utenti in un certo programma che usa API perl. Per di più mi sto basando su pezzi di codice scritti da un'altra persona che non sempre riesco a capire.

Come va inizializzato l'oggetto a cui punta $connection?Effettivamente non l'ho fatto!

Scusa la mia ignoranza e ti ringrazio x qualsiasi dritta tu possa darmi!

shishii
10-01-2005, 17:53
Ciao,

nel modulo dove sta il metodo 'create' devi trovare il costruttore. In genere si tratta di un metodo chiamato 'new', ma questo in Perl non è obbligatorio, quindi se non c'è 'new' cerca un metodo che al suo interno ha l'istruzione 'bless' e postalo qui.

mcgyver75
10-01-2005, 18:35
Questo è ciò a cui credo tu ti riferisci!


sub new
{
my ($pkg, $computer, $user, $password) = @_;

if(isCompatibleWithIVAPI()!= 1){
my ($majorc ,$minorc, $releasec)= getIVAPICompatibilityVersions();
my $ivperlVersion= $VERSION;
my $ivapiVersion= getIVAPIVersion();
my $ivapicompVersion= sprintf("%1d.%1d.%03d",$majorc ,$minorc, $releasec);
print STDERR "\nThis InfoVista perl package version (",$ivperlVersion,") is not compatible with the version (",$ivapiVersion,") of IVAPI.dll. You must have at least IVAPI.DLL version ", $ivapicompVersion, "!!\n";
die;
}


my $session = {
"computer" => $computer,
"user" => $user,
"password" => $password,
};

bless $session, 'infovista';

$session->_initialize ();

return $session;
}

shishii
10-01-2005, 18:47
Madonna del carmine!!! :oVVoVe:

raramente ho visto un modulo più incasinato e fuori standard (il fatto che queste eccentricità siano consentite è il bello ed il brutto di perl).

Comunque...

la classe in questione si inizializza così:

use <nome modulo>;
# non ho capito come si chiama, comunque devi inserire
# il nome del file.pm SENZA l'estensione.

my $connection = <nome modulo>->new($computer, $user, $password);

dopodichè potrai usare i suoi metodi nella forma:

$connection->metodo(parametri);

mcgyver75
10-01-2005, 19:00
Ho risoltoooooooooo!!!
Era un problema di $idProfile che andava passato senza le parentesi [] all'interno del metodo create....mi era sfuggito questo errore nella lettura del file di error_log.

Comunque hai ragione il programma che sto usando è davvero incasinato e se lo sommiamo ad una mente incasinata come la mia, il guaio è fatto :)
Però la cosa che mi soddisfa è che per quanto sporco possa essere, il codice concettualmente fila e per un novellino come me, messo di fronte ad un perl non proprio banale, non è un magro successo!!!

Grazie ancora!!!

Loading