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

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

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

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

885閲覧

いいね機能作成。SQLでfavoIDが異なればON DUPLICATE KEY UPDATEを実行させない条件分岐を実装したい。

fuyukixxx

総合スコア26

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2021/06/14 12:05

編集2021/06/16 22:42

ポートフォリオを作っている駆け出しのものです。いいね機能を実装したいためwhile文で複数のfavorite_idカラムをもつbuttonを作って、クリックしたらJSでpostしてPHP側のPDOクラスでINSERT INTO favorites (favorite_id ,user, favorite) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE favorite = ? をexecute()して値が存在してなければ新しくINSERTする。存在していればfavoriteカラムだけ更新する機能を実装できました。
ただこれでは違うidをもつbuttonクリックしても新しくINSERTされないので 、$_POST['favorite_id']で送られてきたidがもともと存在するfavorite_idカラムと違っていれば ON DUPLICATE KEY UPDATE favorite = ?を機能させない条件分岐てきなことをしたいのですが、行き詰まったので回答の方を頂きたいと思ってます。よろしくお願いします。

HTML

1コード 2<?php while ($post = $posts->fetch()) : ?> 3<?php if ($post['user'] !== $member['user']) : ?> 4 <form id="like_form" action="" method="post"> 5 <input type="hidden" name="favorite_id" value="<?php echo $post['id']?>"> 6 <input type="hidden" name="user" value="<?php echo $member['user']?>"> 7 </form> 8 <button class="like__btn"> 9 <span class="icon"><i class="far fa-thumbs-up"></i></span> 10 Like 11 </button> 12 <?php endif; ?> 13<?php endwhile; ?>

SQL

1コード 2テーブル名 favorites 3カラムid, favorite_id, user, favorite

PHP

1コード 2if ($_POST['favorite'] === 'favorite') { 3 $likes = $db->prepare('INSERT INTO favorites (favorite_id ,user, favorite) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE favorite = ?'); 4 $likes->bindParam(1, $_POST['favorite_id'], PDO::PARAM_INT); 5 $likes->bindParam(2, $_POST['user'], PDO::PARAM_STR); 6 $likes->bindParam(3, $_POST['favorite'], PDO::PARAM_STR); 7 $likes->bindParam(4, $_POST['favorite'], PDO::PARAM_STR); 8 $likes->execute(); 9 } else { 10 $likes = $db->prepare('INSERT INTO favorites (favorite_id ,user, favorite) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE favorite = ?'); 11 $likes->bindParam(1, $_POST['favorite_id'], PDO::PARAM_INT); 12 $likes->bindParam(2, $_POST['user'], PDO::PARAM_STR); 13 $likes->bindParam(3, $_POST['favorite'], PDO::PARAM_STR); 14 $likes->bindParam(4, $_POST['favorite'], PDO::PARAM_STR); 15 $likes->execute(); 16 }

javascript

1コード 2 const likeBtn = document.querySelectorAll('.like__btn'); 3 let likeIcon = document.querySelectorAll('.icon'); 4 5 for (let i = 0; i < likeBtn.length; i++) { 6 likeBtn[i].addEventListener('click', () => { 7 const postForm = new FormData(document.forms.like_form); 8 if (!clicked) { 9 clicked = true; 10 likeIcon[i].innerHTML = `<i class="fas fa-thumbs-up"></i>`; 11 postForm.set('favorite', 'favorite'); 12 const form = { 13 method: 'post', 14 body: postForm 15 }; 16 17 fetch('index.php', form) 18 .then((res) => { 19 if (res.status !== 200) { 20 throw new Error("system error."); 21 } 22 return res.text(); 23 }).then((text) => { 24 console.log(text); 25 }).catch((e) => { 26 console.log(e.message); 27 }).finally(() => { 28 console.log('done!') 29 30 }); 31 } else { 32 clicked = false; 33 likeIcon[i].innerHTML = `<i class="far fa-thumbs-up"></i>`; 34 postForm.set('favorite', 'notFavorite'); 35 const form = { 36 method: 'post', 37 body: postForm 38 }; 39 40 fetch('index.php', form) 41 .then((res) => { 42 if (res.status !== 200) { 43 throw new Error("system error."); 44 } 45 return res.text(); 46 }).then((text) => { 47 console.log(text); 48 }).catch((e) => { 49 console.log(e.message); 50 }).finally(() => { 51 console.log('done!') 52 53 }); 54 } 55 });

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

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

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

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

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

m.ts10806

2021/06/14 12:08

> ポートフィリオ portfolio なのでしいてなら「フォリオ」になると思います。 細かいですが案外大事です。
fuyukixxx

2021/06/16 11:35

タイプミスしてました。ご指摘ありがとうございます。 気をつけます。
m.ts10806

2021/06/16 11:36

質問編集して調整してもらえればと
fuyukixxx

2021/06/16 22:43

すみません。編集しました。
guest

回答1

0

ベストアンサー

ON DUPLICATE KEY」は、UNIQUE インデックスまたは PRIMARY KEY に重複した値を発生させる行が挿入された場合に実行されるものです。

$_POST['favorite_id']で送られてきたidがもともと存在するfavorite_idカラムと違っていれば

で実現したいのであれば、favorite_idUNIQUE KEYまたは PRIMARY KEYの指定がされていなければなりません。

投稿2021/06/14 13:12

sazi

総合スコア25327

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

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

fuyukixxx

2021/06/15 11:31

ご回答ありがとうございます。 favorite_idはUNIQUE KEYに設定してあります。 PRIMARY KEYはオートインクリメント指定したidカラムに設定してあります。ですが思い通りの動きにいかないです。すみません。
sazi

2021/06/15 13:18 編集

SQLが上手く行っているなら、$_POST['favorite_id']の値が変わっていないとしか思えませんが。
sazi

2021/06/15 13:22

想定した値の平文のSQLを実行して、動作を確認してみて下さい。 定義したつもりで実際にそうなっていないかもしれませんし。
fuyukixxx

2021/06/16 11:34

$_POST['favorite_id']の値が変わっていない。その通りでした。 JSとPHPの方でうまく値が変更できるようにしたら解決できました ありがとうございます。また機会があればよろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問