Việc bạn sử dụng $db_config
biến trông có vẻ đáng ngờ đối với tôi. Hàm băm cấu hình của bạn lạ hoặc bạn đang sử dụng các giá trị thay vì khóa.
Bạn chưa cho chúng tôi xem $db_config
ở đâu được thiết lập, nhưng tôi đoán nó trông giống như thế này:
$db_config = {
name => 'Top_Data',
host => '127.0.0.1',
port => 3306,
username => 'someone',
password => 'a secret',
};
Và sau đó bạn sẽ sử dụng nó như thế này:
my $dsn = "DBI:mysql:database=".$db_config->{name}.";host=".$db_config->{host}.";port=".$db_config->{port};
Lưu ý rằng tôi đã sử dụng các tên khóa (name
, host
và port
) thay vì các giá trị (Top_Data
, 127.0.0.1
và 3306
).
Tôi cũng sẽ chỉ ra rằng bạn có thể đơn giản hóa điều này một chút bằng cách sử dụng khả năng của Perl để mở rộng các biến bên trong một chuỗi được trích dẫn kép.
my $dsn = "DBI:mysql:database=$db_config->{name};host=$db_config->{host};port=$db_config->{port}";
Có một vấn đề khác sau đó, với câu lệnh SQL của bạn.
my $sql = 'insert into Top(Load_Average, CPU_us, CPU_id, CPU-wa, CPU_hi,
CPU_si, CPU_st, Swap_Total, Swap_Free, Swap_Used, Memory_Total,
Memeory_Free, Memory_Used, Memory_Buff, Date)
values(float,float,float,float,float,float,float,float,
varchar,varchar,varchar,varchar,varchar,varchar,date)';
Các giá trị mà bạn nên chèn là các mục dữ liệu thực tế. Vì vậy, nơi bạn có các chuỗi "float", "varchar" hoặc "date", bạn sẽ thực sự có các mục dữ liệu (một số dấu phẩy động, một chuỗi hoặc một ngày).
Cuối cùng, khi đã chuẩn bị xong câu lệnh của mình, bạn không cần phải chuyển nó vào execute()
phương pháp. Tuy nhiên, bạn nên xem xét việc sử dụng các điểm ràng buộc trong SQL của mình và chuyển các mục dữ liệu thực tế của bạn tới execute()
gọi