簡単なエラーかもしれませんが助けてください。とても困っています。
前提
私はプログラミング初学者でteratail初心者です。
至らぬ点が多々あると思いますが、その時はコメント等で指摘していただければすぐに修正いたしますのでよろしくお願いいたします。
実現したいこと
SQL文により、条件にヒットしたレコードのappの値を”閲覧”に変更したいです。
SQL文はこのように実行しました。
php
1$sql2 = <<<EOS 2 UPDATE gaihaku SET 3 gaihaku.app = '閲覧' 4 FROM gaihaku 5 INNER JOIN member 6 ON gaihaku.id = member.id 7 AND gaihaku.app = '未閲覧' 8 AND gaihaku.teacher 9 IS NULL AND( gaihaku.state <= :now ) 10EOS; 11//エラーの特定がしやすいように改行を多めにしています。
また、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
1$sql2 = <<<EOS 2 UPDATE gaihaku SET 3 gaihaku.app = '閲覧' 4 FROM gaihaku 5 INNER JOIN member 6 ON gaihaku.id = member.id 7 AND gaihaku.app = '未閲覧' 8 AND gaihaku.teacher 9 IS NULL AND( gaihaku.state <= :now ) 10EOS; 11 12 if($name != ""){ 13 $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)"; 14 } 15 16 if($room != ""){ 17 $sql2 .=" AND gaihaku.roomnum=:room"; 18 } 19 20 if($class != ""){ 21 $sql2 .=" AND gaihaku.class=:class"; 22 } 23 24 if($tou != ""){ 25 $sql2 .=" AND gaihaku.tou=:tou"; 26 } 27 28 if($floor != ""){ 29 $sql2 .=" AND gaihaku.roomnum like :floor"; 30 } 31 try { 32 $this->pdo->beginTransaction(); 33 $stmh = $this->pdo->prepare($sql2); 34 //$stmh->bindValue(':app', "未閲覧", PDO::PARAM_STR ); 35 $stmh->bindValue(':now', date("Y/m/d H:i:s"), PDO::PARAM_STR ); 36 37 if($name != ""){ 38 $name = '%'.$name.'%'; 39 $stmh->bindValue(':last_name', $name, PDO::PARAM_STR); 40 $stmh->bindValue(':first_name', $name, PDO::PARAM_STR); 41 $stmh->bindValue(':k_last_name', $name, PDO::PARAM_STR); 42 $stmh->bindValue(':k_first_name', $name, PDO::PARAM_STR); 43 } 44 45 if($room != ""){ 46 $stmh->bindValue(':room', $room, PDO::PARAM_STR); 47 } 48 49 if($class != ""){ 50 $stmh->bindValue(':class', $class, PDO::PARAM_STR); 51 } 52 53 if($tou != ""){ 54 $stmh->bindValue(':tou', $tou, PDO::PARAM_STR); 55 } 56 57 if($floor != ""){ 58 $stmh->bindValue(':floor', $floor."%", PDO::PARAM_STR); 59 } 60 61 $stmh->execute(); 62 $this->pdo->commit(); 63 //print "データを" . $stmh->rowCount() . "件、更新しました。<br>"; 64 } catch (PDOException $Exception) { 65 $this->pdo->rollBack(); 66 print "エラー:" . $Exception->getMessage(); 67 }
試したこと
・bindValueの数や変数名がちゃんと対応しているか確認しました。
・SQL文の改行をなくし、無駄なスペースがないかどうかを確認しました。
・SQL文の項を減らして実行してみました。
FROM gaihaku INNER JOIN member ON gaihaku.id = member.id
辺りがエラーに引っかかっているそうです。
補足情報(FW/ツールのバージョンなど)
xamppをwindowsにダウンロードしてサーバにしています。(xamppのバージョンは調べられませんでした。)
PHP Version 7.4.26

回答2件
あなたの回答
tips
プレビュー