habrahabrの招待に似た招待の生成

スクリプトは、PHPで記述されたPNG形式の51x51ピクセルの画像の形式でサイトに登録するための招待状を生成し、データベースとしてMySQLを使用します。 楽しみのために作られた、それは初心者だけに興味があります。



GDライブラリを使用すると、さまざまな形式の画像を簡単に作成および編集できます。 画像を作成するには、いくつかの機能が必要です。

int imagecolorallocate(resource image, int red, int green, int blue)



* This source code was highlighted with Source Code Highlighter .




そして

int imagecolorallocatealpha(resource image, int red, int green, int blue, int alpha)



* This source code was highlighted with Source Code Highlighter .




両方の関数は、画像の色識別子を返します。 唯一の違いは、画像の透明度を設定するalphaパラメーターです。 しかし、古くからIEのPNG透過性に問題があったため、最初の関数を使用する方が適切です。 画像の最初の引数は、関数を使用して取得できます。

resource imagecreate( int x, int y)



* This source code was highlighted with Source Code Highlighter .




サイズx x yの空のパレット画像を表す画像識別子を返します。



まず、データベースにテーブルを作成する必要があります。

CREATE TABLE IF NOT EXISTS `di_invite` (

`invite_id` int (15) unsigned NOT NULL AUTO_INCREMENT,

`invite_hash` varchar (32) COLLATE utf8_unicode_ci DEFAULT NULL ,

`invite_serialize` text COLLATE utf8_unicode_ci,

`invite_username_owner` varchar (25) COLLATE utf8_unicode_ci DEFAULT NULL ,

`invite_username_recipient` varchar (25) COLLATE utf8_unicode_ci DEFAULT NULL ,

PRIMARY KEY (`invite_id`)

) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE =utf8_unicode_ci AUTO_INCREMENT=1 ;



* This source code was highlighted with Source Code Highlighter .




データベースには、各招待の一意の識別子(invite_id)、招待のハッシュ(invite_hash)、4つのRGBコンポーネントの配列、バイトストリーム表現(invite_serialize)、招待所有者のニックネーム(invite_username_owner)およびそれをアクティブにしたユーザーのニックネーム(invite_username_recipient)が保存されます。



次に、4色それぞれの赤、緑、青の成分の値を含む3x4配列を作成し、データベースに書き込む必要があります。





  1. 関数add_invite(){
  2. // 4つのランダムな色を作成し、配列に書き込みます
  3. $ rgb_array =配列();
  4. for ($ idx = 0; $ idx <4; ++ $ idx){
  5. $ rgb = array();
  6. for ($ idx2 = 0; $ idx2 <3; ++ $ idx2)$ rgb [] = mt_rand(0、255);
  7. $ rgb_array [] = $ rgb;
  8. }
  9. //データベースに書き込むために配列をバイトストリーム表現に変換します
  10. $ serialize = serialize($ rgb_array);
  11. //ハッシュ招待
  12. $ hash = md5($ serialize);
  13. //挿入
  14. $ _CORE [ 'db' ]-> query( 'INSERT INTO `di_invite`(` invite_hash`、 `invite_serialize`、` invite_username_owner`)VALUES(?、?、?);' 、$ Hash、$ serialize、$ _CORE [ 'user' ]-> user_info [ 'user_name' ]);
  15. if ($ _CORE [ 'db' ]-> Influence_rows()== 1) return array( true'Invite "' 。$ hash。 '" created' );
  16. そうでない場合は、配列を返し ますfalse'ERROR-database error' );
  17. trueを 返し ます
  18. }
