2011-12-22 10 views
5

Có thể sử dụng giá trị động bên trong lệnh SELECT FROM sql không?Chọn Bảng (TỪ) theo chuỗi

Database->prepare("SELECT bomb FROM ? WHERE id=?") 
    ->execute($strTable,$strID); 

kết quả:

Fatal error: Uncaught exception Exception with message Query error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near...

+0

Tôi không chắc chắn điều này đã làm với PHP ... – BoltClock

+0

Tại sao? Có bất kỳ lệnh sql trực tiếp truy cập mysql mà không có lớp ở giữa? – mate64

+0

bằng cách sử dụng thư viện nào? – RageZ

Trả lời

3

Giả sử $strTable là từ một nguồn an toàn chỉ cần sử dụng

Database->prepare("SELECT bomb FROM $strTable WHERE id=?") 
    ->execute($strID); 
6

số Tên bảng không thể là một tham số của truy vấn. Bạn sẽ cần phải xây dựng chuỗi truy vấn của bạn đầu tiên, concatenating tên bảng trong.

+0

kém. Bạn có biết một khái niệm workaround có thể là bạn có thể chia sẻ? – mate64

+0

Bất kỳ đầu mối nào trong đó tài liệu này được ghi lại? – Alex

+1

@msec Tôi đã cung cấp cho bạn giải pháp thay thế. Xây dựng truy vấn của bạn thành một chuỗi và nối tên bảng vào chuỗi đó. –

1

thường là những lớp trừu tượng cơ sở dữ liệu dựa trên tuyên bố sẵn sàng để xử lý nơi này tính năng chủ. Tính năng tuyên bố đã chuẩn bị của RDBM biên dịch truy vấn, tôi không nghĩ rằng có thể chuẩn bị truy vấn nếu bảng không được chỉ định.

Bạn nên sử dụng chức năng escapement của thư viện và bao gồm tên bảng trong truy vấn.

dụ:

$tablename = escapement_function($strTable); 
Database->prepare("SELECT bomb FROM {$tablename} WHERE id=?") 
     ->execute($strID); 
2

thiếu báo cáo te bindParam của bạn. Tôi không nghĩ rằng bạn có thể làm tên bảng khác hơn là làm một biến php như @ Alex đã làm. Dưới đây là mã cho một tuyên bố chuẩn bị:

<?php 
$stmt = $dbh->prepare("SELECT bomb FROM $tablename WHERE id=:strID"); 
$stmt->bindParam(':strID', $id); 
$stmt->execute(); 
?> 

PHP Manaual refernce: http://php.net/manual/en/pdo.prepared-statements.php

+0

thêm những kẻ tiêm sql ;-) – RageZ

+0

Làm cách nào? Sử dụng các thông số gần như không thể cho tiêm sql. đó là trừ khi anh ta cho phép người dùng nhập vào tên bảng của mình trong trường hợp đó, nó sẽ bị tấn công. "Nếu một ứng dụng độc quyền sử dụng các câu lệnh đã chuẩn bị sẵn sàng, nhà phát triển có thể chắc chắn rằng không có việc tiêm SQL nào sẽ xảy ra". – Robert

+0

Điều gì về $ tablename = 'foobar WHERE 1 = 1 -', vì chúng ta không biết $ tablename đến từ loại nguy hiểm – RageZ

Các vấn đề liên quan