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

PhP4.2 mysql4 に関して

mysqlのデータべスへ
?h10001 から h10002,h10003・・・
と言う風に順番に増やして行くにはどのような書込みを行なえばいいですか?
※スタートはh10001です。
h19999の次はh20000にします。

?********(ランダムの英数字8文字)
これをmysqlに順番にinsertするにはどのようなスクリプトになりますか?
※ただし、同じものを書き込まないようにします。

詳しい方ご教授くださいませ


●質問者: rrr3
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:MySQL スクリプト スタート データ ランダム
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● Mook
●23ポイント

やり方はいろいろあると思いますが、

wd_table というテーブルに word というカラムがある場合のサンプルです。

<?php
// データベース情報
define( "db_Server", "localhost" );
define( "db_User", "foo" );
define( "db_Password", "bar" );
define( "db_Name", "testdb" );

// h###### を登録する
function addSerialWord() {
 $conn = mysql_connect( db_Server, db_User, db_Password ) or die("接続エラー");
 mysql_select_db( db_Name );

 // 現在登録されている最大値を取得
 $sql = "SELECT max( substr(word, 2, 6 ) ) AS max_num FROM wd_table WHERE word REGEXP '^h[0-9]{5}$'";
 $res = mysql_query( $sql, $conn );
 $row = mysql_fetch_array( $res, MYSQL_ASSOC );

 // 次の設定値を設定
 $nextWord = "h".( ( $row['max_num'] < 10000 ) ? 10000 : ( $row['max_num'] + 1 ) );

 // 登録
 $sql = "INSERT INTO wd_table ( word ) values ( '$nextWord' );";
 $res = mysql_query( $sql, $conn );
 return $nextWord;
}

// 8桁のランダムな 英数列を登録する
function addRandomWord() {
 $conn = mysql_connect( db_Server, db_User, db_Password ) or die("接続エラー");
 mysql_select_db( db_Name );

 // ランダムな Word を作成
 do {
 $newWord = substr( md5( rand() ), 1, 8 );
 $sql = "SELECT * FROM wd_table WHERE word='$newWord'";
 $res = mysql_query( $sql, $conn );
 } while ( mysql_num_rows($res) != 0 ); // 既に登録されているかを確認

 // 登録
 $sql = "INSERT INTO wd_table ( word ) values ( '$newWord' );";
 $res = mysql_query( $sql, $conn );
 return $newWord;
}

echo "新しい連番 登録結果 => ".addSerialWord()."<br>\n";
echo "ランダム語 登録結果 => ".addRandomWord()."<br>\n";
?>

ランダムな英数列を作成するのに PHP の MD5 関数を使用しています。


2 ● kn1967
●23ポイント

■h10001 から h10002,h10003・・・


(1)MySQLにレコードを追加する時点で番号を振りたい場合

・先頭がhと固定されているならば、その部分は必要に応じて附加するものとして

フィールド属性が AUTO_INCREMENT なフィールドを用意しておくと手間無しです。

http://dev.mysql.com/doc/refman/4.1/ja/example-auto-increment.ht...

・どうしてもhという文字もフィールドに格納したいということであれば

AUTO_INCREMENTは使えませんので一番大きな番号のフィールドを取得して、

SELECT フィールド名 FROM テーブル名 ORDER BY フィールド名 DESC LIMIT 1;

取得した内容から先頭の文字列を一旦削除の上で番号部分に+1して、

さらに先頭の文字列を追加してから書き戻すというクエリを作成すれば可能ですが

先頭文字列hを入れるためのフィールドとAUTO_INCREMENTのフィールドを

組み合わせて複数キーにしてしまうというほうが楽かもしれません。


(2)フォーム入力の時点で仮の番号を取得しておきたい場合

フォーム表示直前に新しい番号を新規追加しておくか、もしくは

新しい番号を保存しておくテーブルを別途で用意しておくかになりますが

いずれの場合も登録に失敗した際に番号が飛んでしまうというリスクがあり

あまり採用されません。

その変わりではありませんが、入力フォーム画面から登録完了通知画面までの間は、

まったく別の仮番号を発行し、レコード追加に成功した時点で得られた新しい番号を

「登録終了通知画面」などにて表示することで対応したりします。

(メールを送信して、その中に書かれたURLでアクセスすると正規登録完了みたいな

登録方法の場合にも用いられる手法です)

メール送信などを用いる場合は仮番号を管理しておくテーブルなどが必要になりますが

全てを画面上で行うならばphpのセッション管理機能を利用すればよいでしょう。


■ランダムな数字

(1)ランダムな数字をphp側で生成

http://jp2.php.net/rand

(2)ランダムな数字をMySQL側で生成

http://dev.mysql.com/doc/refman/4.1/ja/mathematical-functions.ht...

いずれにしても、生成に失敗したら、成功するまで繰り返すという手になるでしょう。


■ここからが本題。

短時間で回答が集まるサイトで回答が付かない・・・

回答範囲があまりに広い上に、詳しい方などという締めくくりですから、

みなさん回答に苦慮なさっておられるのだと思います。

造りたいものがある程度決まっておられるのでしょうから、

何を造りたいのか、その例として使えそうなソースはどこかにないかを

お聞きになるほうが解決には一番の近道だと思います。

私は自称でも「詳しい方」とは言えませんが、コメント欄が使えませんので、

ヒントを添えて回答欄に書かせていただきました。


3 ● Yota
●22ポイント

1.ダミーでAUTO_INCREMENTのカラム(seqとする)を作っておいて、INSERTする前にSELECTする。

SELECT MAX(seq) FROM tbl ;

ただし、nullが返った場合は0にする。

この値を$seqとする

INSERT INTO tbl(col) VALUES(CONCAT('h',10001+$seq)) ;

2.乱数だとぶつからない保障ができないので上のseqを連結する。

INSERT INTO tbl(col1) VALUES(CONCAT('適当なアルファベット',$seq,FLOOR(RAND()*1000000));

参考。

http://dev.mysql.com/doc/refman/4.1/ja/mathematical-functions.ht...


4 ● Yota
●22ポイント

すいません。

2に付いて修正させてください。

INSERT INTO tbl (col1)

VALUES(CONCAT($seq,SUBSTRING(MD5(CURRENT_TIME+0),1,7))) ;

参考

http://dev.mysql.com/doc/refman/4.1/ja/string-functions.html

◎質問者からの返答

ありがとうございます

VALUES(CONCAT($seq,SUBSTRING(MD5(CURRENT_TIME+0),1,7))) ;

こちら、解説をおねがいできますか?

関連質問


●質問をもっと探す●



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