in reply to Sorting hash values according to order of an array

The simple trick to fix this is to supply the list of columns as well, such as:
"INSERT INTO $q{'-table'} (".join(',', @columns).") VALUES ($ph)"
You can make a list of columns based on your hash. It's unfortunate that you've prefixed them with a dash, though.
my @columns = map { substr($_,1) } keys %{$q{'-values'}};
That's the basics of it.

I'm not sure why you're quoting your placeholders. That's supposed to be done automatically, if required, by DBI.

I must've misread your code, because what I meant was this:
my @columns = keys %{$q{'-values'}};
I didn't notice that you hadn't prefixed your columns with dashes, unlike your properties.