$stmt = $db->prepare("INSERT INTO users VALUES ('',?,?,?,?,?,?)");
Öncelikle INSERT komutunu ben sizin yerinizde olsam aşağıdaki gibi yapardım. Sizin yaptığınız da yanlış değil fakat hangi sütun hangi değişkene geliyor eşleştirmek , daha az hata yapmanızı sağlar.

$stmt = $db->prepare("INSERT INTO users (sutun1, sutun2, sutun3) VALUES (?,?,?)");
gibi.

İkincisi ise hata aldığınız yer. Sorgunuzda kaç adet soru işareti kullandıysanız, bindparam komutunun 1. parametresinde o kadar s koymalısınız. Siz 4 adet s koymuşsunuz fakat 6 adet değişken var. Bu string olduğu için s olarak yazılıyor. Farklı değerler alabilir.

Yanlış:
$stmt->bindparam('ssss', $nm, $gd, $pn, $mail, $user, $pass);
Doğru:
$stmt->bindparam('ssssss', $nm, $gd, $pn, $mail, $user, $pass);
Kısacası değişken kadar soru işareti, soru işareti kadar "s" kullanmalısınız.
Kolay gelsin.