ここから本文です

wordpress上で、本日分から4日分を出力した各formがあり、 その各フォームのボタ...

shi********さん

2019/4/220:49:42

wordpress上で、本日分から4日分を出力した各formがあり、
その各フォームのボタンは、
1回押すとデータベース上に日付とリミット数が登録され、2回目以降は、押してもデータベース上に

そのボタンが一度押されている場合は押せないようにしています。

下記コードで、出力からデータベースの登録まで問題なく行えるのですが、
例えば、4/3のボタンを押すとデータベース上では、その1件しか登録されていないのに、
その他のボタンもelseの<div class="sold">売切れ</div>の表示になってしまいます。

押されたボタンのみにelseの<div class="sold">売切れ</div>の
表示にすることはできますでしょうか?

<?php
function entryForm() {
global $wpdb;

$dbdate = (date('H') < '12') ? 0: 1;
$date = date('Ymd', strtotime('+' . $dbdate++ . 'days'));
$limit = 1;
$count_data = $wpdb->get_results( "SELECT count FROM $wpdb->datebox WHERE dateplan = '$date'" );

foreach ($count_data as $value) {
$countnow = $value->count;
}

for ($i=0; $i < 4; $i++) {
if ($countnow < $limit) {
$post_plus = (date('H') < '12') ? 0: 1;
$post_date = date('Ymd', strtotime('+' . $post_plus++ . 'days'));
echo '<form method="POST" action="">';
echo '<input type="hidden" name="limit" value="1" />';
echo '<input type="button" name="date" value="',$post_date,'" />';
echo '<input type="submit" />';
echo '</form>';
} else {
echo '<div class="sold">売切れ</div>';
}
}

}
entryForm();
?>

この質問は、活躍中のチエリアン・専門家に回答をリクエストしました。

閲覧数:
15
回答数:
1
お礼:
250枚

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

shi********さん

リクエストマッチ

2019/4/221:39:14

>if ($countnow < $limit) {

$countnow も $limit も forループの中で値が変化するわけではありませんよね?なのでforループでセットしている意味がありません。

DBの設計がよくわかりませんが、例えばこんな感じにしたのではありませんか?


<?php
function entryForm() {
global $wpdb;

$plus = (date('H') < '12') ? 0: 1;

// 出力formのhtml(%sが日付をセットされる部分)
$html = '<form method="POST" action="">' . PHP_EOL .
'<input type="hidden" name="limit" value="1" />' . PHP_EOL .
'<input type="button" name="date" value="%s" />' . PHP_EOL .
'<input type="submit" />' . PHP_EOL .
'</form>' . PHP_EOL;

for ($i=0; $i < 4; $i++) {

// 日付を準備
$chkdate = date('Ymd', strtotime('+' . $plus++ . 'days'));

// その日付のレコードを取得
$dbresult = $wpdb->get_results( "SELECT count FROM $wpdb->datebox WHERE dateplan = '$chkdate'");

// 結果セットが存在し最初のレコードのcountがlimit未満(0)ならform出力
if ((count($dbresult) > 0)&&($dbresult[0]->count < $limit)) {
printf($html, $chkdate);
} else {
// 結果セットが存在しないかレコードのcountがlimit以上なら売切れとする
echo '<div class="sold">売切れ</div>';
}
} // for_loop end


結果セットの有無(count($dbresult))をどう判断すればいいかはちょっとわかりません(あらかじめ日付のレコードを作成しているのかどうか不明)なのと、dateplanが同じレコードが複数あるのかどうか(dateplanがuniqueキーなのかどうか)もソースからは読み取れませんでした(foreachループだけど最後のレコードだけ使っているので実質的に存在しても1件だろうとは推測しました)。

  • 質問者

    shi********さん

    2019/4/318:39:08

    ご回答ありがとうございます。
    上記を参考に書いたのですが、
    2箇所、○月○日の表記で各箇所に日付表示させたく、
    上記2箇所にも%sを入力してみると、表示がされなくなるようで、
    こちらに日付表示はできますでしょうか?

  • その他の返信(1件)を表示

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

質問した人からのコメント

2019/4/3 20:19:32

無事、上記コードを参考にしたら、無事表示ができました。
この度は、ご親切にご回答いただきありがとうございます。
こちらをベストアンサーとさせていただきます。

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる