SQL

【SQLエラー解決】Uncaught PDOException: 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

sql-アイキャッチ

こんにちは!ゆーたろうです。

この記事では、MySQLでデータベースの値を取得しようとした際に発生したエラーについて、発生原因とその対処策を紹介していきます。

エラー内容

Fatal error: Uncaught PDOException: 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 ‘1 = (SELECT 【フィールド名】 FROM 【テーブル名】 WHERE id =? )’ at line 1 in 【ファイル名.php】:27 Stack trace: #0 【ファイル名】.php(27): PDO->prepare(‘SELECT 【テーブル名】…’) #1 【ファイル名】.php(50): 【メソッド名】(1) #2 {main} thrown in 【ファイル名】.php on line 27

意味

構文エラーまたはアクセス違反:1064 SQL構文にエラーがあります。 MySQLファイルのバージョンに対応するマニュアルで、[ファイル名.php]:27スタックの1行目の「1 =(SELECT【フィールド名】FROM【テーブル名】WHERE id =?)」の近くで使用する正しい構文を確認します。 trace:#0【ファイル名】.php(27):PDO-> prepare( ‘SELECT【テーブル名】…’)#1【ファイル名】.php(50):【メソッド名】(1)# 2 {main}が27行目の【ファイル名】.phpにスローされました

Google翻訳

簡単に言えば、SQLの構文がおかしいということです。

「1 =(SELECT【フィールド名】FROM【テーブル名】WHERE id =?)」の近くで使用する正しい構文を確認します。

とあるので、この近辺を見直します。

問題個所

$sql = 
  "SELECT `フィールド名1-1` , `フィールド名1-2` FROM テーブル名1 WHERE フィールド名1-3 =:id"
   . "AND 1 = (SELECT フィールド名2-1 FROM テーブル名2 WHERE フィールド名2-2 =:id )";

上記のようなsqlを作成していましたが、よく見ると、「id」と「AND」の間にスペースがないことが分かります。

SELECT F1-1 , F1-2 FROM T1 WHERE F1-3 =:idAND 1 = (SELECT F2-1 FROM T2 WHERE F2-2 =:id )

参考資料

SQLSTATE[42000]: Syntax error or access violation: が発生するが原因がわからない

解決策

今回の例で言うと、「id」と「AND」の間に半角スペースを入れることで、対処できました。