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

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

詳細はこちら
SQL

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

PHP

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

Q&A

解決済

2回答

1254閲覧

【PHP / MySQL】データベースに同じ値が入らないようにする

kpg

総合スコア23

SQL

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

PHP

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

0グッド

0クリップ

投稿2019/10/08 06:46

表題の通りですが、データベースに同じ値が入らないようにしたいです。

データベースではユニークキーを設定していますが、同じ値があった場合はアラートが出るようにしたいと考えております。

①入力ページ → ②入力完了ページ

とあり、すでに登録されている値が登録されようとしたら①入力ページでアラートが出るようにしたいです。
データはajaxで送っています。(下にjQueryのコードを記載しております。)

よろしくお願いします。

php

1// ①入力ページ 2<div class="icon_cow" id="icon_cow" style="margin:0;"> 3 <input class="likeButton<?php echo $i; ?>" type="image" src="<?php echo ROOT_PATH; ?>images/logo.jpg" onclick="" 4 style="margin:0; height:24px; margin:0; margin-left:3px; border:none;"> 5 <input type="hidden" name="auto_id" value="<?php echo $value['auto_id']; ?>"> 6 <?php foreach($driversId as $id) ?> 7 <input type="hidden" name="voter_id" value="<?php echo $id; ?>"> 8 <input type="hidden" name="submitter_id" value="<?php echo $value['driver_id']; ?>"> 9 <input type="hidden" name="unique_id" value="<?php echo $value['auto_id'].$id; ?>"> 10      //unique_idがデータベースに同じ値が入らないようにしたい値です。 11 <i class="far fa-thumbs-up"></i>

php

1// ②入力完了ページ 2<?php 3include_once "../../variable.php"; 4//include_once ABS_PATH."session.php"; 5 6try { 7 8 $driver_id = $_GET['driver_id']; 9 10 $auto_id = $_POST['auto_id']; 11 $voter_id = $_POST['voter_id']; 12 $submitter_id = $_POST['submitter_id']; 13 $unique_id = $_POST['unique_id']; 14 15 16 $sql = "SELECT COUNT(unique_id) AS counted FROM m_like_master 17 WHERE unique_id= " . $unique_id; 18 19 $stmt = $dbh->prepare($sql); 20 $stmt->execute(); 21 $countResult = $stmt->fetch(PDO::FETCH_ASSOC); 22 $current_unique_count = $countResult['counted']; 23 echo $current_unique_count; 24 25 if ($current_unique_count >= 1 ){ 26 $alert = "<script type='text/javascript'>alert('入力できません');</script>"; 27 echo $alert; 28 throw new Exception(); 29 } 30 31 32 $sql = "REPLACE INTO m_like_master( 33 auto_id, 34 voter_id, 35 submitter_id, 36 unique_id 37 ) VALUES (?,?,?,?)"; 38 39 $stmt = $dbh->prepare($sql); 40 41 $data[] = $auto_id; 42 $data[] = $voter_id; 43 $data[] = $submitter_id; 44 $data[] = $unique_id; 45 46 // SQLで指令を出すための命令 47 if( !$stmt->execute($data) ) { 48 echo 'クエリの送信に失敗しました。 SQL:'.$sql; 49 throw new Exception(); 50 } 51 52 // 必ずデータベース切断 53 $dbh = null; 54 55 56} catch(Exeption $e) { 57 echo 'ただいま障害により大変ご迷惑をお掛けしております(_ _)'; 58 exit(); 59} 60 61?> 62 63<?php include_once ABS_PATH."head.php"; ?></head> 64 65<body class="comp"> 66 67<?php 68header('Content-Type: application/json; charset=utf-8'); 69?> 70 71</body> 72</html>

jQuery

1 <?php 2 for($i=1;$i<=count($salesdata);$i++) { 3 ?> 4 5 $(function(){ 6 let likeButton = $(".likeButton<?php echo $i; ?>"); 7 let likeResult = $("#like_result<?php echo $i; ?>"); 8 9 likeButton.on('click', function(e){ 10 let $_parent = $( this ).closest( '.icon_cow' ); 11 $.ajax({ 12 type: 'POST', 13 url: "sales_report_like_done_ajaxPost.php", 14 data: { 15 auto_id : $_parent.find("input[name=auto_id]").val(), 16 voter_id : $_parent.find("input[name=voter_id]").val(), 17 submitter_id : $_parent.find("input[name=submitter_id]").val(), 18 unique_id : $_parent.find("input[name=unique_id]").val(), 19 } 20 }); 21 likeResult.text( Number(likeResult.text()) + 1 ); 22 return false; 23 }); 24 }) 25 26 <?php }; ?>

