我已经在这个问题上纠结了大约 5 个小时,我真的很沮丧,需要一些帮助。
我正在编写一个 Perl 脚本,它从 MySQL 表中提取作业,然后执行各种数据库管理任务。当前任务是“创建数据库”。该脚本成功地创建了数据库,但是当我为 PHP 开发人员生成配置文件时,它就崩溃了。
我认为这是引用和取消引用变量的问题,但我不太确定到底发生了什么。我认为在这个函数调用之后,发生了一些事情
$$result{'databaseName'}。这就是我得到结果的方式:$result = $select->fetchrow_hashref()
这是我的函数调用和函数实现:
函数调用(第 127 行):
generateConfig($$result{'databaseName'}, $newPassword, "php");
功能实现:
sub generateConfig {
my($inName) = $_[0];
my($inPass) = $_[1];
my($inExt) = $_[2];
my($goodData) = 1;
my($select) = $dbh->prepare("SELECT id FROM $databasesTableName WHERE name = '$inName'");
my($path) = $documentRoot.$inName."_config.".$inExt;
$select->execute();
if ($select->rows < 1 ) {
$goodData = 0;
}
while ( $result = $select->fetchrow_hashref() )
{
my($insert) = $dbh->do("INSERT INTO $configTableName(databaseId, username, password, path)".
"VALUES('$$result{'id'}', '$inName', '$inPass', '$path')");
}
return 1;
}
错误:
Use of uninitialized value in concatenation (.) or string at ./dbcreator.pl line 142.
Use of uninitialized value in concatenation (.) or string at ./dbcreator.pl line 154.
第 142 行:
$update = $dbh->do("UPDATE ${tablename}
SET ${jobStatus}='${newStatus}'
WHERE id = '$$result{'id'}'");
第 154 行:
print "Successfully created $$result{'databaseName'}\n";
我认为问题出在函数调用的原因是因为如果我注释掉函数调用,一切都会很好!
如果有人可以帮助我了解发生了什么,那就太好了。
谢谢,
p.s.如果您发现将整个密码作为纯文本存储在数据库中存在安全问题,那么在正常工作后将得到解决。 =P
迪伦
最佳答案
您不想存储对从 fetchrow_hashref 返回的 $result 的引用,因为每个后续调用都会覆盖该引用。
没关系,当您调用 generate_config 时,您没有使用引用,因为您是按值传递数据。
您是否在 generate_config 和调用函数中使用相同的 $result 变量?您应该在 generate_config 中使用您自己的“我的 $result”。
while ( my $result = $select->fetchrow_hashref() )
# ^^ #add my
这就是您包含的当前代码片段可以说的全部内容。
一些清理:
sub generateConfig {
my($inName, inPass, $inExt) = @_;
my $goodData = 1;
my $select = $dbh->prepare("SELECT id FROM $databasesTableName WHERE name = ?");
my $insert = $dbh->prepare("
INSERT INTO $configTableName(
databaseID
,username
,password
,path)
VALUES( ?, ?, ?, ?)" );
my $path = $documentRoot . $inName . "_config." . $inExt;
$select->execute( $inName );
if ($select->rows < 1 ) {
$goodData = 0;
}
while ( my $result = $select->fetchrow_hashref() )
{
insert->execute( $result->{id}, $inName, $inPass, $path );
}
return 1;
}
关于传递给子例程时Perl引用和延迟哈希值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6987325/