Using prepared statements in MySQL you have to use a parameter only once. Coding like the example below will envoke "SQLSTATE[HY093]: Invalid parameter number"
$enigma = 'ThisIsTheSecretEncryptionKey';
$data = [
'name' => $name,
'first_name' => $first_name,
'gender' => $gender,
'birthdate' => $birthdate,
'email' => $email,
'profession' => $profession,
'enigma' => $enigma
];
$sql = "INSERT INTO members
(name , firstname , gender , birthdate, email, profession)
VALUES(
AES_ENCRYPT(:name, :enigma),
AES_ENCRYPT(:first_name, :enigma),
AES_ENCRYPT(:gender, :enigma),
AES_ENCRYPT(:birthdate, :enigma)
AES_ENCRYPT(:email, :enigma)
AES_ENCRYPT(:profession, :enigma)
)";
$pdo->prepare($sql)->execute($data);
To overcome this problem I found this solution:
$enigma = 'ThisIsTheSecretEncryptionKey';
$data = [
'name' => $name,
'first_name' => $first_name,
'gender' => $gender,
'birthdate' => $birthdate,
'email' => $email,
'profession' => $profession,
'enigma' => $enigma,
'enigma2' => $enigma,
'enigma3' => $enigma,
'enigma4' => $enigma,
'enigma5' => $enigma,
'enigma6' => $enigma,
];
$sql = "INSERT INTO members
(name , firstname , gender , birthdate, email, profession)
VALUES(
AES_ENCRYPT(:name, :enigma),
AES_ENCRYPT(:first_name, :enigma2),
AES_ENCRYPT(:gender, :enigma3),
AES_ENCRYPT(:birthdate, :enigma4)
AES_ENCRYPT(:email, :enigma5)
AES_ENCRYPT(:profession, :enigma6)
)";
$pdo->prepare($sql)->execute($data);
It works but it is not a really smooth solution especially when it comes to tables containing lots of colums. Is there any other way using prepared statements in encrypted databases in MySQL?