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

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

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

MySQLiはPHP5より導入されているデータベース用のドライバです。MySQL 4.1.3以降の新しい機能の利点をまとめています。

WordPress

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

PHP

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

Q&A

0回答

856閲覧

Wordpressの固定ページで、mysqlの値を1つ増やすSQL文を実行すると、2つ増える

kimukimu009

総合スコア33

mysqli

MySQLiはPHP5より導入されているデータベース用のドライバです。MySQL 4.1.3以降の新しい機能の利点をまとめています。

WordPress

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

PHP

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

0グッド

0クリップ

投稿2021/11/29 03:28

編集2021/11/30 00:37

前提・実現したいこと

Wordpressの固定ページ(Aページとします)を作成しています。
その固定ページでは、DBと連携したプログラムをPHPで記述しています。
DBは、mySQLiで、「mysqli」文を使って、値を1つ増やすSQL文を記述し、
そのページが開くと、値がひとつ増える動きを実現したい。
つまり、noが1の行をみつけ、aの値を、ひとつ増やしたい。

Aページを開く前のDB

no a
1 2

Aページを開いた後のDB(期待すること)

no a
1 3

■■質問の内容
上記のAページを、ワードプレスの固定ページとして作成した場合、

Aページを開いた後のDB(値が2つ増えて、期待はずれの結果に)

no a
1 4

該当のソースコード

<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>結果</title> <?php $shoppass="2014"; $server = "○○○○"; $userName = "○○○○"; $password = "○○○○"; $dbName = "○○○○"; $mysqli = new mysqli($server, $userName, $password,$dbName); if ($mysqli->connect_error){ echo $mysqli->connect_error; exit(); }else{ $mysqli->set_charset("utf-8"); } $now = date('Y/m/d H:i:s'); echo $now; $sql = "update woma2 set use_times = use_times+1 where pass = '" . $shoppass . "'"; $result = $mysqli -> query($sql); //クエリー失敗 if(!$result) { echo $mysqli->error; exit();} ?> </html> WordPressのfunction.phpの中に、これを記述しています。 //ショートコードを使ったphpファイルの呼び出し方法 function my_php_Include($params = array()) { extract(shortcode_atts(array('file' => 'default'), $params)); ob_start(); include(STYLESHEETPATH . "/template-parts/$file.php"); return ob_get_clean(); } add_shortcode('myphp', 'my_php_Include');

試したこと

上記のAページを、ワードプレスとは関係ない、HTMLページとして作成した場合、
Aページを開いた後のDBは、期待どおりの結果が得られた。

no a
1 3

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

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

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

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

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

tabuu

2021/11/29 08:38

どのタイミングで処理を実行していますか? 処理を2回実行していませんか?
kimukimu009

2021/11/29 08:42

していないんですよ。 何回も確認しました。 Aページを、テストで作って、 Aページを開いて、DBを参照しながら、実験しました。 結果は、 WordPressの固定ページでつくったAページでは、 2つづつ増え、 普通のHTMLページとしてつくったAページでは、 1つづつ増えました。 ロリポップで契約している2つのサーバで、 同じことをやりましたが、結果は、同じでした。
kimukimu009

2021/11/29 08:42

つまり、処理は1回しか実行していません。
tabuu

2021/11/29 09:38

●固定ページ表示後に(自動で)リロードorリダイレクトして2回表示されていませんか? ●下記のようにSQL文実行直後に処理を強制終了しDBの値を確認しても2増えていますか? $result = $mysqli -> query($sql); die(); ●加算するSQLではなくレコードを追加するSQLに変更しても2レコードは追加されませんか?
kimukimu009

2021/11/29 09:55

確かに、2回実行されていました。 die();でとまりました!! しかしながら、本来のプログラムでは、 die();で止めるわけにはいかず、 それ以降も、SQL実行が何個かあるのですが、 どのようにすればよいのでしょうか?
tabuu

2021/11/29 10:10

2回実行さる原因を特定しないと改善は難しいと思います。 まずは固定ページのソースコードを質問文に追記してください。
kimukimu009

2021/11/29 21:38

phpファイルのソースコードになります。 このPHPファイルを、Wordpressの固定ページの中で、 ショートコードで呼び出して実行シました所、期待はずれ(値が2つ増える) の結果に。 また、このPHPファイルを、直接実行する(ショートコードで呼び出さずに、直接実行する)と、期待通りの結果になります。
kimukimu009

2021/11/29 21:40

