SQLSTATE [42000]: erro de sintaxe ou violação de acesso: 1064 tem um erro na sua sintaxe SQL-PHP-DOP [duplicado]

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

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

Não faço ideia de como resolver isto... ideias?

Author: Funk Forty Niner, 2010-12-28

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`.

Pessoalmente, não me daria ao trabalho de mudar o nome da coluna.

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 .

 89
Author: Jan Krüger, 2016-12-03 16:39:18

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);
 25
Author: uKolka, 2018-07-19 09:53:27

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.

 1
Author: Szymon Baranowski, 2016-07-24 11:25:49
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.

 0
Author: Kazim Noorani, 2016-10-05 11:05:19