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

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

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

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

Q&A

解決済

3回答

1672閲覧

画像が登録されるたびにphoto_idを重複なしで1からINSERTしたい

rms398

総合スコア50

PHP

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

0グッド

0クリップ

投稿2017/05/22 06:02

###前提・実現したいこと
html javascript phpで画像をアップロードする機能を作っています。
画像を登録するたびにphoto_idを重複なしで1からINSERTしたいです。
つまりどういうことかというと
画像をアップロード→DBManager.phpでphoto_idを1にして画像情報を登録する→
画像をアップロード→DBManager.phpでphoto_idを2にして画像情報を登録する→
画像をアップロード→DBManager.phpでphoto_idを3にして画像情報を登録する→...
ということです。
今は乱数でidを登録するということにしていますが
ものすごい低い確率でidが重複になり
データベースに画像情報を登録することができなくなります(photo_idを主キーにしているため)
###該当のソースコード

php

1//画像の登録する機能 2 function photo_insert($ph_name,$n_id,$ph_date,$ph_path){ 3 try{ 4 //DBに接続 5 $this->dbConnect(); 6 7 $stmt = $this->myPdo -> prepare("INSERT INTO photos(photo_id, nursery_school_id, photo_name, photo_date, photo_path) VALUES (:phid, :nid, :phname, :phdate, :phpath)"); 8 $stmt->bindValue(':phid', rand(1,2147483647), PDO::PARAM_INT);//この部分を重複なしで1からINSERTしたい 9 $stmt->bindValue(':nid', $n_id, PDO::PARAM_STR); 10 $stmt->bindValue(':phname', $ph_name, PDO::PARAM_STR); 11 $stmt->bindValue(':phdate', $ph_date, PDO::PARAM_STR); 12 $stmt->bindValue(':phpath', $ph_path, PDO::PARAM_STR); 13 //SQL実行 14 $stmt->execute(); 15 16 17 //DB切断 18 $this->dbDisconnect(); 19 20 //header('Location: registerOK.html'); 21 }catch (PDOException $e) { 22 print('書き込み失敗。'.$e->getMessage()); 23 throw $e; 24 //header('Location: registerNG.html'); 25 } 26 }

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

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

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

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

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

guest

回答3

0

ベストアンサー

photo_idをAUTO_INCREMENTにするのはどうでしょうか。

AUTO_INCREMENT

投稿2017/05/22 06:16

mri0815

総合スコア429

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

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

rms398

2017/05/22 06:56

AUTO_INCREMENTを使うとなるとINSERT INTOするときphoto_idの列は書かなくていいんですかね?
rms398

2017/05/22 06:59

すみません、調べたら見つかりました。
guest

0

IDが数字ということなので単純にmax+1でも良いと思います。
または乱数でいきたいのであれば、ID生成処理を再帰処理として別関数に切り出して
ID生成時に存在チェックをし、重複していた場合は再度ID生成処理を呼び出すというような形でどうでしょうか。

DBの機能を使って自動生成する方法もあります。
例えばMySQLはAUTO_INCREMENTPostgreSQLはシーケンス・・・など
この方が処理も見た目はスッキリすると思います。

投稿2017/05/22 06:16

編集2017/05/22 06:19
m.ts10806

総合スコア80850

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

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

0

idを現在の日時+ミリ秒で処理してみてはいかがでしょうか?

投稿2017/05/22 06:07

yambejp

総合スコア114829

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問