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

mysqli-- câu lệnh chuẩn bị không thành công với lỗi không có bảng nào được sử dụng

Rõ ràng,

SELECT * FROM (SELECT ? )

... không được công nhận là một cú pháp MySQL hợp lệ. Tên bảng bị thiếu.

CHỈNH SỬA , Liên quan đến nhận xét của bạn:

Trước hết, xin lưu ý rằng thực hiện câu lệnh này trong bảng điều khiển bằng cách thay thế ? với một hằng số không mô phỏng tình huống của bạn, vì vậy tôi sẽ coi kết quả là không hợp lệ để so sánh.

Nhưng sau đó một lần nữa, thực hiện nó mà không thay thế ? tự nhiên sẽ đưa ra một lỗi.

Đó là bởi vì chỉ thực hiện lựa chọn không liên quan đến tình huống của bạn. Trong mã php của bạn, nó không phải là thực thi thất bại nhưng đúng hơn là sự chuẩn bị . Vì vậy, cách thích hợp để mô phỏng điều này bằng bảng điều khiển, sẽ là PREPARE tuyên bố.

Vì vậy, làm một

PREPARE myStmt 
  FROM 'SELECT * FROM (SELECT ? ) AS tmp WHERE NOT EXISTS (
    SELECT Identifier FROM eeg WHERE Identifier = ?
    ) LIMIT 1'

sẽ tái tạo vấn đề của bạn chính xác hơn.

Bây giờ, có vẻ như PREPARE gặp khó khăn khi hiểu các truy vấn lồng nhau được tham số hóa xuất hiện trong FROM mệnh đề . Hãy xem các ví dụ sau:

PREPARE myStmt FROM "select * from (select ? from eeg) tmp"; 

(không hoạt động)

PREPARE myStmt FROM "select *,? from (select * from eeg) tmp"; 

(hoạt động)

PREPARE myStmt FROM "select *,? from (select 'asdf') tmp"; 

(hoạt động)

PREPARE myStmt FROM "select * from eeg where Identifier in (select ?)"; 

(hoạt động)

Hành vi tò mò, nhưng tôi chỉ có thể đoán rằng khi một SELECT lồng nhau trong FROM mệnh đề có các tham số, MySQL thiếu manh mối để chuẩn bị câu lệnh .

Đối với đề xuất của tôi, nếu tôi hiểu bạn đang cố gắng làm gì, bạn không cần tham số trong vùng chọn lồng nhau. Bạn có thể di chuyển nó ra bên ngoài và mã hóa một hằng số trong vùng chọn lồng nhau, vì lợi ích của FROM . Đoạn mã sau

if ($usertest = $datasqli->prepare("INSERT INTO eeg (Identifier) 
    SELECT ? from (select 1) tmp WHERE ? NOT IN
      (SELECT Identifier FROM eeg WHERE Identifier = ?)")) {

... nên thực hiện thủ thuật.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL chuyển đổi kiểu dữ liệu cột từ VARCHAR sang INT

  2. Cách nhận giá trị từ URL

  3. Hiển thị dữ liệu từ MYSQL; Lỗi câu lệnh SQL

  4. Trợ giúp với:ERROR 1025 (HY000):Lỗi khi đổi tên của .... (errno:150)

  5. Bị mắc kẹt với truy vấn PHP