SQLSTATE [42000]: erro de sintaxe ou violação de acesso: 1064 tem um erro na sua sintaxe SQL-PHP-DOP [duplicado]
esta pergunta já tem uma resposta aqui:
eu olhei através de todas as outras postagens stackoverflow (e google) com o mesmo problema, mas nenhuma parecia resolver o meu problema.
Uso DOP e php.
A Minha código:
$vals = array(
':from'=>$email,
':to'=>$recipient,
':name'=>$name,
':subject'=>$subject,
':message'=>$message
);
print_r($vals);
try {
$pdo = new PDOConfig();
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "SELECT * FROM messages WHERE `message` LIKE :message";
$q = $pdo->prepare($sql);
$q->execute(array(':message' => $vals[':message']));
$resp = $q->fetchAll();
foreach ($resp as $row) {
throw new Exception('Please do not post the same message twice!');
}
$sql = "INSERT INTO messages (from, to, name, subject, message) VALUES (:from, :to, :name, :subject, :message)";
$q = $pdo->prepare($sql);
$q->execute($vals);
}
catch(PDOException $e) {
echo $e->getMessage();
}
e a primeira impressão dá
Array ( [:from] => [email protected] [:to] => [email protected] [:name] => abc [:subject] => abc [:message] => abc )
que é esperado (nenhum é nulo)
mas emite o erro
Não faço ideia de como resolver isto... ideias?QLSTATE[42000]: erro de Sintaxe ou de violação de acesso: 1064 Você tem um erro em sua sintaxe SQL; verifique o manual que corresponde à sua versão do servidor MySQL para a direita sintaxe para usar perto de 'a partir de, para, nome, assunto, mensagem) VALUES ('[email protected]', '[email protected]' na linha 1
4 answers
from
é uma palavra-chave em SQL. Você não pode usá-lo como um nome de coluna sem citá-lo. No MySQL, coisas como nomes de colunas são citadas usando backticks, ou seja `from`
.
PS. como indicado nos comentários, to
é outra palavra-chave SQL, por isso também precisa de ser citada. Convenientemente, o pessoal da drupal.org manter uma lista de palavras reservadas em SQL .
Eu tenho este erro exato, mas no meu caso eu estava vinculando valores para a cláusula LIMIT
sem especificar o tipo. Vou deixar isto aqui para o caso de alguém ter este erro pela mesma razão. Sem especificar o tipo LIMIT :limit OFFSET :offset;
resultou em LIMIT '10' OFFSET '1';
em vez de LIMIT 10 OFFSET 1;
. O que ajuda a corrigir isso é o seguinte:
$stmt->bindParam(':limit', intval($limit, 10), \PDO::PARAM_INT);
$stmt->bindParam(':offset', intval($offset, 10), \PDO::PARAM_INT);
O mesmo erro DOP na consulta sql ao tentar inserir no valor da base de dados a partir de uma matriz multidimencial:
$sql = "UPDATE test SET field=arr[$s][a] WHERE id = $id";
$sth = $db->prepare($sql);
$sth->execute();
A extrair o array arr[$s][a]
da consulta sql, usando em vez da variável que o contém, corrige o problema.
ALTER TABLE `{$installer->getTable('sales/quote_payment')}`
ADD `custom_field_one` VARCHAR( 255 ) NOT NULL,
ADD `custom_field_two` VARCHAR( 255 ) NOT NULL;
Adicione um 'backtick' ou seja, "'" correctamente. Escreva o seu nome getTable e o nome da coluna entre o backtick.