とすれば、ショートコードで呼び出すところに、問題があるのでしょうか? WordPressのfunction.phpの中に、これを記述しています。 //ショートコードを使ったphpファイルの呼び出し方法 function my_php_Include($params = array()) { extract(shortcode_atts(array('file' => 'default'), $params)); ob_start(); include(STYLESHEETPATH . "/template-parts/$file.php"); return ob_get_clean(); } add_shortcode('myphp', 'my_php_Include');
kimukimu009

2021/11/29 21:48

興味深い質問&回答を見つけました。 function.phpがワードプレスで複数回呼ばれるのは、普通という こと?かもしれません。 ------------------- WordPressで、functions.php が複数回読まれるのは正常なのでしょうか?https://teratail.com/questions/284189 -------------------
tabuu

2021/11/29 23:24

ショートコードは固定ページに複数貼っていないですよね。 「include」を「include_once」に変更するとどうなりますか? ※ソースコードはこちらではなく、質問文に追記しておいてください。
kimukimu009

2021/11/30 00:35

ありがとうございます。 「include」を「include_once」に変更すると、本PHPファイル(便器上簡略化している)では、値がひとつ増えた(期待通りの答え)になりました!! しかしながら、簡略化していないPHPファイル(DB更新のあとに、ある条件で、HTML表示させる)では、値がひとつ増えた(期待通りの答え)になりましたが、PHPファイルの中の、「HTML表示させる所」が、なにも表示されなくなりました。 PHPファイルの実行結果が、途中で終わってしまっているようです。
tabuu

2021/11/30 00:45

条件を外して無条件で出力したらどうなりますか? 出力されるようでしたら、その条件が想定していない状態になっていると思います。
tabuu

2021/11/30 00:48

といいますか、ショートコード以外の箇所から外部ファイルを呼び出していないでしょうか?
kimukimu009

2021/11/30 00:59

条件を、無条件で出力しても、結果は同じでした。 外部ファイルを呼び出すことを、2回やっていないかを、確認中です。 よろしくお願い致します。
kimukimu009

2021/11/30 22:24

外部ファイルを呼び出すことも、確認する範囲では、2回やっていません。 function.phpがワードプレスで複数回呼ばれているような気がしていますが、いかがでしょうか?
tabuu

2021/11/30 23:28

>function.phpがワードプレスで複数回呼ばれているような気がしていますが、 functions.phpにmy_php_Includeという関数を定義されていますが、 複数回呼び出されていたら関数の二重定義でエラーになります。 includeをinclude_onceに変更して加算が1となったということなので、 どちらかというとショートコードを2回使っているか、 ショートコード以外で呼び出している可能性が高いです。 文字が出力されないのは外部ファイル側に問題があると思いますが ソースコードが無いので分かりません。 以下を順にお試しください。 ウェブサーバーのエラーログも合わせてご確認ください。 ・ショートコード内を空っぽにしてDBの数値が加算されないかどうか。 ・includeするファイルのパスを変数ではなく固定値で記述してみる。 ・includeするファイルを文字列をechoするだけの単純なものに差し替えてみる。 ・外部ファイルの内容をショートコード内に直接記述してみる。
kimukimu009

2021/12/01 00:47

アドバイス、ありがとうございます。 ソースコードは、現在記載しているプログラムと考えてもらって問題ありません。このソースコードで、実行しても、同じ結果になりましたので。 ・ショートコード内を空っぽにしてDBの数値が加算されないかどうか  →加算自体されませんでした。なにも画面上には表示もされていません。   要するに、ショートコードを抜いた、空のページが表示されたと考えられます。 ・includeするファイルを文字列をechoするだけの単純なものに差し替えてみる→現在のソースコードは、SQLが実行された後、何も表示されないHTMLファイルにしています。実行結果は、期待はずれでした。 echo表示はしていませんが、したほうがよろしいでしょうか? ・includeするファイルのパスを変数ではなく固定値で記述してみる。 →include(STYLESHEETPATH . "/template-parts/chusen.php"); にしてみましたが、結果は変わらずでした。 ・外部ファイルの内容をショートコード内に直接記述してみる。 →これはどういうことでしょうか?  ワードプレスの固定ページの中に、PHP、SQLを直接記述することでしょうか?直接固定ページの中には、PHP,SQLを記述することができません。
tabuu

2021/12/01 01:20

何も表示されないというのは、外部ファイルで出力している内容ではなく、 ヘッダー等も表示されず真っ白いページになるということでしょうか? であれば、エラーログでエラーになっている箇所を特定してください。 ちなみに、表示されないというのは、 ・エラーでその箇所のみ表示されない ・条件に一致しないので表示されない(処理されていない) の判断がつきませんので何かしら表示するようにしてください。 >ワードプレスの固定ページの中に、PHP、SQLを直接記述することでしょうか?直接固定ページの中には、PHP,SQLを記述することができません。 ショートコードの中に記述してみてください。
kimukimu009

