🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

PHP

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

Q&A

解決済

2回答

1661閲覧

ボタン1回で処理したいが2回になっている(PHP)

退会済みユーザー

退会済みユーザー

総合スコア0

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

PHP

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

0グッド

0クリップ

投稿2021/01/14 11:10

編集2021/01/14 11:55

前提・実現したいこと

PHPでいいね機能を作成していて、いいねボタンを押すとそのページが更新されて、
ボタン表記をいいね->いいね解除
表示するいいねの数を+1するという処理を作成しています

DBはいいねテーブルにユーザーIDと投稿IDの組み合わせで登録という処理
投稿テーブルのいいねカウントを+1

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

いいねボタンを2回押さないと上記の処理ができない
1回目押すといいねテーブルにユーザーIDと投稿IDが追加
2回目押すと投稿テーブルのいいねが+1になる
これをボタン1回で処理したい

該当のソースコード

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>投稿詳細</title> </head> <body> <?php require 'menu.php';?> <?php $pdo = new PDO('mysql:host=localhost;dbname=fps;charset=utf8','staff','password'); $sql=$pdo->prepare('select * from post_tbl where post_id = ?'); $sql->execute([$_REQUEST['post_id']]); foreach($sql as $row){ echo 'タイトル:'.$row['post_title'].'<br>'; echo '説明文<br>'; echo '<textarea name="post_detail" cols="50" rows="5">'.$row['post_detail'].'</textarea><br>'; echo 'カテゴリー:'.$row['post_category'].'<br>'; echo 'いいね:'.$row['post_like_count'].'<br>';
$sql=$pdo->prepare('select * from favorite_tbl where user_id = ? and post_id = ?'); $sql->execute([$_SESSION['login_id'],$_REQUEST['post_id']]); $result=$sql->fetch(); if(empty($result)){ echo '<form action="" method="post">'; echo '<button type="submit" name="add_like">いいね</button>'; echo '</form>'; if(isset($_POST['add_like'])){ $sql=$pdo->prepare('insert into favorite_tbl values(?,?)'); $sql->execute([$_SESSION['login_id'],$_REQUEST['post_id']]); $sql=$pdo->prepare('update post_tbl set post_like_count = post_like_count + 1 where post_id = ?'); $sql->execute([$_REQUEST['post_id']]); header('refresh'); } }else{ echo '<form action="" method="post">'; echo '<button type="submit" name="del_like">いいね解除</button>'; echo '</form>'; if(isset($_POST['del_like'])){ $sql=$pdo->prepare('delete from favorite_tbl where user_id = ? and post_id = ?'); $sql->execute([$_SESSION['login_id'],$_REQUEST['post_id']]); $sql=$pdo->prepare('update post_tbl set post_like_count = post_like_count - 1 where post_id = ?'); $sql->execute([$_REQUEST['post_id']]); header('refresh'); } } } ?> <?php require 'footer.php';?>

データベース

create table post_tbl( post_id int(10) auto_increment not null primary key, user_id int(10) not null, post_title varchar(50) not null, post_detail text not null, post_category varchar(20) not null, post_date date not null, post_like_count int(200) default 0 ); create table favorite_tbl( user_id int(10) not null, post_id int(10) not null, primary key(user_id,post_id) );

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

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

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

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

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

m.ts10806

2021/01/14 11:26

コードが半端な状態です。 可能なら、HTML部分のコードも全体の流れが分かるような状態で記載してください。
guest

回答2

0

ベストアンサー

単純にコードを辿るとわかりますが、
「データベースにいいね情報がない時」→「いいねボタンを表示」→「いいねが押されていたらデータベースに追加」
(逆も同じ)
という風になっているため、いいねボタンを押した瞬間は、いいねボタンを表示した上で、データベースに記録されます。
なので、順番的には、
「いいねが押されていたらデータベースに追加」し、「データベースにいいね情報がない時」→「いいねボタンを表示」
という風に書き換えれば意図した動作になるのではないかと思います。

余談ですが、データベースとphpのコード内で、like_tblfavorite_tblで表記が一致していないので、書き間違えていないかだけ確認してみてください。

投稿2021/01/14 11:25

yuuyu

総合スコア1139

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

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

退会済みユーザー

退会済みユーザー

2021/01/14 13:11

いくつか試してみたのですがうまくいきませんでした 順番の話は分かったのですがそれをどのように変更すればよいのかをもう少し詳しくお聞きしてもよろしいですか
yuuyu

2021/01/14 13:18

> 順番の話は分かったのですが ちなみに、ご自身のコード内で「データベースにいいね情報がない時」「いいねボタンを表示」「いいねが押されていたらデータベースに追加」がどれに該当しているか分かりますか?
退会済みユーザー

退会済みユーザー

2021/01/14 13:19

そこは理解しています
yuuyu

2021/01/14 13:23

それでは、「いいねが押されていたらデータベースに追加」を、「データベースにいいね情報がない時」の前、つまり今回であれば echo 'タイトル:'.$row['post_title'].'<br>'; の前もしくは $sql=$pdo->prepare('select * from favorite_tbl where user_id = ? and post_id = ?'); の前に持ってこれば(最低限の)やりたい動作になるのではないでしょうか? (なお話の中ではいいねを押す前→押す後、の話のみしているので、いいねが押されている→外す動作も同様に変更する必要があります。)
退会済みユーザー

退会済みユーザー

2021/01/14 13:37

ありがとうございます 押されている→外す動作のことを忘れていました お手数かけてすみませんでした
guest

0

直接の回答ではなく、提案です。

画面表示の中に処理ロジックが入り込んでいるため、「どういう順番で実行されるか」が見えにくくなっているように思います。
既に回答にあるように「基本は上から順番」なので、「出力の後にDB処理」では出力についてこないのは当然です。

ここはひとつ、完全に「画面表示」と「DBの処理」を分けてしまっては如何でしょうか。

現在のデータを画面表示
→ボタンを押す
→JavaScriptで非同期通信でリクエスト送信
→該当の投稿にいいね+1&現在のいいね数取得(DBの処理)
→現在のいいね数をJavaScriptで書き換え

DB関係の処理(特に更新)をバックグラウンドに任せることでメリハリもつくと思います。

投稿2021/01/14 12:03

m.ts10806

総合スコア80875

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

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

退会済みユーザー

退会済みユーザー

2021/01/14 12:18

どうしてもわからなかったらそうしようと思います
m.ts10806

2021/01/14 12:22

このやり方も結局「処理順」「ロジック」が理解できてないとできません。 あくまで「同期処理で出来た前提」です。「分からなかったときの逃げ道」ではないです。 本来は「様々なやり方を把握しておき場面にあった最適なやり方を選択する」うちの選択肢の1つです。 ちょっと厳しいことを言うと、 今の質問者さんにはむしろ私の提案のほうが難しいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問