*このソースコードは、 ソースコードハイライターで強調表示されました。
この招待をユーザーに与える方法について考える必要があります。 もちろん、これを行う最も簡単な方法は、画像として表示することです。 画像を生成するときは、アクティブな招待ではなく、白黒の写真を提供する価値があることを考慮する必要があります。それ以外の場合は、本格的な4色の招待です。







  1. if (isset($ _ GET [ 'hash' ] {31})){
  2. //そのようなハッシュを持つデータベースで招待を探します
  3. $ result = $ _CORE [ 'db' ]-> query( 'SELECT `di_invite`.`invite_serialize`、` di_invite`.`invite_username_recipient` FROM `di_invite` WHERE` di_invite`.`invite_hash` = ?;' 、$ hash );
  4. //見つかった場合
  5. if ($ result && $ _CORE [ 'db' ]-> num_rows()== 1){
  6. //招待が既に使用されている場合は、白黒写真を提供します
  7. if ($ _CORE [ 'db' ]-> result($ result、0、 'invite_username_recipient' )!= '' ){
  8. //これが画像であることをブラウザに伝えます
  9. header( 'Content-type:image / png' );
  10. // 51x51の正方形を作成します
  11. $ im = ImageCreate(51、51)またはdie( 'Error creating image' );
  12. //グレーと白の2色を選択し、白が画像の背景として使用されます
  13. $ color [1] = imagecolorallocate($ im、255、255、255);
  14. $ color [2] = imagecolorallocate($ im、200、200、200);
  15. // 2つの灰色の長方形を斜めに描画します
  16. ImageFilledRectangle($ im、26、0、50、25、$ color [2]);
  17. ImageFilledRectangle($ im、0、25、25、50、$ color [2]);
  18. //画像をブラウザに出力します
  19. ImagePng($ im);
  20. //それを破壊します
  21. imagedestroy($ im);
  22. //それ以外の場合、招待がまだ使用されていない場合
  23. } else {
  24. //配列を復元します
  25. $ rgb_array = unserialize(mysql_result($ result、0、 'invite_serialize' ));
  26. header( 'Content-type:image / png' );
  27. $ im = ImageCreate(51、51)またはdie( 'Error creating image' );
  28. //配列値から4色を選択します
  29. for ($ i = 0; $ i <4; ++ $ i)
  30. $ color [$ i] = imagecolorallocate($ im、$ rgb_array [$ i] [0]、$ rgb_array [$ i] [1]、$ rgb_array [$ i] [2]);
  31. // 3つの長方形を描画します。4番目(つまり、配列のゼロ要素)の色はデフォルトの画像の背景です
  32. ImageFilledRectangle($ im、0、0、25、25、$ color [1]);
  33. ImageFilledRectangle($ im、26、0、50、25、$ color [2]);
  34. ImageFilledRectangle($ im、0、25、25、50、$ color [3]);
  35. ImagePng($ im);
  36. imagedestroy($ im);
  37. }
  38. } else {
  39. exit();
  40. }
  41. } else {
  42. exit();
  43. }
*このソースコードは、 ソースコードハイライターで強調表示されました。
小規模の場合、つまり、招待状の有効性を確認する場合が依然として当てはまります。 これを行うには、画像の四隅の配列に色の値を読み込み、データベースで結果の配列のハッシュを見つけようとするだけで十分です。







  1. 関数validate_invite($ hash_serialize、$ userfile){
  2. //画像の読み込み時にエラーがなかった場合、画像のサイズは許容サイズを超えず、タイプは適切です
  3. if (isset($ userfile)&& is_uploaded_file($ userfile [ 'tmp_name' ])&& $ userfile [ 'size' ] <5 * 1024 && $ userfile [ 'type' ] == 'image / png' && $ userfile [ 'エラー ' ] == 0){
  4. //ロードされたものに基づいて画像を作成します
  5. $ source = ImageCreateFromPNG($ userfile [ 'tmp_name' ]);
  6. //色がチェックされるポイントを定義します
  7. $ x [] = 48; $ y [] = 48; $ x [] = 2; $ y [] = 2; $ x [] = 48; $ y [] = 2; $ x [] = 2; $ y [] = 48;
  8. $ rgb_array =配列();
  9. for ($ i = 0; $ i <4; ++ $ i){
  10. //ポイントでカラーインデックスを取得します
  11. $ color_index = imagecolorat($ソース、$ x [$ i]、$ y [$ i]);
  12. //インデックスの色を取得します
  13. $ color_tran = imagecolorsforindex($ソース、$ color_index);
  14. //配列に書き込みます
  15. $ rgb =配列();
  16. $ rgb [] = $ color_tran [ 'red' ];
  17. $ rgb [] = $ color_tran [ 'green' ];
  18. $ rgb [] = $ color_tran [ 'blue' ];
  19. $ rgb_array [] = $ rgb;
  20. }
  21. //配列内のレコードと照合するために、配列をバイトストリーム表現に変換します
  22. $ serialize_rgb_array = serialize($ rgb_array);
  23. //ハッシュを取得
  24. $ hash_serialize_rgb_array = md5($ serialize_rgb_array);
  25. //データベース内のエントリを探します
  26. $ _CORE [ 'db' ]-> query( 'SELECT `di_invite`.`invite_id` FROM` di_invite` WHERE` di_invite`.`invite_hash` = ?;' 、$ Hash_serialize_rgb_array);
  27. //見つかった場合、メモリをクリアしてtrueを返します。それ以外の場合、メモリをクリアしてfalseを返します
  28. if ($ _CORE [ 'db' ]-> num_rows()<1){
  29. imagedestroy($ソース);
  30. falseを 返し ます
  31. } else {
  32. imagedestroy($ソース);
  33. $ hash_serialize = $ hash_serialize_rgb_array;
  34. trueを 返し ます
  35. }
  36. } else falseを 返し ます
  37. }
*このソースコードは、 ソースコードハイライターで強調表示されました。
次のような結果になります。





PS画像を構築する際に、1つの不正確さが生じました。そのため、取得された画像は対称ではありません。



All Articles