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

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

新規登録して質問してみよう
ただいま回答率
86.12%
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などのソフトウェアやライブラリモジュールなどを利用することが可能です。

解決済

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

saitou_san
saitou_san

総合スコア10

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などのソフトウェアやライブラリモジュールなどを利用することが可能です。

2回答

0グッド

0クリップ

343閲覧

投稿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

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

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見なくて良くなります。

回答2

0

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

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

投稿2022/11/18 09:20

Orlofsky

総合スコア16248

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

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

総合スコア1425

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

saitou_san

2022/11/18 14:48

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

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

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などのソフトウェアやライブラリモジュールなどを利用することが可能です。