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

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

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

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

PHP

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

Q&A

解決済

2回答

585閲覧

You can't specify target table 'xxx' for update in FROM clause のエラーに対してのsql文の質問

tou.23.bc

総合スコア50

MySQL

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

PHP

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

0グッド

0クリップ

投稿2022/09/06 12:14

前提

題名のエラーにひっかかり、下記のサイトの通りsql文を変更しましたが、

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にくわしいかた指摘していただきたいです。
https://poota.net/archives/786
https://nodoame.net/archives/8026

以下テーブル構造です
+----+---------+-------+------+
| id | is_done | title | pos |
+----+---------+-------+------+
| 19 | 0 | fg | 0 |
+----+---------+-------+------+

プリペアドステートメントをしていないことについては今回はおいておいてほしいです。

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

You can't specify target table 'xxx' for update in FROM clause xxxはテーブル名

php

1 private function add() 2 { 3 $title = filter_input(INPUT_POST, 'title'); 4 $stmt = $this->pdo->prepare("INSERT INTO todos (title) VALUES (:title)"); 5 $stmt->bindValue('title', $title); 6 $stmt->execute(); 7 } 8 9 private function addPos() 10 { 11 $title = filter_input(INPUT_POST, 'title'); 12 13 $this->pdo->query("UPDATE todos SET pos = ((SELECT id FROM (SELECT id FROM todos WHERE title = '$title') AS tmp) + 100 WHERE title = '$title'"); 14 15// todoリストにおいてタスクのタイトルをデータベースに保存するメソッドです。 16 17// addPosはposの値にid + 100で設定しています。 18 19 }

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

windows 11

docker で開発環境を構築しています。

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

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

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

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

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

guest

回答2

0

ベストアンサー

ロジックがおかしくて例示のSQLからでは何をやりたいかわかりづらいですね
特定のタイトルのレコードに対してposの値をid+100にするだけならこう

SQL

1UPDATE todos SET pos = id+100 WHERE title = 'fg';

pdoをご利用でしたらかならずprepareで処理してください

投稿2022/09/07 00:32

yambejp

総合スコア114843

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

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

tou.23.bc

2022/09/07 00:37

たしかに仰るとおりでした。ありがとうございます。
guest

0

diff

1- $this->pdo->query("UPDATE todos SET pos = ((SELECT id FROM (SELECT id FROM todos WHERE title = '$title') AS tmp) + 100 WHERE title = '$title'"); 2+ $this->pdo->query("UPDATE todos SET pos = ((SELECT id FROM todos WHERE title = '$title') AS tmp) + 100 WHERE title = '$title'");

投稿2022/09/06 15:38

phper.k

総合スコア3923

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

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

tou.23.bc

2022/09/07 00:06

回答いただきありがとうございます。 直していただいたコードでためしてみましたが 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 の同じエラーがはっせいしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問