2011-12-22 27 views
5

SELECT FROM sql komutunun içinde dinamik bir değer kullanmak mümkün mü?Dize ile Tablo (FROM) öğesini seçin

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

sonucu:

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

... – BoltClock

+0

Neden:

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

PHP Manaual refernce: Burada hazırlanmış bir ifade kodudur? Herhangi bir sql komutu aralarında katman olmadan mysql'e doğrudan erişir mi? – mate64

+0

Bu arada hangi kütüphaneyi kullanıyorsunuz? – RageZ

cevap

3

$strTable güvenli bir kaynaktan geldiğinden varsayarsak sadece

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

sayılı tablo adı sorgunun bir parametre değildir. Sen tablo adı bitiştirmek, önce sorgu dizesini oluşturmak gerekiyordu.

+0

bu kötü. belki paylaşabileceğin bir geçici çözüm kavramını biliyor musun? – mate64

+0

Bunun belgelendiği herhangi bir ipucu var mı? – Alex

+1

@msec Size geçici çözüm verdim. Sorgunuzu bir dize halinde oluşturun ve tablo adını bu dizeye birleştirin. –

1

kullanmak genellikle bu veritabanı soyutlama katmanı yer ele almaya hazır deyimi dayanır tutucu özelliği. RDBM'nin hazırlanan deyim özelliği sorguyu derler, eğer tablo belirtilmemişse sorguyu hazırlamanın mümkün olduğunu düşünmüyorum.

Kitaplığınızın escapement işlevini kullanmalı ve tablo adını sorguya dahil etmelisiniz.

örnek:

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

Kişisel eksik te BindParam ifadeleri. @Alex gibi bir php değişkenini yapmanın dışında tablo adını yapabileceğinizi sanmıyorum. Bunu PHP ile ne ilgisi var emin değilim http://php.net/manual/en/pdo.prepared-statements.php

+0

daha fazla sql enjeksiyonu çocuklar ;-) – RageZ

+0

Nasıl? Parametreleri kullanarak sql enjeksiyonu için neredeyse imkansızdır. Bu, kullanıcının, bu durumda saldırıya uğraması gereken tablo adını girmesine izin vermediği sürece. "Bir uygulama sadece hazırlanmış ifadeleri kullanıyorsa, geliştirici SQL enjeksiyonunun gerçekleşmeyeceğinden emin olabilir." – Robert

+0

$ tablename = 'foobar WHERE 1 = 1 -' derken, $ tablename türünün tehlikeli – RageZ

İlgili konular