2021/12/01 01:33

アドバイス、ありがとうございます。 かしこまりました。
kimukimu009

2021/12/01 06:30

ひとつひとつ、実施しております。 1.エラーが起こっているから何も表示されないのかが、わからないので、何かしら表示するようにしてください。 →表示するようにしました、質問の中のプログラムも、変更しておきまし た。表示されるようになりました。 →正常に表示はされています。 2.エラーログがでていないか? →1の理由により、エラーログは、でていないと「思われます。」  (どのようにしてエラーログを確認すればよいか不明の為、未実施) 3.ショートコードの中に記述する →ショートコードの中にPHPやSQLを記述できるということでしょうか?  (これも、未実施です。)
kimukimu009

2021/12/01 06:48

2 →エラーログが表示されました。 警告:未定義の定数「query_vars」の使用- / home / users / 1 / main.jp-8957ff156420f4f / web / dreamgirl / wp-contentで「query_vars」(これはPHPの将来のバージョンでエラーをスローします)と見なされます/themes/iconic_tcd062/functions.phpの793行目 警告:未定義の定数「custom_query_vars」の使用- / home / users / 1 / mainで「custom_query_vars」(これはPHPの将来のバージョンでエラーをスローします)と見なされます。 jp-8957ff156420f4f / web / dreamgirl / wp-content / themes / iconic_tcd062 / features.php on line 793 警告:ヘッダー情報を変更できません-ヘッダーはすでに送信されています(出力は/home/users/1/main.jp-8957ff156420f4f/で開始されました) web / dreamgirl / wp-content / themes / iconic_tcd062 / Functions.php:793)/home/users/1/main.jp-8957ff156420f4f/web/dreamgirl/wp-includes/pluggable.php on line 1340 警告:ヘッダー情報を変更できません-ヘッダーはすでに送信されています(出力は/ home / users / 1 / mainで開始されました) .jp-8957ff156420f4f / web / dreamgirl / wp-content / themes / iconic_tcd062 / features.php:793)/home/users/1/main.jp-8957ff156420f4f/web/dreamgirl/wp-includes/pluggable.phpオンライン1343
tabuu

2021/12/01 23:20

エラーログは警告レベルなのであまり関係はなさそうです。 外部ファイルを以下のように簡潔にした場合はどうなりますか? hoge.phpというファイル名にして、テーマ直下に配置し、ファイルの内容は以下のみとする。(PHPのプログラムも入れずテキストのみ記述する) hogehoge これで問題がなければ以下のように内容を変更する。(PHPのプログラムも入れる) hogehoge <?php echo 'hogehogehoge'; ?> 次は想定している外部ファイルのファイル名とする。 そして内容を少しづつ本来のプログラムに近づけていく。
kimukimu009

2021/12/01 23:27

ありがとうございます。試してみます。
kimukimu009

2021/12/02 02:41

結果をご報告いたします。 変わらずでした。 1.hoge.phpというファイルを作成。   (PHPのプログラムも入れずテキストのみ記述する)   hogehoge    →結果:hogehogeという文字列が表示される。 ※function.phpに以下を記載(テーマの直下のPHPを実行する) function my_php_Include2($params = array()) { extract(shortcode_atts(array('file' => 'default'), $params)); ob_start(); include(STYLESHEETPATH . "/$file.php"); return ob_get_clean(); } add_shortcode('myphp2', 'my_php_Include2'); 2.これで問題がなかったので、  さらに、以下のようにPHPを追加する(PHPのプログラムも入れる) <?php echo 'hogehogehoge'; ?> 結果:hogehoge hogehogeという文字列が表示される。(正常) 3.ここで、さらに、該当のプログラムを入れる。 結果:DBの値が2つづつ加算されて、期待はずれの結果に。 よろしくお願い致します。
tabuu

2021/12/02 03:50

>3.ここで、さらに、該当のプログラムを入れる。 >結果:DBの値が2つづつ加算されて、期待はずれの結果に。 2加算されたということはinclude_onceではなくincludeしているのですよね? 1の場合もhogehogeという文字が2回表示されましたか?
kimukimu009

2021/12/02 04:07

include_onceではなくincludeです。 1の場合は、hogehogeという文字はひとつ表示されました。
tabuu

2021/12/02 04:22

