前提・実現したいこと
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
どのタイミングで処理を実行していますか?
処理を2回実行していませんか?
していないんですよ。
何回も確認しました。
Aページを、テストで作って、
Aページを開いて、DBを参照しながら、実験しました。
結果は、
WordPressの固定ページでつくったAページでは、
2つづつ増え、
普通のHTMLページとしてつくったAページでは、
1つづつ増えました。
ロリポップで契約している2つのサーバで、
同じことをやりましたが、結果は、同じでした。
つまり、処理は1回しか実行していません。
●固定ページ表示後に(自動で)リロードorリダイレクトして2回表示されていませんか?
●下記のようにSQL文実行直後に処理を強制終了しDBの値を確認しても2増えていますか?
$result = $mysqli -> query($sql);
die();
●加算するSQLではなくレコードを追加するSQLに変更しても2レコードは追加されませんか?
確かに、2回実行されていました。
die();でとまりました!!
しかしながら、本来のプログラムでは、
die();で止めるわけにはいかず、
それ以降も、SQL実行が何個かあるのですが、
どのようにすればよいのでしょうか?
2回実行さる原因を特定しないと改善は難しいと思います。
まずは固定ページのソースコードを質問文に追記してください。
phpファイルのソースコードになります。
このPHPファイルを、Wordpressの固定ページの中で、
ショートコードで呼び出して実行シました所、期待はずれ(値が2つ増える)
の結果に。
また、このPHPファイルを、直接実行する(ショートコードで呼び出さずに、直接実行する)と、期待通りの結果になります。
とすれば、ショートコードで呼び出すところに、問題があるのでしょうか?
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');
興味深い質問&回答を見つけました。
function.phpがワードプレスで複数回呼ばれるのは、普通という
こと?かもしれません。
-------------------
WordPressで、functions.php が複数回読まれるのは正常なのでしょうか?https://teratail.com/questions/284189
-------------------
ショートコードは固定ページに複数貼っていないですよね。
「include」を「include_once」に変更するとどうなりますか?
※ソースコードはこちらではなく、質問文に追記しておいてください。
ありがとうございます。
「include」を「include_once」に変更すると、本PHPファイル(便器上簡略化している)では、値がひとつ増えた(期待通りの答え)になりました!!
しかしながら、簡略化していないPHPファイル(DB更新のあとに、ある条件で、HTML表示させる)では、値がひとつ増えた(期待通りの答え)になりましたが、PHPファイルの中の、「HTML表示させる所」が、なにも表示されなくなりました。
PHPファイルの実行結果が、途中で終わってしまっているようです。
条件を外して無条件で出力したらどうなりますか?
出力されるようでしたら、その条件が想定していない状態になっていると思います。
といいますか、ショートコード以外の箇所から外部ファイルを呼び出していないでしょうか?
条件を、無条件で出力しても、結果は同じでした。
外部ファイルを呼び出すことを、2回やっていないかを、確認中です。
よろしくお願い致します。
外部ファイルを呼び出すことも、確認する範囲では、2回やっていません。
function.phpがワードプレスで複数回呼ばれているような気がしていますが、いかがでしょうか?
>function.phpがワードプレスで複数回呼ばれているような気がしていますが、
functions.phpにmy_php_Includeという関数を定義されていますが、
複数回呼び出されていたら関数の二重定義でエラーになります。
includeをinclude_onceに変更して加算が1となったということなので、
どちらかというとショートコードを2回使っているか、
ショートコード以外で呼び出している可能性が高いです。
文字が出力されないのは外部ファイル側に問題があると思いますが
ソースコードが無いので分かりません。
以下を順にお試しください。
ウェブサーバーのエラーログも合わせてご確認ください。
・ショートコード内を空っぽにしてDBの数値が加算されないかどうか。
・includeするファイルのパスを変数ではなく固定値で記述してみる。
・includeするファイルを文字列をechoするだけの単純なものに差し替えてみる。
・外部ファイルの内容をショートコード内に直接記述してみる。
アドバイス、ありがとうございます。
ソースコードは、現在記載しているプログラムと考えてもらって問題ありません。このソースコードで、実行しても、同じ結果になりましたので。
・ショートコード内を空っぽにしてDBの数値が加算されないかどうか
→加算自体されませんでした。なにも画面上には表示もされていません。
要するに、ショートコードを抜いた、空のページが表示されたと考えられます。
・includeするファイルを文字列をechoするだけの単純なものに差し替えてみる→現在のソースコードは、SQLが実行された後、何も表示されないHTMLファイルにしています。実行結果は、期待はずれでした。
echo表示はしていませんが、したほうがよろしいでしょうか?
・includeするファイルのパスを変数ではなく固定値で記述してみる。
→include(STYLESHEETPATH . "/template-parts/chusen.php");
にしてみましたが、結果は変わらずでした。
・外部ファイルの内容をショートコード内に直接記述してみる。
→これはどういうことでしょうか?
ワードプレスの固定ページの中に、PHP、SQLを直接記述することでしょうか?直接固定ページの中には、PHP,SQLを記述することができません。
何も表示されないというのは、外部ファイルで出力している内容ではなく、
ヘッダー等も表示されず真っ白いページになるということでしょうか?
であれば、エラーログでエラーになっている箇所を特定してください。
ちなみに、表示されないというのは、
・エラーでその箇所のみ表示されない
・条件に一致しないので表示されない(処理されていない)
の判断がつきませんので何かしら表示するようにしてください。
>ワードプレスの固定ページの中に、PHP、SQLを直接記述することでしょうか?直接固定ページの中には、PHP,SQLを記述することができません。
ショートコードの中に記述してみてください。
アドバイス、ありがとうございます。
かしこまりました。
ひとつひとつ、実施しております。
1.エラーが起こっているから何も表示されないのかが、わからないので、何かしら表示するようにしてください。
→表示するようにしました、質問の中のプログラムも、変更しておきまし
た。表示されるようになりました。
→正常に表示はされています。
2.エラーログがでていないか?
→1の理由により、エラーログは、でていないと「思われます。」
(どのようにしてエラーログを確認すればよいか不明の為、未実施)
3.ショートコードの中に記述する
→ショートコードの中にPHPやSQLを記述できるということでしょうか?
(これも、未実施です。)
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
エラーログは警告レベルなのであまり関係はなさそうです。
外部ファイルを以下のように簡潔にした場合はどうなりますか?
hoge.phpというファイル名にして、テーマ直下に配置し、ファイルの内容は以下のみとする。(PHPのプログラムも入れずテキストのみ記述する)
hogehoge
これで問題がなければ以下のように内容を変更する。(PHPのプログラムも入れる)
hogehoge
<?php echo 'hogehogehoge'; ?>
次は想定している外部ファイルのファイル名とする。
そして内容を少しづつ本来のプログラムに近づけていく。
ありがとうございます。試してみます。
結果をご報告いたします。
変わらずでした。
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つづつ加算されて、期待はずれの結果に。
よろしくお願い致します。
>3.ここで、さらに、該当のプログラムを入れる。
>結果:DBの値が2つづつ加算されて、期待はずれの結果に。
2加算されたということはinclude_onceではなくincludeしているのですよね?
1の場合もhogehogeという文字が2回表示されましたか?
include_onceではなくincludeです。
1の場合は、hogehogeという文字はひとつ表示されました。
どちらもinclude_onceではなくincludeであるにも関わらず
1は1回だけコールされ、3は2回コールされています。
3はショートコードをどこかで2回コールするようになっているのではないでしょうか。
もしくは外部ファイルから再度外部ファイルをコールしていないですか。
書き漏れました。
3は加算する処理を外部ファイルではなくどこかで直接実行していないですか。
また、外部ファイルも一度に全てを記述するのではなく、処理するコードを(エラーの出ない範囲で)少しづつ肉付けして、どこでエラーがでるか特定してください。
(エラーログがあればそれを見てください)
1、2,3とも
ショートコードで呼び出しております。
[myphp2 file='hoge']
>1、2,3とも
>ショートコードで呼び出しております。
その認識だとは思うのですが、実際は1と2は1回しかコールされず、
3は2回コールされているので何か別の原因があるのではいでしょうか?
実際は1と2が、1回しかコールされなかったと言えるのはなぜでしょうか?
もし2回コールされたら、表示結果の表示が、2倍に増えるということでしょうか?
そうですね。
1加算している箇所が2加算されているように、1回表示している箇所は2回表示されることになります。
ありがとうございます。
SQL文を変えて試してみます。
いろいろを、お手数をおかけし、申し訳ございません。
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);
途中でexitしているので出力処理まで到達していない可能性もあります。
ショートコードから呼び出す外部ファイルにも<html>や<head>タグを書いているのですか?
<html><head><body>はWordPress(テンプレート)が出力するので不要です。
headの閉じタグやbodyタグはありませんので不整合なHTMLとなっていて表示されていない可能性もあります。
以下に変更位しても、結果は同じでした。
<?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
なかなかやっかいですね。
・該当の外部ファイルが呼び出されていない
・外部ファイル内でエラーが発生している
・exitしている
・出力はされているがブラウザに表示されていない(HTMLのソースを確認してください)
の何れかだと思います。
外部ファイル名は変更せずに、外部ファイルの中身を「hogehoge」のみに変更してみてください。
該当の外部ファイル自体に問題がある可能性もあります。
外部ファイルの中身を「hogehoge」のみに変更してみてください。
→行いました。
hogehoge
の文字列だけが表示されました。
ソース抜粋です。
<div class="p-entry__body p-entry-page__body">
hogehoge
</div>
hoge.phpの中身は、以下の通りです。
hogehoge
このファイルは、新規に作成したものです。
hoge.phpでは前回表示されることを確認されたはずです。
hoge.phpではなく問題の外部ファイルそのものの中身を変更してみてください。
問題の外部ファイルそのものの中身を、hogehogeに変更するということでしょうか?
そうですね。念のためバックアップを取ってから変更してみてください。
かしこまりました。
あなたの回答
tips
プレビュー