エラー:SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax;

簡単なエラーかもしれませんが助けてください。とても困っています。

前提

私はプログラミング初学者でteratail初心者です。
至らぬ点が多々あると思いますが、その時はコメント等で指摘していただければすぐに修正いたしますのでよろしくお願いいたします。

実現したいこと

SQL文により、条件にヒットしたレコードのappの値を”閲覧”に変更したいです。
SQL文はこのように実行しました。

php

$sql2 = <<<EOS UPDATE gaihaku SET gaihaku.app = '閲覧' FROM gaihaku INNER JOIN member ON gaihaku.id = member.id AND gaihaku.app = '未閲覧' AND gaihaku.teacher IS NULL AND( gaihaku.state <= :now ) EOS;//エラーの特定がしやすいように改行を多めにしています。

また、PHPの処理によりSQL文を追加していき検索条件を複雑にする処理をしています。(そのコードは後述します)
以下のエラーを出なくしたいです。

発生している問題・エラーメッセージ

エラー:SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'FROM gaihaku INNER JOIN member ...' at line 3

該当のソースコード

php

$sql2 = <<<EOS UPDATE gaihaku SET gaihaku.app = '閲覧' FROM gaihaku INNER JOIN member ON gaihaku.id = member.id AND gaihaku.app = '未閲覧' AND gaihaku.teacher IS NULL AND( gaihaku.state <= :now ) EOS; if($name != ""){ $sql2 .=" AND(member.last_name like :last_name OR member.first_name like :first_name OR member.k_last_name like :k_last_name OR member.k_last_name like :k_first_name)"; } if($room != ""){ $sql2 .=" AND gaihaku.roomnum=:room"; } if($class != ""){ $sql2 .=" AND gaihaku.class=:class"; } if($tou != ""){ $sql2 .=" AND gaihaku.tou=:tou"; } if($floor != ""){ $sql2 .=" AND gaihaku.roomnum like :floor"; } try { $this->pdo->beginTransaction(); $stmh = $this->pdo->prepare($sql2); //$stmh->bindValue(':app', "未閲覧", PDO::PARAM_STR ); $stmh->bindValue(':now', date("Y/m/d H:i:s"), PDO::PARAM_STR ); if($name != ""){ $name = '%'.$name.'%'; $stmh->bindValue(':last_name', $name, PDO::PARAM_STR); $stmh->bindValue(':first_name', $name, PDO::PARAM_STR); $stmh->bindValue(':k_last_name', $name, PDO::PARAM_STR); $stmh->bindValue(':k_first_name', $name, PDO::PARAM_STR); } if($room != ""){ $stmh->bindValue(':room', $room, PDO::PARAM_STR); } if($class != ""){ $stmh->bindValue(':class', $class, PDO::PARAM_STR); } if($tou != ""){ $stmh->bindValue(':tou', $tou, PDO::PARAM_STR); } if($floor != ""){ $stmh->bindValue(':floor', $floor."%", PDO::PARAM_STR); } $stmh->execute(); $this->pdo->commit(); //print "データを" . $stmh->rowCount() . "件、更新しました。<br>"; } catch (PDOException $Exception) { $this->pdo->rollBack(); print "エラー:" . $Exception->getMessage(); }

試したこと

・bindValueの数や変数名がちゃんと対応しているか確認しました。
・SQL文の改行をなくし、無駄なスペースがないかどうかを確認しました。
・SQL文の項を減らして実行してみました。

FROM gaihaku INNER JOIN member ON gaihaku.id = member.id

辺りがエラーに引っかかっているそうです。

補足情報(FW/ツールのバージョンなど)

xamppをwindowsにダウンロードしてサーバにしています。(xamppのバージョンは調べられませんでした。)
PHP Version 7.4.26

コメントを投稿

0 コメント