ããã°ã©ã ã販売çšã®å Žåãè³Œå ¥ããã©ã€ã»ã³ã¹ãŸãã¯ããŒã«ãã£ãŠè³Œå ¥è ã®æ°ãç°¡åã«èšç®ã§ããŸã-誰ãšã ãã ããç¡æã®å Žåã¯åé¡ãçºçããŸãã ãªããµã€ãããŠã³ããŒãã®æ°ïŒååšããå ŽåïŒãèæ ®ããããšã¯ç¡æå³ã§ãã ã€ã³ã¿ãŒãããã«äœããå ¥ããšããŠã§ã¢ãŒãºã®ãªãœãŒã¹ãšãã¬ã³ããã©ãã«ãŒã®æ°ãå¢ãå§ããŸãã
ããã«æ·»ä»ãããŠãããœãªã¥ãŒã·ã§ã³ã§ã¯ããã®ãããªè©³çŽ°ãªã¬ããŒãã¯æäŸãããããœãããŠã§ã¢çµ±èšãµãŒãã¹ãªã©ã®ããŒã¿ã¯ããŸãåéãããŸããïŒå¿ èŠãããŸããïŒïŒãã ããæ£ããèŠããŠããã°æ¯æãããŸãïŒã ãããããã©ã¹ããããŸããã·ã¹ãã ã¯ãã€ã§ãããŒãºã«åãããŠä»äžããããšãã§ããŸãã
ç§ã¯ãªãªãžãã«ã®ãµããããŸããã確ãã«äŒŒããããªãã®ããã§ã«ååšããã®ã§ãç§ã¯ç¹ã«ãããæ¢ããŸããã§ããã ç§ã¯è©³çŽ°ã«æžã蟌ãããšããŸããããããã¯åŠçã®çšèªéã®ããã«ãèŠããŸããã äžè¬çã«ã誰ãã圹ã«ç«ã€ãšé¢çœããããããŸããã
åæ§
ããã§ãç§ãã¡ã®ããã°ã©ã ã¯äžçäžã«åºãããŸããããããŠä»ãç§ãã¡ã¯ãããã©ãã»ã©ã°ããŒãã«ã§ããããç¥ãããã§ãã æåã«ãããã³ããŒãå¥ã®ã³ããŒãšåºå¥ããæ¹æ³ã決å®ããå¿ èŠããããŸãã æåã«é ã«æµ®ãã¶ã®ã¯GUIDã§ãã ããšãã°ãã€ã³ã¹ããŒã«äžãŸãã¯ã¢ããªã±ãŒã·ã§ã³ã®æåã®èµ·åæã«çæãããã¡ã€ã«ãŸãã¯ã¬ãžã¹ããªã«ä¿åããŸãã ãã®ãªãã·ã§ã³ã®å©ç¹ã¯ã·ã³ãã«ã§ããããã€ãã¹ã¯ã€ã³ã¹ããŒã©ãŒãèµ·åãããã³ã«GUIDãæ°ãããªãããšã§ãã ããªã㡠貧ãã仲éãã·ã¹ãã ïŒãŸãã¯ãããç°¡åã«èšãã°ãç§ãã¡ã®ããã°ã©ã ïŒãåã€ã³ã¹ããŒã«ãããšãé倧è©äŸ¡ãããçµæãåŸãããŸãã ãã®ãããªãœãªã¥ãŒã·ã§ã³ã¯ãå®éã®ãŠãŒã¶ãŒæ°ã§ã¯ãªããããã°ã©ã ã®ã€ã³ã¹ããŒã«æ°ãèšç®ããã®ã«é©ããŠããŸããã倧ãŸããªèŠç©ããã«äœ¿çšããããšã¯ãŸã£ããåé¡ãããŸããã GUIDã¯ãããšãã°æ¬¡ã®ããã«ååŸã§ããŸãã
string guid = Guid.NewGuid().ToString(); Console.WriteLine("guid: {0}", guid);
ããã°ã©ã ã®ã³ããŒãã³ã³ãã¥ãŒã¿ãŒããŒããŠã§ã¢ã«ãã€ã³ããããšãããæ£ç¢ºãªçµæãåŸãããŸãã ãã ããããã§ã¯ãã¢ããã°ã¬ãŒãïŒããšãã°ãHDDã®äº€æïŒã«ãããHardwareIDãå€æŽãããããšã«çæããå¿ èŠããããŸãã ãããã£ãŠãããŒã¿ãœãŒã¹ã«ã¯ãæãé·ããåç¶ãããã®ã䜿çšããããšããå§ãããŸãã ãã¶ãŒããŒããŸãã¯ããã»ããµã§ããå¯èœæ§ããããŸãã éåžžãã³ã³ãã¥ãŒã¿ãŒãå®å šã«äº€æããããšå€æŽãããŸãã 以äžã¯ãCPU IDãšMotherBoard IDãæœåºãããããããmd5ããã·ã¥ãèšç®ããã³ãŒãã§ãã
çµæã¯ãã§ã«èå¥ã«äœ¿çšã§ããŸãã
ã²ãã£ã
private static string GetHID() { string CPUid = string.Empty; string MtbId = string.Empty; string DiskId = string.Empty; string HID = string.Empty; ManagementObjectSearcher mos = new ManagementObjectSearcher(); // mos.Query = new ObjectQuery("Select * From Win32_processor"); foreach (ManagementObject mo in mos.Get()) { try { CPUid = mo["ProcessorID"].ToString(); } catch { } } // mos.Query = new ObjectQuery("SELECT * FROM Win32_BaseBoard"); foreach (ManagementObject mo in mos.Get()) { try { MtbId = mo["SerialNumber"].ToString(); } catch { } } // ManagementObject dsk = new ManagementObject(@"win32_logicaldisk.deviceid=""C:"""); try { DiskId = dsk["VolumeSerialNumber"].ToString(); } catch { } Byte[] Bytes = Encoding.ASCII.GetBytes(CPUid + MtbId + DiskId); if (Bytes.Length == 0) return ""; MD5 md5 = MD5.Create(); Byte[] HidBytes = md5.ComputeHash(Bytes); foreach (Byte b in HidBytes) HID += b.ToString("X2"); return HID; }
ãã®æ¹æ³ã§ã¯ãããŒããã£ã¹ã¯ã®ããªã¥ãŒã ã·ãªã¢ã«ãè¿œå ãããŸããã ä»®æ³ç°å¢ã§ã¯ãCpuIDãšãã¶ãŒããŒãã®ã·ãªã¢ã«çªå·ãæ€åºãããªãå ŽåããããŸãïŒå°ãªããšã0ãŸãã¯äŸå€ã衚瀺ãããŸãïŒã
WMIã¯ããŒããŠã§ã¢æ å ±ãååŸããããã«äœ¿çšãããŸãã 察å¿ããåå空éãæ¥ç¶ããããšãå¿ããªãã§ãã ããïŒ
using System.Management;
WMIã«ã¯ãã·ã¹ãã ã«é¢ããã»ãŒãã¹ãŠã®æ å ±ãåŒãåºãããšãã§ããèšå€§ãªæ°ã®ã¯ã©ã¹ãå«ãŸããŠãããããå¿ èŠã«å¿ããŠãªã¹ããå±éã§ããŸãã
ä»çµã¿
ããã§ãäœæ¥ã®ã¢ã«ãŽãªãºã ãèšå®ããã·ã¹ãã ã®ã©ã€ããµã€ã¯ã«ã«åå ããããŒã¿ã決å®ããŸãã ããŒã¿äº€æã®æ±ºå®ãè€éã«ããªãããã«ãHTTPãããã³ã«ã䜿çšããŸãã çµå±ã®ãšãããWEBã¯ã€ã³ã¿ãŒãããäžã§æãäžè¬çãªãµãŒãã¹ã§ãããå€ãã¯çŸåšãã¬ã³ã¿ã«ãŸãã¯ç¬èªã®ãã¹ãã£ã³ã°ãæã£ãŠããã®ã§ããªããã®æ©èœãæ¡åŒµããŸãããïŒ ãããã£ãŠãæã ã¯è»èŒªãåçºæããã®ã§ã¯ãªãããã 座ã£ãŠè¡ããŸãã
ç§ã¯é¢åã§ã¯ãªããå³ãæããŸããïŒUMLã®å°é家ã¯ã容赊ãã ããïŒã åè¿°ã®ããã«ãã¯ã©ã€ã¢ã³ããšãµãŒããŒã¯HTTPãä»ããŠéä¿¡ããã¯ã©ã€ã¢ã³ãã¯å¿ èŠãªããŒã¿ãåéããPOSTèŠæ±ã§ãµãŒããŒã«éä¿¡ããŸãã

ãµãŒããŒã¯æçµçã«ã¯PHPã¹ã¯ãªããã§ããããã®ã¿ã¹ã¯ã¯ã¯ã©ã€ã¢ã³ãããããŒã¿ãåä¿¡ããæå¹æ§ã確èªãããã¹ãŠãæ£åžžã§ããã°ããã®ããŒã¿ãããŒã¿ããŒã¹ã«ä¿åããæçµçã«ã¯ã©ã€ã¢ã³ãã«æäœã®çµæãéç¥ããŸãã ãµãŒããŒã®å¿çã¯æ¬¡ã®ããã«å®çŸ©ãããŸãã
- OK-ããŒã¿ãæ€èšŒãããããŒã¿ããŒã¹ã«æ£åžžã«ä¿åãããŸããã ãã®å Žåãã¯ã©ã€ã¢ã³ãã¯ããã°ã©ã ã®ç»é²ãè©Šè¡ããå¿ èŠããªããªããŸãã
- COPY_EXIST-ãã®ãããªAppName ã AppVersion ãããã³MachineIDãæã€ããã°ã©ã ã¯ãã§ã«ç»é²ãããŠããŸãã ããã¯ãåã®ã»ãã·ã§ã³ã§äœããééã£ãŠããããšã瀺åããŠããŸãã ããã°ã©ã ã¯ç»é²ãããŸããããã¯ã©ã€ã¢ã³ãã¯ãµãŒããŒã«å¿çããŸããã§ããã ãã®å Žåãã¯ã©ã€ã¢ã³ãã¯ãµãŒããŒã«æ¥ãå¿
èŠããªããªããŸãã
- APP_NOT_EXIST-ãµãŒããŒã¯ãã®ããã°ã©ã ãç»é²ããããã«æ§æãããŠããŸããã ãã®çãã®æå³ã¯åŸã§æããã«ãªããŸãã
ä»ã®ãã¹ãŠã®ãµãŒããŒå¿çã¯ãšã©ãŒãšããŠèªèãããŸãã ãã®äŸã§ã¯ãã¯ã©ã€ã¢ã³ãã¯ã¢ããªã±ãŒã·ã§ã³å ã«ãããœãããŠã§ã¢ã¢ãžã¥ãŒã«ã§ãããçµ±èšæ å ±ãåéããŸãã ã¯ã©ã€ã¢ã³ããéä¿¡ããããŒã¿ã¯æ¬¡ã®ãšããã§ãã
- AppName ã AppVer-ããã°ã©ã ã®ååãšããŒãžã§ã³ã
- MachineIDã¯ãã®äžæã®èå¥åã§ãã
- OsVerã¯ããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã®ããŒãžã§ã³ã§ãã
ããã§ååã§ãããããã¹ãŠãç°¡åã«æ¡åŒµå¯èœã§ãã
ãµãŒããŒã¯ãã¯ã©ã€ã¢ã³ãããéä¿¡ãããããŒã¿ã«å ããŠãããŒã¿ã®éä¿¡å ã®IPã¢ãã¬ã¹ãšæ¥ä»ãç»é²ããŸãã
ã客æ§
ãã¹ãŠã®ã¯ã©ã€ã¢ã³ãã³ãŒããã¯ã©ã¹ã«ã©ãããã AppCopyãšåŒã³ãŸãã ã äœæ¥ã¯éåžžã«ç°¡åã§ããã·ãŒã±ã³ã¹å³ãæ€èšããŠãã ããã

ããã§ãAPPã¯çµ±èšæ å ±ãåéããããã°ã©ã ã§ãã ãŸããAppCopyã¯ã©ã¹ã®ä»£è¡šãäœæãããå¿ èŠãªãã¹ãŠã®ãã©ã¡ãŒã¿ãŒãæž¡ãããŸãã
次ã«ãRegistrationã¡ãœãããåŒã³åºãå¿ èŠããããã¯ã©ã¹ããã®ä»äºãéå§ããŸãã å®äºãããšãOnRegistrationCompliteã€ãã³ããçºçããããã§äœæ¥ã®çµæã転éãããŸãã ãã®åŸãã¯ã©ã€ã¢ã³ãã決å®ãè¡ããç»é²ãæåããå Žåããã以äžã®å¿ èŠã¯ãããŸãããããã倱æããå Žåã¯ãããšãã°ããã°ã©ã ã®æ¬¡åèµ·åæã«åè©Šè¡ããå¿ èŠããããŸãã ããã¯ãã¹ãŠãå®è£ ãšéæãããçµæã«äŸåããŸãã
Appcopy
class AppCopy { // . Sender - , // ResultStatus - public delegate void OnRegistrationRef (AppCopy Sender, RegResult ResultStatus); // . public event OnRegistrationRef OnRegistrationComplete; // public string MachineId; // public string AppName; // public string AppVersion; // public string OsVersion; // URL public string RegUrl; // public int NumbersAttempts; // () public int AttemtsInterval; // public enum RegResult { // Ok, // , NetworkError, // id AlreadyExist, // . NoAttempts }; // Thread. private Thread RegistrationThread; // public RegResult ResultStatus { get; private set; } // . . public string HttpResponsetData { get; private set; } // public AppCopy(string RegUrl, string MachineId, string AppName, string AppVersion, string OsVersion) { this.MachineId = MachineId; this.OsVersion = OsVersion; this.AppName = AppName; this.AppVersion = AppVersion; this.RegUrl = RegUrl; //=== === NumbersAttempts = 1; AttemtsInterval = 60000; ResultStatus = RegResult.NoAttempts; // ThreadMotion - . RegistrationThread = new Thread(ThreadMotion); } // public void Registration() { RegistrationThread.Start(); } // . private void ThreadMotion() { // NumbersAttempts for (int cntAttemps = 0; cntAttemps < NumbersAttempts; cntAttemps++) { SendRegistrationData(); // if (ResultStatus == RegResult.Ok || ResultStatus == RegResult.AlreadyExist) break; // , AttemtsInterval . Thread.Sleep(AttemtsInterval); } // OnRegistrationComplete. OnRegistrationComplete(this, ResultStatus); } // web . private RegResult SendRegistrationData() { // = string postString = "MachineID=" + this.MachineId + "&AppName=" + this.AppName + "&AppVersion=" + this.AppVersion + "&OsVersion=" + this.OsVersion; // byte[] postBytes = Encoding.UTF8.GetBytes(postString); // Stream dataStream = null; WebResponse response = null; StreamReader reader = null; try { // HttpWebRequest request = (HttpWebRequest)WebRequest.Create(this.RegUrl); // , POST request.Method = "POST"; // request.ContentType = "application/x-www-form-urlencoded"; // request.ContentLength = postBytes.Length; // dataStream = request.GetRequestStream(); // "" dataStream.Write(postBytes, 0, postBytes.Length); // , response = request.GetResponse(); // dataStream = response.GetResponseStream(); // reader = new StreamReader(dataStream); this.HttpResponsetData = reader.ReadToEnd(); /* . "" "EXIST_ID", ResultStatus . . "" HttpResponsetData */ switch (HttpResponsetData) { // case "OK": ResultStatus = RegResult.Ok; break; // case "COPY_EXIST": ResultStatus = RegResult.AlreadyExist; break; // , APP_NOT_EXISTS, (40*, 50*) default: ResultStatus = RegResult.NetworkError; break; } } catch { // . ResultStatus = RegResult.NetworkError; } finally { //=== === if (dataStream != null) dataStream.Close(); if (reader != null) reader.Close(); if (response != null) response.Close(); } return ResultStatus; } }
å°ã説æããŸãã ãããã¯ãŒã¯ã§ã®äœæ¥ã¯ãé·æéããšèŠãªãããŸããæ¥ç¶ãæªãå ŽåïŒãŸãã¯ã€ã³ã¿ãŒãããããŸã£ãããªãå ŽåïŒãã¢ããªã±ãŒã·ã§ã³ã¯ãããªãŒãºããããŠãŒã¶ãŒã¯èµ€ãååããŸãã¯3ã€ã®ãã¿ã³ãã¯ãªãã¯ããŸãã ãããã£ãŠãWebãµãŒããŒã§åäœããã³ãŒããå¥ã®ã¹ããªãŒã ã«å ¥ããŸããã ããã§ããµãŒããŒãšã®çžäºäœçšã¯é¡èã«çºçãããã¡ã€ã³ããã°ã©ã ã®åäœã«åœ±é¿ããŸããã ã³ãŒãã¯ããã³ã¡ã³ããããŠããã®ã§ãç§ã¯ããã«ã€ããŠé·ã ãšèšãã€ããã¯ãããŸãããç§ã¯ãããã©ã®ããã«æ±ããã®äŸã瀺ãã ãã§ãã
äŸ
static void Main(string[] args) { // AppCopy appCopy = new AppCopy("http://test.info/reg_url.php", GetHID(), "Program_name", "Program_ver", GetOsVersion()); // appCopy.OnRegistrationComplete += RegistrationFinish; appCopy.AttemtsInterval = 10; // appCopy.Registration(); Console.Read(); } // private static void RegistrationFinish(AppCopy Sender, AppCopy.RegResult ResultStatus) { Console.WriteLine("Registration result: {0} \nInformation: {1}", ResultStatus, Sender.HttpResponsetData); } private static string GetOsVersion() { ManagementObjectSearcher mos = new ManagementObjectSearcher("SELECT Caption FROM Win32_OperatingSystem"); string name = ""; foreach (ManagementObject mobj in mos.Get()) { try { name = mobj.GetPropertyValue("Caption").ToString(); } catch { }; } return name; }
GetOsVersionïŒïŒé¢æ°ã¯GetHIDïŒïŒãšåæ§ã«æ©èœããŸããããŒãžã§ã³ã§ã¯ãªãããWindows 10 Enterprise ...ãã®åœ¢åŒã§OSåãè¿ããŸãã ããç°¡åãªæ¹æ³ã§ã.NETçµç±ã§OSããŒãžã§ã³ãååŸã§ããŸãã
Environment.OSVersion
ãããããã®ãªãã·ã§ã³ã¯ç§ã«ãšã£ãŠããŸãæçã§ã¯ãªãããã«æãããŸããã
ãµãŒããŒ
ãã®ãããããã°ã©ã ã¯å¿ èŠãªæ å ±ããã¹ãŠåéãããµãŒããŒã«éä¿¡ããŸããã ããã§ããã®ããŒã¿ãåãå ¥ãããã§ãã¯ããæåããå Žåã¯é©åãªåœ¢åŒã§ããŒã¿ããŒã¹ã«ä¿åããã¿ã¹ã¯ã«çŽé¢ããŸãã ããã¯ãµãŒããŒãè¡ãããšã§ãã ããã«ããµãŒããŒã¯åéããæ å ±ãæäŸãã䟿å©ãªåœ¢åŒã§ã¬ããŒããçæã§ããå¿ èŠããããŸãã
ããããæåã«ãããŒã¿ããŒã¹ãç解ããŸãããã ããŒã¿ããŒã¹ã¯ã copys ã apps ã sumã®3ã€ã®ããŒãã«ã§æ§æãããŠããŸãã

ã³ããŒããŒãã«ã«ã¯6ã€ã®ãã£ãŒã«ããããããã®æå³ã¯ååã§ããããŸãã ç§ã¯ãã æ¥ä»ã«æ³šæããIPã¯ã¯ã©ã€ã¢ã³ãã«ãã£ãŠéä¿¡ãããããµãŒããŒã¹ã¯ãªããã«ãã£ãŠåä¿¡ããã appidã¯ããã°ã©ã èå¥åã§ãããå€éšïŒå€éšããŒïŒããŒã§ããã appsããŒãã«ãžã®ãªã³ã¯ã圢æããŸãã åŸè ã«ã¯3ã€ã®ãã£ãŒã«ãããããŸãïŒæ¢ç¥ã®appid ãããã§ã¯äž»ããŒã appnameããã³appverã¯ããããããã°ã©ã ã®ååãšããŒãžã§ã³ã§ãã ã·ã¹ãã ã¯ããã®è¡šã«ãªã¹ããããŠããããã°ã©ã åãšããŒãžã§ã³ã®ã¿ãã«ãŠã³ãããŸãã ãããŠæåŸã«ã åèš -ããã¯èŠçŽããŒãã«ã§ãããçµæã®çµ±èšã¯ããã«ä¿åãããŸãã ããŒãã«ã«ã¯appidãšsumã® 2ã€ã®ãã£ãŒã«ãããããŸãã ç»é²ã®åèšæ°ãä¿åãããã®ã¯ã åèšãã£ãŒã«ãã§ãã
ããªã¬ãŒïŒtg_new_copyïŒã¯ã³ããŒããŒãã«ã«ãã€ã³ããããæ°ããããŒã¿ãè¿œå ïŒAFTER INSERTïŒããåŸã«æ©èœããŸãïŒæ¬¡ã®ã³ããŒãç»é²ãããšãïŒã åèšããŒãã«ã®åèšãã£ãŒã«ãã®å€ã1ã€å¢ãããŸãã åœç¶ã appidãç»é²ãããŠããããã°ã©ã ã®appnameãšappverã«å¯Ÿå¿ããå Žåã«ã®ã¿ã åèšã®å€æŽãçºçããŸãã
appsããŒãã«ã«ã¯ããªã¬ãŒïŒtg_new_appïŒãããããããããŒã¿ãè¿œå ããåŸã«æ©èœããŸãã ãã®ããªã¬ãŒã®ã¿ã¹ã¯ã¯ã åèšããŒãã«ãåæåããããšã§ãã
äœæ¥ã®è«çã¯æ¬¡ã®ãšããã§ãã program1ã¢ããªã±ãŒã·ã§ã³ãããŒãžã§ã³1.0.0.0ãäœæããŸãããã ã·ã¹ãã ã«ãã®ããã°ã©ã ãéç¥ããŠç»é²ãéå§ããã«ã¯ãæåã«appnameãšappverãappsããŒãã«ã«è¿œå ããŸãã å¥ã®å³ã次ã«ç€ºããŸãã

æ°ããã¬ã³ãŒããè¿œå ããããšãappidãèªåçã«å²ãåœãŠããïŒäžèšã®å³-1ïŒãããªã¬ãŒtg_new_appãèµ·åããŸã ãããã«ãããå ã«ååŸããappidã§æ°ããã¬ã³ãŒãsum = 0ãsumããŒãã«ã«è¿œå ãããŸãã
ããã§ãããã°ã©ã ã«é¢ããããŒã¿ãåéããæºåããã¹ãŠæŽããŸããã ã³ããŒããŒãã«ã«æ°ããè¡ãè¿œå ããåŸã tg_new_copyããªã¬ãŒã¯ãåãååã®ããŒãã«ã®åèšãã£ãŒã«ãã1ã€å¢ãããŸã

ååãªåè·¯ããããšæãã®ã§ãããã°ã©ãã³ã°ãè¡ããŸãã ãŸããããŒã¿ããŒã¹ãæºåããå¿ èŠããããŸããããŒãã«ãšããªã¬ãŒãäœæããé¢ä¿ãå®çŸ©ããŸãã ãããè¡ãããã«ãã·ã¹ãã ã®å±éæã«äžåºŠã ãå®è¡ããå¿ èŠãããå¥ã®ã¹ã¯ãªãããäœæããŸããã ããŒã¿ããŒã¹æ¥ç¶ãã©ã¡ãŒã¿ãŒãããŒãã«åãªã© å¥ã®ãã¡ã€ã«ã«å ¥ããŸãã ãããã¯ããã€ãã®ã¹ã¯ãªããã§å¿ èŠã«ãªããŸãã
config.php
<?php // // $db_name = 'db_regapps'; // $db_login = 'db_regapps'; // $db_pass = '12345678'; // $db_host = 'localhost'; // $apps_table_name = 'tb_apps'; $stat_table_name = 'tb_copies'; $sum_table_name = 'tb_sum';
次ã«ãããŒã¿ããŒã¹æ§æã¹ã¯ãªããïŒ
setup.php
<?php require 'config.php'; // $db_handle = new mysqli($db_host, $db_login, $db_pass, $db_name); echo " : <b> "; if ($db_handle->connect_errno) die(" </b> ($db_handle->connect_error)"); else echo " </b>"; // === === echo "<br> $apps_table_name: <b>"; // (app) $sql_query = "CREATE TABLE $apps_table_name (appid INT AUTO_INCREMENT NOT NULL PRIMARY KEY, appname VARCHAR(20) NOT NULL, appver VARCHAR(20) NOT NULL) CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE=InnoDB"; $result = $db_handle->query($sql_query); show_result(); echo "<br> $stat_table_name: <b>"; // $sql_query = "CREATE TABLE $stat_table_name (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, machineid VARCHAR (32) NOT NULL, osver VARCHAR (128), appid INT NOT NULL, date DATETIME, ip VARCHAR(15), FOREIGN KEY fk_stat(appid) REFERENCES $apps_table_name(appid) ON UPDATE CASCADE ON DELETE CASCADE) CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE=InnoDB"; $db_handle->query($sql_query); show_result(); echo "<br> $sum_table_name: <b>"; // $sql_query = "CREATE TABLE $sum_table_name(appid INT NOT NULL , sum INT NOT NULL DEFAULT 0, FOREIGN KEY fk_sum(appid) REFERENCES $apps_table_name(appid) ON UPDATE CASCADE ON DELETE CASCADE) CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE=InnoDB"; $db_handle->query($sql_query); show_result(); // === === echo "<br> tg_new_app: <b>"; $sql_query = "CREATE TRIGGER tg_new_app AFTER INSERT ON $apps_table_name FOR EACH ROW BEGIN INSERT INTO $sum_table_name SET appid=NEW.appid; END"; $db_handle->query($sql_query); show_result(); echo "<br> tg_new_copy: <b>"; $sql_query = "CREATE TRIGGER tg_new_copy AFTER INSERT ON $stat_table_name FOR EACH ROW BEGIN UPDATE $sum_table_name SET sum= $sum_table_name.sum + 1 WHERE appid=NEW.appid; END"; $db_handle->query($sql_query); show_result(); $db_handle->close(); function show_result() { global $db_handle; if($db_handle->errno) die(" </b> ($db_handle->error)"); else echo " </b>"; }
ã¡ã€ã³ã³ãŒããappstatã¯ã©ã¹ã«æå°åããŸããã
appstat.php
class appstat { private $db_handle; // private $last_error; // private $apps_table_name; // apps private $stat_table_name; // copies private $sum_table_name; // sum // function __construct($db_name, $db_host, $db_login, $db_pass, $apps_table_name, $stat_table_name, $sum_table_name) { $this->apps_table_name = $apps_table_name; $this->stat_table_name = $stat_table_name; $this->sum_table_name = $sum_table_name; // $this->db_handle = mysqli_connect($db_host, $db_login, $db_pass, $db_name); // $this->last_error = mysqli_connect_error(); } // . , appid, null public function add_app($app_name, $app_ver) { $app_id = $this->app_exist($app_name, $app_ver); if ($app_id != 0) return $app_id; // , $sql_query = "INSERT INTO $this->apps_table_name(appname, appver) VALUES('$app_name', '$app_ver')"; mysqli_query($this->db_handle, $sql_query); $this->last_error = mysqli_error($this->db_handle); } // . public function delete_app($app_name, $app_ver) { // , , id $app_id = $this->app_exist($app_name, $app_ver); if ($app_id != 0) { $sql_query = "DELETE FROM $this->apps_table_name WHERE appid=$app_id"; mysqli_query($this->db_handle, $sql_query); } $this->last_error = mysqli_error($this->db_handle); } // , 0 . // , appid private function app_exist($app_name, $app_ver) { $sql_query = "SELECT appid FROM $this->apps_table_name WHERE appname='$app_name' AND appver='$app_ver'"; $result = mysqli_query($this->db_handle, $sql_query); $this->last_error = mysqli_error($this->db_handle); if($result->num_rows === 0) { return 0; } else{ return $result->fetch_assoc()['appid']; } } // . app_id - // 0, , id private function copy_exist ($machine_id, $app_id) { $sql_query = "SELECT id FROM $this->stat_table_name WHERE appid='$app_id' AND machineid='$machine_id'"; $result = mysqli_query($this->db_handle, $sql_query); if ($result->num_rows != 0){ return $result->fetch_assoc()['id']; } return 0; } // . , , COPY_EXIST - , // APP_NOT_EXIXST - . public function add_copy($machine_id, $os_ver, $app_name, $app_ver, $ip) { // , $app_id = $this->app_exist($app_name, $app_ver); if ($app_id != 0){ // // , if ($this->copy_exist($machine_id, $app_id) === 0){ $sql_query = "INSERT INTO $this->stat_table_name(machineid, osver, appid, date, ip) VALUES('$machine_id', '$os_ver', $app_id, NOW(), '$ip')"; mysqli_query($this->db_handle, $sql_query); $this->last_error = $this->db_handle->error; return "OK"; } else{ // return "COPY_EXIST"; } } else // return "APP_NOT_EXIST"; } // public function db_close() { mysqli_close($this->db_handle); } // arr['appid', 'appname', 'appver', 'sum'] public function get_sum_apps_list() { $arr_result = array(); $sql_query = "SELECT $this->apps_table_name.appid, appname, appver, sum FROM $this->sum_table_name, $this->apps_table_name WHERE $this->sum_table_name.appid=$this->apps_table_name.appid"; $result = mysqli_query($this->db_handle, $sql_query); // while ($row = $result->fetch_array(MYSQLI_ASSOC)) { $arr_result[] = $row; } $this->last_error = mysqli_error($this->db_handle); return $arr_result; } // arr['machineid', 'osver', 'date', 'ip'] // public function get_copys_list($app_name, $app_ver) { $appid = $this->app_exist($app_name, $app_ver); if ($appid != 0) { $sql_query = "SELECT machineid, osver, date, ip FROM $this->stat_table_name WHERE appid=$appid"; $result = mysqli_query($this->db_handle, $sql_query); $arr_result = array(); while ($row = $result->fetch_array(MYSQLI_ASSOC)) { $arr_result[] = $row; } return $arr_result; } } // , arr['appname', 'appver', 'date', 'ip'] // machine_id - hardware ID public function get_client_apps($machine_id) { $sql_query = "SELECT appname, appver, date, ip FROM $this->apps_table_name JOIN $this->stat_table_name ON $this->stat_table_name.appid=$this->apps_table_name.appid WHERE machineid='$machine_id'"; $result = mysqli_query($this->db_handle, $sql_query); $arr_result = array(); while ($row = $result->fetch_array(MYSQLI_ASSOC)) { $arr_result[] =$row; } return $arr_result; } // . public function get_error() { return $this->last_error; } }
ããã§ã¯ãã³ãŒãã«ãååãªã³ã¡ã³ããä»ããããŠãããããããã§ã¯è©³ãã説æããŸããã
ãããæ±ãæ¹æ³
ãã®ãã¹ãŠã®è¯ãæ¹æ³ã§äœæ¥ããæ¹æ³ã瀺ããŸãã ãŸããããã°ã©ã ãç»é²ããå¿ èŠããããŸããããã«ã¯ã以äžã«ç€ºããã©ãŒã ã䜿çšã§ããŸãã
appform.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <titl> </titl> </head> <body> <form action="http://test.info/regapp.php?Action=AddApp" method="post"> <label>AppName</label> <br> <input type="text" name="AppName" ><br> <br> <label>AppVersion</label><br> <input type="text" name="AppVersion" ><br> <br> <button type="submit" >Send</button> </form> </body> </html>
ããŒã¿ã¯POSTã¡ãœããã§regapp.phpã¹ã¯ãªããã«éãããããã«Actionãã©ã¡ãŒã¿ãŒãæž¡ãããŸããããã«ãããã¹ã¯ãªããã«å¿ èŠãªæ å ±ãéç¥ãããŸãã ãã©ã¡ãŒã¿ãŒã¯GETã¡ãœããã«ãã£ãŠæž¡ãããŸãã
regapp.php
<?php require 'config.php'; require 'appstat.php'; // $app_stat = new appstat($db_name, $db_host, $db_login, $db_pass, $apps_table_name, $stat_table_name, $sum_table_name ); if ($app_stat->get_error()) die(" ($app_stat->get_error())"); // switch ($_GET['Action']) { // case 'AddApp': // if ((strlen($_POST['AppName']) == 0 || strlen($_POST['AppVersion']) == 0 )) { $app_stat->db_close(); die(' '); } else { $app_name = $_POST['AppName']; $app_ver = $_POST['AppVersion']; if ($app_stat->add_app($app_name, $app_ver) == false) echo " $app_name ($app_ver) "; else echo ' '; } break; // case 'AddCopy': // if (strlen($_POST['MachineID']) == 0 || strlen($_POST['AppName']) == 0 || strlen($_POST['AppVersion']) == 0 || strlen($_POST['OsVersion']) == 0) { $app_stat->db_close(); die(' '); } else { $app_name = $_POST['AppName']; // $machine_id = $_POST['MachineID']; // HardwarID $app_ver = $_POST['AppVersion']; // $client_ip = $_SERVER['REMOTE_ADDR']; // Ip $os_ver = $_POST['OsVersion']; // // echo $app_stat->add_copy($machine_id, $os_ver, $app_name, $app_ver, $client_ip); } break; } $app_stat->db_close();
ã芧ã®ããã«ãã¹ã¯ãªããã¯2ã€ã®æäœãå®è¡ã§ããŸããããã¯ãæ°ããããã°ã©ã ãããŒã¿ããŒã¹ã«è¿œå ãã次ã«Action = AddAppã2çªç®ã®æäœã¯ã³ããŒã®å®éã®ç»é²ã§ãããã®å ŽåãActionã¯AddCopyãšçãããªããŸãã
ç¹ã«å¥œå¥å¿çãªäººã¯ãã©ãŒã ã䜿çšããŠãæåã§ã³ããŒãç»é²ã§ããŸãã
copyform.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title> </title> </head> <body> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <form action="http://test.info/regapp.php?Action=AddCopy" method="post"> <label>AppName</label> <br> <input type="text" name="AppName" ><br> <br> <label>AppVersion</label><br> <input type="text" name="AppVersion" ><br> <br> <label>MachineID</label><br> <input type="text" name="MachineID" ><br> <br> <label>OsVersion</label><br> <input type="text" name="OsVersion" ><br> <br> <button type="submit" >Send</button> </form> </body> </html> </body> </html>

ä»ãããããè¡ãããšãããšãäºæãããå¿çAPP_NOT_EXISTãåãåããŸãããããã£ãŠãæåã«ããã°ã©ã ãç»é²ããŸãã

ä»ããçããååŸããŸã-OK
ããã«ãã£ãšãappstatã¯ã©ã¹ã«ã¯ãããŒãã«åœ¢åŒã®ã¬ããŒããååŸã§ãã3ã€ã®ã¡ãœããããããŸãããã®æ¹æ³ã瀺ããŸãã
showstat.php
<?php require "config.php"; require "appstat.php"; $app_stat = new appstat($db_name, $db_host, $db_login, $db_pass, $apps_table_name, $stat_table_name, $sum_table_name); // $result = $app_stat->get_sum_apps_list(); echo " <br>"; echo "<table border='1'><tr><th></th><th></th><th> </th></tr>"; for ($i = 0; $i < count($result); $i++) { $app = $result[$i]; echo "<tr><td>$app[appname] </td><td>$app[appver]</td><td>$app[sum]</td></tr>"; } echo "</table>"; echo "<br>"; // echo " <br>"; $result = $app_stat->get_copys_list('Program#1', '1.0.0.0'); echo "<table border='1'><tr><th>Machine ID</th><th> </th><th> </th><th>IP</th></tr>"; for ($i = 0; $i < count($result); $i++) { $copy = $result[$i]; echo "<tr><td>$copy[machineid]</td><td>$copy[osver]</td><td>$copy[date]</td><td>$copy[ip]</td></tr>"; } echo "</table>"; echo "<br>"; // echo " <br>"; $result = $app_stat->get_client_apps('666'); echo "<table border='1'><tr><th></th><th></th><th></th><th>IP</th></tr>"; for ($i = 0; $i < count($result); $i++) { $app = $result[$i]; echo "<tr><td>$app[appname]</td><td>$app[appver]</td><td>$app[date]</td><td>$app[ip]</td></tr>"; } echo "</table>";
ãã®çµæã

åŸãããŸããããã¶ã€ã³ãCSSãªã©ã¯æ°ã«ããŸããã§ãããããã«ç²ŸéããŠãã人ã«ããããŠãã ãããã¿ã¹ã¯ãèšå®ããã®ã¯ãããŒã¿ã®ååŸæ¹æ³ã瀺ããäœæ¥ãå®èšŒããããã ãã§ãã
ãããŠæåŸã«ããã¹ãŠãã©ã€ãã¯ã©ã€ã¢ã³ãã§ãã¹ãããŸããããèšäºã®æåã«æ»ããappCopyãªããžã§ã¯ãã®åæåãã©ã¡ãŒã¿ãŒã次ã®ããã«å€æŽããŸãã
AppCopy appCopy = new AppCopy("http://test.info/regapp.php?Action=AddCopy", GetHID(), "Program#1", "1.0.0.0", GetOsVersion());
ããã ãã§ãïŒããã°ã©ã ãå®è¡ã§ããŸããå¿çãšããŠãçµæãååŸããŸã

ãshowstat.phpãçæãããã®ãèŠãŠã¿ãŸããã

ãè¡šã§ãããããã«ãã¢ããªã±ãŒã·ã§ã³ã¯æ£åžžã«ç»é²ãããŸãããã¯ã©ã€ã¢ã³ããå床å®è¡ãããšããã®ãããªã³ããŒãæ¢ã«ååšãããšããã¡ãã»ãŒãžãããã°ã©ã ã«è¡šç€ºãããŸã

ãããã§ãã¹ãŠã§ããå°ãæ¹è¯ããã°ãããšãã°ããŠãŒã¶ãŒãããã°ã©ã ã§ãã³ã°ããŠããæéïŒç¹ã«ã²ãŒã ã«é¢é£ããæéïŒã«é¢ããçµ±èšãåéããããJavaã§ã¯ã©ã€ã¢ã³ããæžãæãããããŠãAndroidã¢ããªã±ãŒã·ã§ã³ã«ã³ãŒããå®è£ ã§ããŸãã