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

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

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

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

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

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

Q&A

解決済

1回答

1630閲覧

WordPressで「テーブル接頭辞(wp_)」を書かないと、LOCK TABLESが効かなくなるのはどうしてですか?

yakan

総合スコア19

MySQL

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

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

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

0グッド

0クリップ

投稿2020/07/27 03:48

編集2020/07/27 05:11

###実現したいこと
テーブル接頭辞(wp_)を省略した状態で、LOCK TABLESを利かせたいです。

###発生している問題・エラーメッセージ
テーブル接頭辞(wp_)を省略した状態で、LOCK TABLESが効きません。
こちらのエラーとなります。「// 24行目」に対してのエラーです。

Table 'medias' was not locked with LOCK TABLES

###該当のソースコード
最初に御覧頂きたいのはこちらのソースコードです。
var_dump($gets);nullとなり、プラグイン「QeuryMonitor」によって上記エラーが確認できます。

php

1 2$gets = my_insert_wp_medias(); 3var_dump($gets); // -> null となる 4 5function my_insert_wp_medias(){ 6 global $wpdb; 7 8 /*----------------------------- 9 取得の処理 10 -----------------------------*/ 11 $sql = "LOCK TABLES wp_medias WRITE, wp_media_titles WRITE"; 12 $wpdb->query($sql); 13 14 if ( $wpdb->query($sql) === false ) return 'ロックできませんでした'; 15 16 $kind_id = 9; 17 $sql = " 18 SELECT medias.*, GROUP_CONCAT(media_titles.lang_id separator ',') as title_lang_ids 19 FROM wp_medias medias 20 LEFT JOIN wp_media_titles media_titles ON media_titles.medias_ID=medias.ID 21 WHERE medias.kind_id=$kind_id 22 GROUP BY medias.ID 23 "; 24 25 $gets = $wpdb->get_results( $sql ); // 24行目 26 if ( $wpdb->last_error ) { 27 $gets = $wpdb->last_error; 28 } else { 29 30 // 質問のためここで return を実行 31 $gets = '取得成功'; 32 return $gets; 33 34 /*----------------------------- 35 保存の処理 36 -----------------------------*/ 37 // 実際はここにINSERTなどが続きます 38}

###試したこと
まずエラーに従い、テーブルロックができていないのならそれを確認すべく上記コードにある次の一文を追加しましたが、これはreturnされませんでした。よってLOCK TABLES自体は成功していることになると思います。

if ( $wpdb->query($sql) === false ) return 'ロックできませんでした';

次によくよくエラーを見てみますとwp_mediasでなくmediasとなっていることに気が付きまして、$sqlを次のように接頭辞(wp_)を付けた状態で実行しましたら問題なく動作し、var_dump($gets);取得成功となったのです。

$sql = " SELECT wp_medias.*, GROUP_CONCAT(wp_media_titles.lang_id separator ',') as title_lang_ids FROM wp_medias LEFT JOIN wp_media_titles wp_media_titles ON wp_media_titles.medias_ID=wp_medias.ID WHERE wp_medias.kind_id=$kind_id GROUP BY wp_medias.ID ";

これが大変疑問です。
たしかに接頭辞(wp_)は省略しているものの、それはあくまでMySQLのエイリアス機能によるものであって、捜査対象のテーブルについては、該当のソースコードでも接頭辞(wp_)をつけて指定しているはずです。

なのにどうして先のようなエラーとなってしまうのでしょうか?

質問ですが、接頭辞(wp_)を省略してはいけないなどのルールがあるのでしたらソースを知りたいですし、もし省略してもできる方法があればそれをお尋ねできれば幸いです。

補足情報

ご不要とは思いますがCREATEINSERTのサンプルを掲載させていただきます。

SQL

1CREATE TABLE wp_medias (`ID` int, `kind_id` int); 2INSERT INTO wp_medias (`ID`, `kind_id`) 3VALUES (10, 9), (11, 9), (12, 9), (13, 9); 4 5CREATE TABLE wp_media_titles (`medias_ID` int, `lang_id` int, `title` varchar(3)); 6INSERT INTO wp_media_titles (`medias_ID`, `lang_id`, `title`) 7VALUES (10, 1, 'a'), (10, 2, 'エー'), (11, 1, 'b'), (12, 1, 'c'), (13, 2, 'ディー'); 8 9 10 11

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

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

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

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

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

sazi

2020/07/27 04:15

LOCKの確認を行うなら、複数のセッションで行う必要がありますが、どのように確認していますか?
yakan

2020/07/27 04:40

こんにちは。セッションの話というよりも、エイリアスを使う(接頭辞を省略する)とLOCKでエラーが生じるという話だと思うのですが…
sazi

2020/07/27 04:50 編集

LOCKテーブルは他のセッションに対してのものです。 自身のセッションでロックされたら困りますよね。 なので、自身のセッションでは、ロックされないのはエラーではなく正常だと思うのですが。
yakan

2020/07/27 04:56

すみませんお話が見えてこないです。それが正常だったとして、該当のソースコードで「取得成功」でなく「null」となってしまうのが問題なのですが、その原因はわかりますか?
sazi

2020/07/27 05:10 編集

回答が付いたようですので、コメントはスルーして下さい
yakan

2020/07/27 05:12

「get_results」のエラー取得は「$wpdb->last_error」で正しいです。しかしnullが返るので、処理が「// 24行目」で止まっていて、「$wpdb->last_error」を返せていないということになります。 で、その処理が止まっている原因が、エラーメッセージにある内容で、質問の発端です。 もちろんなのでselect結果も取得できていません。
sazi

2020/07/27 05:50

エラー自体は「エイリアスでLOCKしろ」って事なんでしょうけど、それが分かるならそんな仕様にしなければいいのにって感じですね。
yakan

2020/07/27 16:41

たしかにそうですね笑
guest

回答1

0

ベストアンサー

LOCK TABLES および UNLOCK TABLES 構文

多分なのですが、このページの後半あたりの制限にひっかかってるように見えます。

以下の文でページ内検索してみてください。

ステートメントがエイリアスを使用してテーブルを参照する場合は、その同じエイリアスを使用してテーブルをロックする必要があります。エイリアスを指定しないでテーブルをロックすることはできません。

正直、この制限は初めて知りました

最初のLOCK TABLE時に
LOCK TABLES wp_medias as medias とするならばそれ以降も medias というaliasをつけないと
いけませんということだと思います。

投稿2020/07/27 05:02

編集2020/07/27 05:21
YakumoSaki

総合スコア2027

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

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

sazi

2020/07/27 05:18 編集

本当だ。先ずはリファレンスの一読ですね。 自己結合した場合は、エイリアスの内何れかって事なんですかねー やはりMySQLはトランザクション系が得意じゃなさそうですね。
yakan

2020/07/27 16:39

そんな制限がありましたか。リンク付きでどうもありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問