SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax — PHP — PDO

609,581

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.

Share:
609,581
willium
Author by

willium

Developer

Updated on March 15, 2020

Comments

  • willium
    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
    Mike almost 12 years
    "order" is also reserved. Doh! Thanks for the post :-)
  • Your Common Sense
    Your Common Sense about 11 years
    turning off emulation also helps
  • CoR
    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
    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
    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
    Funk Forty Niner over 7 years
    I found this Q&A through a search for another question similar to this one. They (the OP) did tick the from, it's the to 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 ticked from, and I have rolled the question back to its original state.
  • sansknwoledge
    sansknwoledge about 7 years
    the reserved word link has been changed dev.mysql.com/doc/refman/5.7/en/keywords.html
  • adib16
    adib16 over 3 years
    thats very nice