2011-12-22 17 views
5

¿Es posible usar un valor dinámico dentro de un comando SELECT FROM sql?Seleccionar tabla (FROM) por cadena

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

resultado:

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

No estoy seguro de lo que esto tiene que ver con PHP ... – BoltClock

+0

¿Por qué? ¿Algún comando sql accede directamente a mysql sin capas intermedias? – mate64

+0

por cierto, ¿qué biblioteca estás usando? – RageZ

Respuesta

3

Suponiendo $strTable es de una fuente segura sólo tiene que utilizar

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

No. El nombre de la tabla no puede ser un parámetro de la consulta. Que había necesidad de construir su primera cadena de consulta, concatenando el nombre de tabla en.

+0

eso es pobre. ¿Conoces un concepto de solución temporal que tal vez puedas compartir? – mate64

+0

¿Alguna pista donde esto está documentado? – Alex

+1

@msec Te di la solución. Cree su consulta en una cadena y concatene el nombre de la tabla en esa cadena. –

1

por lo general los capa de abstracción de base de datos se basa en la declaración preparada para manejar el lugar característica del titular. La característica de declaración preparada del RDBM compila la consulta, no creo que sea posible preparar la consulta si la tabla no está especificada.

Debe usar la función de escape de su biblioteca e incluir el nombre de la tabla en la consulta.

ejemplo:

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

Sus declaraciones faltantes te bindParam. No creo que puedas hacer el nombre de tabla más que hacer una variable php como @Alex. Aquí está el código de una declaración preparada:

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

más inyección sql chicos ;-) – RageZ

+0

¿Cómo? El uso de parámetros es casi imposible para la inyección sql. eso es a menos que esté permitiendo que el usuario ingrese su nombre de tabla, que en ese caso debería ser pirateado. "Si una aplicación utiliza exclusivamente declaraciones preparadas, el desarrollador puede estar seguro de que no se producirá ninguna inyección SQL". – Robert

+0

qué tal $ tablename = 'foobar WHERE 1 = 1 -', ya que no sabemos dónde $ tablename viene de tipo peligroso – RageZ

Cuestiones relacionadas