Inilah yang menyebabkan kesalahan:
$this->data->query('CREATE TABLE $this->subdomain');
$this->data->bind(':subdomain', $this->subdomain);
Seperti yang dicatat Michael Berkowski dan andrewsi dalam komentar, Anda tidak dapat mengikat nilai ke :subdomain
placeholder karena tidak dicatat seperti itu dalam kueri dan bahkan jika placeholder PDO hanya dapat digunakan untuk nilai, bukan nama database, tabel, atau kolom .
Jika Anda ingin membuat kueri SQL semacam itu dibuat secara dinamis, Anda perlu menyertakan nama database, tabel, atau kolom dalam tanda kutip backtick (jika kolom dan nama Anda berisi kata kunci yang dicadangkan SQL yang dapat merusak kueri) dan escape values yang ditempatkan, tetapi Anda tidak dapat menggunakan MySQLi
untuk itu jika sudah menggunakan PDO
.
Karena PDO tidak datang dengan real_escape_string()
metode yang akan melakukan hal itu, dan dalam praktiknya tidak diperlukan untuk menghindari nilai seperti itu (kecuali jika Anda benar-benar memiliki kolom bernama seperti Ye'name
yang benar-benar bodoh IMHO), filter sangat sederhana menggunakan preg_match()
atau preg_replace()
cukup baik:
if (preg_match('/^[\w_]+$/i', $this->subdomain)) {
// note the ` (backtick), and using " (double quotes):
$this->data->query("CREATE TABLE `{$this->subdomain}`");
} else {
// throw exception or error, do not continue with creating table
}
Beberapa contoh penggunaan '
(kutipan tunggal - apostrof) terhadap "
(tanda kutip ganda) string di PHP:
$a = 1;
$b = 2;
echo '$a + $b'; // outputs: $a + $b
echo "$a + $b"; // outputs: 1 + 2
$c = array(5, 10);
echo '\$c[0] = {$c[0]}'; // outputs: \$c[0] = {$c[0]}
echo "\$c[0] = {$c[0]}"; // outputs: $c[0] = 5
{}
di dalam tanda kutip ganda string digunakan untuk array dan akses properti objek dan dapat digunakan di sekitar variabel biasa.
Escaping $
dalam tanda kutip ganda dilakukan oleh \$
jika tidak, itu akan mengasumsikan panggilan variabel.