どちらもinclude_onceではなくincludeであるにも関わらず 1は1回だけコールされ、3は2回コールされています。 3はショートコードをどこかで2回コールするようになっているのではないでしょうか。 もしくは外部ファイルから再度外部ファイルをコールしていないですか。
tabuu

2021/12/02 04:28

書き漏れました。 3は加算する処理を外部ファイルではなくどこかで直接実行していないですか。 また、外部ファイルも一度に全てを記述するのではなく、処理するコードを(エラーの出ない範囲で)少しづつ肉付けして、どこでエラーがでるか特定してください。 (エラーログがあればそれを見てください)
kimukimu009

2021/12/02 04:31

1、2,3とも ショートコードで呼び出しております。
tabuu

2021/12/02 08:20

>1、2,3とも >ショートコードで呼び出しております。 その認識だとは思うのですが、実際は1と2は1回しかコールされず、 3は2回コールされているので何か別の原因があるのではいでしょうか?
kimukimu009

2021/12/02 08:37

実際は1と2が、1回しかコールされなかったと言えるのはなぜでしょうか? もし2回コールされたら、表示結果の表示が、2倍に増えるということでしょうか?
tabuu

2021/12/02 22:56

そうですね。 1加算している箇所が2加算されているように、1回表示している箇所は2回表示されることになります。
kimukimu009

2021/12/02 23:19

ありがとうございます。 SQL文を変えて試してみます。
kimukimu009

2021/12/03 00:18

いろいろを、お手数をおかけし、申し訳ございません。 SQL文を、他のSQL文で変えておこないましたが、結果は同じでした。 不可解です。 // 接続処理 $con = mysqli_connect('○○', '○○', '○○', '○○'); if(!$con) { die('接続に失敗しました'); } // 文字コード mysqli_set_charset($con, 'utf8'); // SQLの発行と出力 $sql = "update woma set use_times = use_times+1 where pass = '" . $shoppass . "'"; $res = mysqli_query($con, $sql); $num_rows = mysqli_num_rows($res); // echo $num_rows; // 接続断 mysqli_close($con);
tabuu

2021/12/03 02:08

途中でexitしているので出力処理まで到達していない可能性もあります。 ショートコードから呼び出す外部ファイルにも<html>や<head>タグを書いているのですか? <html><head><body>はWordPress(テンプレート)が出力するので不要です。 headの閉じタグやbodyタグはありませんので不整合なHTMLとなっていて表示されていない可能性もあります。
kimukimu009

2021/12/03 02:49 編集

以下に変更位しても、結果は同じでした。 <?php $shoppass="2014"; $server = "○○○○○○"; $userName = "○"; $password = "○"; $dbName = "○"; $mysqli = new mysqli($server, $userName, $password,$dbName); if ($mysqli->connect_error){ echo $mysqli->connect_error; exit(); }else{ $mysqli->set_charset("utf-8"); } $now = date('Y/m/d H:i:s'); echo $now; $sql = "update woma set use_times = use_times+1 where pass = '" . $shoppass . "'"; $result = $mysqli -> query($sql); //クエリー失敗 if(!$result) { echo $mysqli->error; exit();} echo "hogehoge(echo)"; ?> hogehoge
kimukimu009

2021/12/03 02:27

なかなかやっかいですね。
tabuu

2021/12/03 03:50

・該当の外部ファイルが呼び出されていない ・外部ファイル内でエラーが発生している ・exitしている ・出力はされているがブラウザに表示されていない(HTMLのソースを確認してください) の何れかだと思います。 外部ファイル名は変更せずに、外部ファイルの中身を「hogehoge」のみに変更してみてください。 該当の外部ファイル自体に問題がある可能性もあります。
kimukimu009

2021/12/03 03:57

外部ファイルの中身を「hogehoge」のみに変更してみてください。 →行いました。 hogehoge の文字列だけが表示されました。
kimukimu009

2021/12/03 03:58

ソース抜粋です。 <div class="p-entry__body p-entry-page__body"> hogehoge </div>
kimukimu009

2021/12/03 04:06

hoge.phpの中身は、以下の通りです。 hogehoge
kimukimu009

2021/12/03 04:07

このファイルは、新規に作成したものです。
tabuu

2021/12/03 09:05

hoge.phpでは前回表示されることを確認されたはずです。 hoge.phpではなく問題の外部ファイルそのものの中身を変更してみてください。
kimukimu009

2021/12/03 09:09

問題の外部ファイルそのものの中身を、hogehogeに変更するということでしょうか?
tabuu

2021/12/05 23:28

そうですね。念のためバックアップを取ってから変更してみてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問