人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

PHP/MySQLで同じデータを2度書いてします。

環境:MySQL5.6.21,PHP5.6.2,Apache2.4,Windows8.0

下記サイトのようなプログラムを書き、
http://1811way.com/work008/sample002.txt

実行したところ
データを2度書いてしまいます。
*テーブル構造、プログラム、1度実行したときのデータ
は、上記サイトを参照してください。


ドットインストール(というプログラム学習サイト)
http://dotinstall.com/lessons/basic_php_advanced/6903
と全く同じ(DBへの接続部分だけ違います)
のですが。

テーブルの定義かとも思ったのですが、
id:int(11)で作成しています。

なぜだかわかりません。
よろしくお願いします。

●質問者: kohhi
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● pogpi
●100ポイント

根本的な解決策ではないかも知れませんが、nameにユニークキーを付ければいいですね。
alter table tablename add unique key (name);


2 ● syamaoka
●150ポイント ベストアンサー

テーブルを作った時に UNIQUE KEY 制約を設定していないと予想されるので、そういう挙動になります。

例えば、users.name でユニーク制約を付ける場合の例を以下で説明します。
まず、テーブルを以下の SQL で作成します。

/* database.sql */
CREATE DATABASE IF NOT EXISTS hatena_question;
GRANT ALL PRIVILEGES ON hatena_question.* TO hatena@localhost IDENTIFIED BY 'hatena';
FLUSH PRIVILEGES;
USE hatena_question;
CREATE TABLE IF NOT EXISTS `users`(
 `id` INT AUTO_INCREMENT,
 `name` VARCHAR(255) NOT NULL,
 `email` VARCHAR(255) NOT NULL,
 `password` VARCHAR(255) NOT NULL,
 PRIMARY KEY (`id`),
 UNIQUE KEY(`name`)
) engine=InnoDB CHARACTER SET utf8;

これを以下のコマンドで実行するとデータベース、テーブル、ユーザーが作成できます。

mysql -u root -p < database.sql

次は PHP です。

<?php
/** Main.php */
try {
 $dbh = new PDO('mysql:host=localhost;dbname=hatena_question','hatena', 'hatena');
 $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
 $stmt = $dbh->prepare("insert into users (name,email,password) values (:name,:email,:password)");
 $stmt->execute(array(":name"=>"n2",":email"=>"e2",":password"=>"p2"));
 echo "done";
} catch (PDOException $e) {
 echo($e->getMessage());
 exit;
}

これをコマンドラインで実行すると2度目からは DUPLICATE entry でエラーになります。

$ php Main.php 
SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'n2' for key 'name'

すでにレコードが存在していたら更新するようにしたい場合、MySQL の場合は以下のように SQL を変更すると実現できます。

<?php
try {
 $dbh = new PDO('mysql:host=localhost;dbname=hatena_question','hatena', 'hatena');
 $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
 $stmt = $dbh->prepare("INSERT INTO users (name,email,password) VALUES (:name,:email,:password) ON DUPLICATE KEY UPDATE email = VALUES(email), password = VALUES(password)");
 $stmt->execute(array(":name"=>"n2",":email"=>"e2",":password"=>"p2"));
 echo "done";
} catch (PDOException $e) {
 echo($e->getMessage());
 exit;
}

余計なお世話かもしれませんが、ドットインストールの該当の動画はちょろっと見ただけですけども、品質が高くないので別のコンテンツで学習した方が良さそうに思います…。


kohhiさんのコメント
ありがとうございました。できました。 >ドットインストール 僕のレベルだと丁度いいのかもしれませんね。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