SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax — PHP — PDO
Solution 1
from
is a keyword in SQL. You may not used it as a column name without quoting it. In MySQL, things like column names are quoted using backticks, i.e. `from`
.
Personally, I wouldn't bother; I'd just rename the column.
PS. as pointed out in the comments, to
is another SQL keyword so it needs to be quoted, too. Conveniently, the folks at drupal.org maintain a list of reserved words in SQL.
Solution 2
I've got this exact error, but in my case I was binding values for the LIMIT
clause without specifying the type. I'm just dropping this here in case somebody gets this error for the same reason. Without specifying the type LIMIT :limit OFFSET :offset;
resulted in LIMIT '10' OFFSET '1';
instead of LIMIT 10 OFFSET 1;
. What helps to correct that is the following:
$stmt->bindParam(':limit', intval($limit, 10), \PDO::PARAM_INT);
$stmt->bindParam(':offset', intval($offset, 10), \PDO::PARAM_INT);
Solution 3
ALTER TABLE `{$installer->getTable('sales/quote_payment')}`
ADD `custom_field_one` VARCHAR( 255 ) NOT NULL,
ADD `custom_field_two` VARCHAR( 255 ) NOT NULL;
Add backtick i.e. " ` " properly. Write your getTable name and column name between backtick.
Solution 4
Same pdo error in sql query while trying to insert into database value from multidimential array:
$sql = "UPDATE test SET field=arr[$s][a] WHERE id = $id";
$sth = $db->prepare($sql);
$sth->execute();
Extracting array arr[$s][a]
from sql query, using instead variable containing it fixes the problem.
Comments
-
willium about 4 years
I've looked through all the other StackOverflow (and google) posts with the same problem, but none seemed to address my problem.
I am using PDO and PHP.
My code:
$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(); }
and the first print_r gives
Array ( [:from] => [email protected] [:to] => [email protected] [:name] => abc [:subject] => abc [:message] => abc )
which is expected (none are null)
but it outputs the error
SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'from, to, name, subject, message) VALUES ('[email protected]', '[email protected]' at line 1
No idea how to fix this. any ideas?
-
Mike almost 12 years"order" is also reserved. Doh! Thanks for the post :-)
-
Your Common Sense about 11 yearsturning off emulation also helps
-
CoR over 10 years@Your Common Sense: Why does it help? I had same limit values binding problem and turning off emulation did help :) But why?
-
uKolka over 10 years@CoR It's explained pretty good in the wiki that he linked to. PDO treats placeholder parameters as strings by default (with emulation on). Limits become "... LIMIT '10' OFFSET '1';" and that's not what you want. If you turn emulation off MySQL handles the placeholder values according to their type.
-
Aditya M P about 8 years"UNLOCK" is also reserved (dev.mysql.com/doc/refman/5.5/en/keywords.html) :-) thanks, had run into this same problem.
-
Funk Forty Niner over 7 yearsI found this Q&A through a search for another question similar to this one. They (the OP) did tick the
from
, it's theto
that wasn't ticked afterwards. Look at the error here they posted after their edit:right syntax to use near 'to
, edit being stackoverflow.com/posts/4544051/revisions. The answer should be edited in regards to this. The OP also edited their question with the tickedfrom
, and I have rolled the question back to its original state. -
sansknwoledge about 7 yearsthe reserved word link has been changed dev.mysql.com/doc/refman/5.7/en/keywords.html
-
adib16 over 3 yearsthats very nice