質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.51%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

XAMPP

XAMPP(ザンプ)は、ウェブアプリケーションの実行に必要なフリーソフトウェアをパッケージングしたApacheディストリビューションです。 XAMPPひとつインストールするだけで、Apache、MySQL、PHP、Perlなどのソフトウェアと、 phpMyAdminなどの管理ツール、SQLiteなどのソフトウェアやライブラリモジュールなどを利用することが可能です。

Q&A

解決済

2回答

2279閲覧

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

saitou_san

総合スコア32

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

XAMPP

XAMPP(ザンプ)は、ウェブアプリケーションの実行に必要なフリーソフトウェアをパッケージングしたApacheディストリビューションです。 XAMPPひとつインストールするだけで、Apache、MySQL、PHP、Perlなどのソフトウェアと、 phpMyAdminなどの管理ツール、SQLiteなどのソフトウェアやライブラリモジュールなどを利用することが可能です。

0グッド

0クリップ

投稿2022/11/18 08:48

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

前提

私はプログラミング初学者で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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2022/11/18 10:55

>スコア私はプログラミング初学者でteratail初心者です。 書く必要ないかと。どうしても伝えたければ「初心者アイコン」を質問につけるだけにとどめてください。 質問は編集できます。
m.ts10806

2022/11/18 10:58

あと、PHPからいきなり実行するのではなく、 DB直実行(コマンドやクライアントツール)で想定の結果が得られるSQLができてから PHPから実行してください。そのためにPHP組むのは効率もあまりよくありません。 PHPにとってSQLは外部の機能ですから、SQL単体実行での動作確認は必須です。 PHPはSQLのような「文字列」をDBに対して渡して結果を得ているだけで、 PHPそのものがSQLを実行しているわけではありません。
saitou_san

2022/11/18 14:40

SQL単体実行をしてみたのですが、同じエラーコードがでました。
m.ts10806

2022/11/18 23:08

同じものが出るのおは当然で(PHPは実行結果を得ているから) 「先にDBに直実行して想定の結果を得られるようになってからPHPから実行しましょう」という意味です。 SQLの構文が間違っているのか、PHPからのアクセスが間違っているのか、問題切り分けができます。 現状は「PHPにも問題がある可能性」を含んだ両面からのアプローチをしようとしていて、 質問者さんも切り分けが難しくなっていると思います。 直実行で想定の結果を得られなければSQLだけ見ていれば良いので、PHP見なくて良くなります。
guest

回答2

0

mysqlでjoinした結果をupdate
書き方がかなり間違っています。

CREATE TABLE文を提示できるようになってください。

投稿2022/11/18 09:20

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

updateはupdate … set … where…が構文でFromの出る幕はありません。
こういう感じかな。

SQL

1UPDATE gaigaku INNER JOIN member 2 ON gaihaku.id = member.id 3SET app = '閲覧' 4WHERE gaihaku.app = '未閲覧' 5 AND gaihaku.teacher 6 IS NULL AND( gaihaku.state <= :now )

投稿2022/11/18 09:18

matukeso

総合スコア1590

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

saitou_san

2022/11/18 14:48

コピペして改行をなくしたら無事動きました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問