Đây là nguyên nhân gây ra lỗi:
$this->data->query('CREATE TABLE $this->subdomain');
$this->data->bind(':subdomain', $this->subdomain);
Như Michael Berkowski và andrewsi đã lưu ý trong các nhận xét, bạn không thể ràng buộc giá trị với :subdomain
trình giữ chỗ vì nó không được ghi chú như vậy trong truy vấn và ngay cả khi nó là Trình giữ chỗ PDO chỉ có thể được sử dụng cho các giá trị không phải tên cơ sở dữ liệu, bảng hoặc cột .
Nếu bạn muốn có loại truy vấn SQL đó được tạo động, bạn cần đặt tên cơ sở dữ liệu, bảng hoặc cột trong dấu ngoặc kép (trong trường hợp các cột và tên của bạn chứa các từ khóa dành riêng cho SQL có thể phá vỡ truy vấn) và giá trị thoát được đặt, nhưng bạn không thể sử dụng MySQLi
cho điều đó nếu đã sử dụng PDO
.
Vì PDO không đi kèm với real_escape_string()
phương thức này sẽ làm điều đó và trong thực tế, không cần thiết phải thoát các giá trị như vậy (trừ khi bạn thực sự có các cột có tên như Ye'name
đó là IMHO hoàn toàn ngu ngốc), bộ lọc rất đơn giản bằng cách sử dụng preg_match()
hoặc preg_replace()
đủ tốt:
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
}
Chỉ một vài ví dụ về việc sử dụng '
(dấu nháy đơn - dấu nháy đơn) so với "
(dấu ngoặc kép) chuỗi trong 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
{}
bên trong chuỗi dấu ngoặc kép được sử dụng để truy cập mảng và thuộc tính đối tượng và có thể được sử dụng xung quanh các biến thông thường.
Thoát $
trong dấu ngoặc kép được thực hiện bởi \$
nếu không nó sẽ giả sử một cuộc gọi biến.