Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

SQLSTATE [42000]:Lỗi cú pháp hoặc vi phạm quyền truy cập:1064

Đâ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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tìm giá trị chính xác từ một chuỗi được phân tách bằng dấu phẩy trong PHP MySQL

  2. Chèn nhiều hàng trong một bảng bằng PHP

  3. Cách tốt nhất để thực hiện sao lưu gia tăng trong MySQL là gì?

  4. Joda Time - Hibernate chèn ngày hôm qua vào cơ sở dữ liệu

  5. đọc hình ảnh BLOB từ cơ sở dữ liệu MySQL