while statements query prepared fetch_assoc php sql mysql pdo mysql-error-1064

statements - SQLSTATE[42000]: error de sintaxis o violación de acceso: 1064 Tiene un error en su sintaxis SQL-PHP-PDO



prepare sql (4)

Mismo error de pdo en la consulta sql al intentar insertar en el valor de la base de datos de la matriz multidimential:

$sql = "UPDATE test SET field=arr[$s][a] WHERE id = $id"; $sth = $db->prepare($sql); $sth->execute();

La extracción de la matriz arr[$s][a] de la consulta sql, utilizando en su lugar la variable que contiene soluciona el problema.

Revisé todas las demás publicaciones de stackoverflow (y google) con el mismo problema, pero ninguna parecía resolver mi problema.

Estoy usando pdo y php.

Mi 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(); }

y el primer print_r da

Array ( [:from] => [email protected] [:to] => [email protected] [:name] => abc [:subject] => abc [:message] => abc )

que se espera (ninguno es nulo)

pero produce el error

QLSTATE [42000]: error de sintaxis o violación de acceso: 1064 Tiene un error en su sintaxis SQL; revise el manual que corresponde a su versión del servidor MySQL para la sintaxis correcta para usar cerca de ''de, a, nombre, asunto, mensaje) VALUES ('' [email protected] '','' [email protected] ''en la línea 1

No tengo idea de cómo arreglar esto ... ¿ideas?


Tengo este error exacto, pero en mi caso estaba vinculando valores para la cláusula LIMIT sin especificar el tipo. Acabo de dejar esto aquí en caso de que alguien reciba este error por el mismo motivo. Sin especificar el tipo LIMIT :limit OFFSET :offset; dio como resultado LIMIT ''10'' OFFSET ''1''; en lugar de LIMIT 10 OFFSET 1; . Lo que ayuda a corregir eso es lo siguiente:

$stmt->bindParam('':limit'', intval($limit, 10), /PDO::PARAM_INT); $stmt->bindParam('':offset'', intval($offset, 10), /PDO::PARAM_INT);


from es una palabra clave en SQL. No puede usarlo como un nombre de columna sin citarlo. En MySQL, las cosas como los nombres de las columnas se cotizan utilizando los backticks, es decir, `from` .

Personalmente, no me molestaría; Solo cambiaría el nombre de la columna.

PD. como se señala en los comentarios, to es otra palabra clave SQL, por lo que también necesita ser citada. Convenientemente, la gente de drupal.org mantiene una lista de palabras reservadas en SQL .


ALTER TABLE `{$installer->getTable(''sales/quote_payment'')}` ADD `custom_field_one` VARCHAR( 255 ) NOT NULL, ADD `custom_field_two` VARCHAR( 255 ) NOT NULL;

Agregue backtick, es decir, "` "correctamente. Escriba su nombre de getTable y nombre de columna entre backtick.