Esto es lo que está causando el error:
$this->data->query('CREATE TABLE $this->subdomain');
$this->data->bind(':subdomain', $this->subdomain);
Como Michael Berkowski y Andrewsi señalaron en los comentarios, no puede vincular el valor a :subdomain
marcador de posición ya que no se anota como tal en la consulta e incluso si es los marcadores de posición de PDO solo se pueden usar para valores, no para nombres de bases de datos, tablas o columnas .
Si desea que ese tipo de consultas SQL se creen dinámicamente, debe encerrar los nombres de las bases de datos, tablas o columnas entre comillas graves (en caso de que sus columnas y nombres contengan palabras clave reservadas de SQL que puedan interrumpir la consulta) y valores de escape que se colocan, pero no puede usar MySQLi
para eso si ya está usando PDO
.
Dado que PDO no viene con real_escape_string()
que haría exactamente eso, y en la práctica no es necesario para escapar de valores como ese (a menos que realmente tenga columnas con nombres como Ye'name
que es totalmente estúpido en mi humilde opinión), filtro tan simple usando preg_match()
o preg_replace()
es lo suficientemente bueno:
if (preg_match('/^[\w_]+$/i', $this->subdomain)) {
// note the ` (backtick), and using " (double quotes):
$this->data->query("CREATE TABLE `{$this->subdomain}`");
} else {
// throw exception or error, do not continue with creating table
}
Solo algunos ejemplos del uso de '
(comilla simple - apóstrofo) contra "
(comillas dobles) cadenas en PHP:
$a = 1;
$b = 2;
echo '$a + $b'; // outputs: $a + $b
echo "$a + $b"; // outputs: 1 + 2
$c = array(5, 10);
echo '\$c[0] = {$c[0]}'; // outputs: \$c[0] = {$c[0]}
echo "\$c[0] = {$c[0]}"; // outputs: $c[0] = 5
El {}
La cadena dentro de comillas dobles se usa para arreglos y acceso a propiedades de objetos y se puede usar alrededor de variables regulares.
Escape $
entre comillas dobles se hace con \$
de lo contrario, asumirá una llamada de variable.