Isto é o que está causando o erro:
$this->data->query('CREATE TABLE $this->subdomain');
$this->data->bind(':subdomain', $this->subdomain);
Como Michael Berkowski e andrewsi observaram nos comentários, você não pode vincular valor a
:subdomain
placeholder, uma vez que não é indicado como na consulta e mesmo que seja placeholders PDO só podem ser usados para valores que não sejam nomes de banco de dados, tabela ou coluna . Se você deseja que esse tipo de consulta SQL seja criado dinamicamente, você precisa colocar os nomes de banco de dados, tabela ou coluna entre aspas acento grave (caso suas colunas e nomes contenham palavras-chave reservadas SQL que possam interromper a consulta) e valores de escape que são colocados, mas você não pode usar
MySQLi
para isso se já estiver usando o PDO
. Como o PDO não vem com
real_escape_string()
método que faria exatamente isso e, na prática, não é necessário escapar de valores como esse (a menos que você realmente tenha colunas nomeadas como Ye'name
que é totalmente estúpido IMHO), filtro tão simples usando preg_match()
ou preg_replace()
é bom o suficiente: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
}
Apenas alguns exemplos de uso de
'
(aspas simples - apóstrofo) contra "
(aspas duplas) strings em 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
O
{}
a string entre aspas duplas é usada para acesso a arrays e propriedades de objetos e pode ser usada em torno de variáveis regulares.Escape
$
entre aspas duplas é feito por \$
caso contrário, assumirá uma chamada de variável.