2011-12-22 14 views
5

È possibile utilizzare un valore dinamico all'interno di un comando SELECT FROM sql?Seleziona tabella (FROM) per stringa

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

risultato:

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

Non sono sicuro di ciò che questo ha a che fare con PHP ... – BoltClock

+0

Perché? Qualunque comando sql accede direttamente a mysql senza livelli intermedi? – mate64

+0

a proposito di quale libreria stai usando? – RageZ

risposta

3

Supponendo $strTable da una fonte sicura basta usare

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

No. Il nome della tabella non può essere un parametro della query. Avresti bisogno per costruire la vostra stringa di query prima, concatenando il nome della tabella in.

+0

questo è povero. conosci un concetto di workaround forse che puoi condividere? – mate64

+0

Qualsiasi indizio dove questo è documentato? – Alex

+1

@msec Ti ho dato la soluzione. Costruisci la tua query in una stringa e concatena il nome della tabella in quella stringa. –

1

solito quelli strato di astrazione del database si basa sulla dichiarazione preparata per gestire il posto caratteristica del titolare. La funzione di istruzione preparata dell'RDBM compila la query, non penso sia possibile preparare la query se la tabella non è specificata.

È necessario utilizzare la funzione di scappamento della libreria e includere il nome della tabella nella query.

esempio:

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

vostri mancanti dichiarazioni TE BindParam. Non penso che tu possa fare il nome della tabella se non fare una variabile php come ha fatto @Alex. Ecco il codice per una dichiarazione preparata:

<?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

più sql injection guys ;-) – RageZ

+0

Come? Utilizzando i parametri è quasi impossibile per l'iniezione sql. questo a meno che non permetta all'utente di inserire il nome del suo tavolo che in tal caso dovrebbe essere violato. "Se un'applicazione utilizza esclusivamente istruzioni preparate, lo sviluppatore può essere sicuro che non si verificherà alcuna iniezione SQL." – Robert

+0

cosa ne pensi di $ tablename = 'foobar WHERE 1 = 1 -', dal momento che non sappiamo dove $ tablename provenga dal tipo di pericoloso – RageZ

Problemi correlati