Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

SQLSTATE[42000]:Erro de sintaxe ou violação de acesso:1064


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.