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

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

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

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

Q&A

解決済

2回答

2572閲覧

INSERT...ON DUPLICATE の使い方

teityann1225

総合スコア158

PHP

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

0グッド

0クリップ

投稿2017/05/11 06:47

編集2017/05/16 12:25

###コード

PHP

1 2<?php 3 4try { 5 6 /* リクエストから得たスーパーグローバル変数をチェックするなどの処理 */ 7 8 // データベースに接続 9 $pdo = new PDO( 10 'mysql:dbname=_data;host=mysql540.db.sakura.ne.jp;charset=utf8;username=te;password=te6', 11 12 '', 13 [ 14 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, 15 PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, 16 ] 17 ); 18 19 /* データベースから値を取ってきたり, データを挿入したりする処理 */ 20 echo"接続完了"; 21INSERT INTO table (a,b,c) VALUES (1,2,3) 22 ON DUPLICATE KEY UPDATE c=c+1; 23 24UPDATE table SET c=c+1 WHERE a=1; 25 26 27} catch (PDOException $e) { 28 29 // エラーが発生した場合は「500 Internal Server Error」でテキストとして表示して終了する 30 // - もし手抜きしたくない場合は普通にHTMLの表示を継続する 31 // - ここではエラー内容を表示しているが, 実際の商用環境ではログファイルに記録して, Webブラウザには出さないほうが望ましい 32 header('Content-Type: text/plain; charset=UTF-8', true, 500); 33 exit($e->getMessage()); 34 35} 36 37// Webブラウザにこれから表示するものがUTF-8で書かれたHTMLであることを伝える 38// (これか <meta charset="utf-8"> の最低限どちらか1つがあればいい. 両方あっても良い.) 39header('Content-Type: text/html; charset=utf-8'); 40 41?> 42<!DOCTYPE html> 43<html> 44 <head> 45 <meta charset="utf-8"> 46 <title>Example</title> 47 </head> 48 <body> 49 <!-- ここではHTMLを書く以外のことは一切しない --> 50 </body> 51</html>

###エラー内容
Parse error: syntax error, unexpected 'table' (T_STRING) in /www/PHP/bigData/index.php on line 20
参考資料
参考資料2
初心者ですいません。

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

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

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

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

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

Zuishin

2017/05/11 06:56

何がわからないのかまるでわかりません。見ている資料にはどう書いてありますか?
guest

回答2

0

SQL

1INSERT into 2 table1 3 (id, name, updated) 4 values 5 (1,'name', now()) 6ON duplicate key UPDATE 7 updated = now();

id:1のデータがなければ、1, name, 現在時刻 でレコードを作成
id:1のデータがあれば、updatedのカラムに現在時刻を登録

投稿2017/05/11 06:55

kunai

総合スコア5405

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

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

teityann1225

2017/05/11 07:04

回答ありがとうございます❗ この場合のデータベースへの接続がわかりません❗ どのように接続すればいいのですか?
kunai

2017/05/11 07:09

それはまた別の質問ですので、PHPでMySQLに接続する方法を別の質問として起票してください。 その際、自分で書いたPHPのソースコードを提示し、このように記載したがこういうエラーがでて接続出来なかった、と言うところまで提示してください。
guest

0

ベストアンサー

マニュアルは見ましたか?

文字通り、インサートするけど重複があったら更新する構文です。
重複かどうかを定義するために該当テーブルにはユニークを担保するカラムが必要です

追記

前回の質問

ボタンを押された回数をデータベースに記録する仕組み

を前提にまずテーブルの作成します。
とあるユーザーのユーザーIDをuidとして、ボタンをおした数をcountとします

SQL

1create table log(uid int not null unique,count int);

[追加、更新]
ユーザーID=100の人がボタンを押したときに発行するSQL

SQL

1insert into log values(100,1) on duplicate key update count=count+1;

初めて発行するとlogテーブルに100,1というデータが登録されます。
2回目に発行するとlogテーブルにあるuid=100のレコードのcountが2にインクリメントされます
3回目以降も同様です

PHPからの接続は仮にPDOを利用するとして

PHP

1$uid=100; 2try{ 3 $dsn = 'mysql:host=localhost; dbname=test'; 4 $user = '****'; 5 $password = '****'; 6 $pdo = new PDO($dsn, $user,$password); 7 $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 8 $pdo->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND,'SET NAMES utf8'); 9 $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); 10 $sql ="INSERT INTO log VALUES(?,1) "; 11 $sql.="ON DUPLICATE KEY UPDATE count=count+1 "; 12 $stmt = $pdo->prepare($sql); 13 $stmt->execute([$uid]); 14}catch(PDOException $e){ 15 die($e->getMessage()); 16} 17

のようなやり方になります。
ちなみに$uidはログインデータを元にセッションなどで管理するのが妥当でしょう

投稿2017/05/11 07:05

編集2017/05/11 07:29
yambejp

総合スコア114572

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問