補足情報(FW/ツールのバージョンなど)

・バージョン
PHP 7.1.23
mysql 5.6.43

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

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

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

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

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

m.ts10806

2019/10/08 07:17 編集

AjaxでレスポンスヘッダをJSONにしているにも関わらず出力が一切JSONになっていませんが(しかもそこでheader()は基本文法的にNG)、これはなにを参考に作ったのでしょうか。 また、自身が意図を把握できているコードなのでしょうか
kpg

2019/10/08 07:28

m.ts10806様 色々なサイトを見ながら作ったものなのですが、見よう見まねで作っている状態です。。 header()をここで使用することもNGなのですね。ありがとうございます。
m.ts10806

2019/10/08 07:40

PHPマニュアルご確認ください
mari.rinn

2019/10/08 07:51 編集

ajaxのdataの一番最後 unique_id : $_parent.find("input[name=unique_id]").val(), の「,」は付けないでください。一番最後のパラメーターにこれがあると正常に処理されなくなります。
kpg

2019/10/08 07:56

mari.rinn 様 初歩的なミスですね。。 ご指摘ありがとうございます。
guest

回答2

0

insert ignore intoしてPDOStatement::rowCountが0だったら失敗とみなす

投稿2019/10/08 06:52

yambejp

総合スコア116667

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

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

yambejp

2019/10/08 06:53

ちなみにprepareの使い方がひどいので、もうすこしきちんと学習したほうがよいです
kpg

2019/10/08 07:25

yambejp様 ありがとうございます。 頂いた内容を参考にさせていただきます。 また、prepareの使い方も見よう見まねでやっている状態ですので継続して学習も頑張ります。
guest

0

ベストアンサー

やりたいことの前に下記をしっかり理解する必要があります。

  • PHPはサーバーサイドの言語でHTML,JavaScriptはクライアントサイドの言語である。両者の位置関係
  • 「リクエスト」と「レスポンス」
  • 「GET」と「POST」
  • PHPマニュアルの活用
  • クライアントサイド、サーバーサイドのそれそれのデバッグの仕方および活用
  • プログラムは「書いた通り動く」ということ

「やりたいことに近いコードを探してきて切り貼り」は、はじめの頃にやってしまいがちですが、ほぼできあがったようなコードを拝借するだけで要件を実現できることって稀です。
効率的に見えて理解できない、しないまま使っていることで問題が次々おきて手に負えなくなり逆に非効率になります。

書いた通りにしか動かないので「惜しい」という考え方は存在しません。
「惜しい」となって進めていたら結局は全部作り直したなんてことはザラにあります。

ですので、それを避けるために1個ずつ確実に進めていく必要があります。

  • いきなり全体を組んでいくのではなく単体部品に切り出していくこと。
  • 小さい部品を切り出せたらその部品単位で動作確認をして「OK」を積み重ねていくこと
  • PHPの機能はPHPマニュアルを確認して何を渡したら何が返ってくるか確認しておくこと
  • 部品同士をいきなり結合せずに「形式だけあわせた固定のデータ」を渡して確認すること(「モック」と表現されます)
  • 実際に結合したときに不具合が起きたときは「想定のデータの形になっているか」から確認すること
  • ネットを参考にする場合は、例えばQiitaであれば評価の高い記事、コメントで建設的なやりとりが行われている記事を選択すること
  • ネットを参考にする場合は、PHPのバージョン、DBのバージョンは手元の環境と合っているか必ず確認すること

etc.

部品にきり出すメリットとしては単体確認ができるので、結合したときにどこで問題が起きたか分かりやすくなることです。
一気に組んでしまっては、特にネットの記事切り貼りだけでは動かなかったときにどこで問題が起きているか把握しづらくなり、結局、デバッグ依頼のような丸投げ質問を投げてしまうことになります。

「やりたいこと、やろうとしていること」と「好ましい、適切な手段」は必ずしも一致しません。
質問する際も部品切り出しできていたほうが問題も明確になりますし整理もできていますし、もしかしたら質問する前に自己解決できるかもしれません。成長にもつながります。

投稿2019/10/08 07:59

m.ts10806

総合スコア80875

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

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

kpg

2019/10/08 08:09

m.ts10806 様 ご丁寧な返答ありがとうございます。 今後の作業の進め方の参考にさせていただきます。 PHPマニュアルも避けずにしっかり参考にします。
m.ts10806

2019/10/08 08:18

PHPマニュアル主導にしたほうが効率も能率も上がるというのがそれなりにやってきた者としての意見です(私に限らず回答者の多くは推していますし回答にはしばしばPHPマニュアルが根拠資料として提示されます。) それだけ正しく確実な情報があるということですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問