實現對焦圖片放大
http://www.wangyexx.com/s_img/991.html
簡單文字提示
http://www.wangyexx.com/s_mouse/990.html
滑鼠移向文字彈出說明文字
http://www.wangyexx.com/s_mouse/693.html
Translate
2011年12月26日 星期一
2011年12月23日 星期五
iframe loading 與優化
有時後一個版面會嵌入好幾個iframe
後面應該用css來分會比較好啦
暫時先來簡單的…
引用:http://www.cnblogs.com/micheng11/archive/2009/03/31/1425883.html
但是IE可行,放在Firefox(FF)就…轉個不停...
引用:http://www.cnblogs.com/lovko/archive/2009/01/04/1368013.html
結束了,最後做個小小的整理
<script type="text/javascript">
function stateChangeIE(_frame,loadid) {
var b = document.getElementById(loadid.toString());
_frame.style.display = "none";
b.style.display = "block";
_frame.onreadystatechange = function() {
if (this.readyState == "complete") {
b.style.display = "none";
_frame.style.display = "block";
}
}
}
function stateChangeFirefox(_frame,loadid) {
var loader = document.getElementById(loadid.toString());
loader.style.display = "none";
_frame.style.display = "block";
}
</script>
<div id="load" ><img src="http://sc.cnwebshow.com/upimg/allimg/070707/01294420.gif" /></div>
<iframe id="demoframe" onreadystatechange=stateChangeIE(this,'load') onload=stateChangeFirefox(this,'load') src="輸入連結網頁" ></iframe>
好文:
http://www.seomydream.com/seo-jiqiao/iframe.htm,如何優化iframe框架的技巧
http://www.cnblogs.com/tianguook/archive/2010/06/24/1764235.html,Frame、iFrame、noframe的區別和使用
後面應該用css來分會比較好啦
暫時先來簡單的…
引用:http://www.cnblogs.com/micheng11/archive/2009/03/31/1425883.html
但是IE可行,放在Firefox(FF)就…轉個不停...
引用:http://www.cnblogs.com/lovko/archive/2009/01/04/1368013.html
結束了,最後做個小小的整理
<script type="text/javascript">
function stateChangeIE(_frame,loadid) {
var b = document.getElementById(loadid.toString());
_frame.style.display = "none";
b.style.display = "block";
_frame.onreadystatechange = function() {
if (this.readyState == "complete") {
b.style.display = "none";
_frame.style.display = "block";
}
}
}
function stateChangeFirefox(_frame,loadid) {
var loader = document.getElementById(loadid.toString());
loader.style.display = "none";
_frame.style.display = "block";
}
</script>
<div id="load" ><img src="http://sc.cnwebshow.com/upimg/allimg/070707/01294420.gif" /></div>
<iframe id="demoframe" onreadystatechange=stateChangeIE(this,'load') onload=stateChangeFirefox(this,'load') src="輸入連結網頁" ></iframe>
好文:
http://www.seomydream.com/seo-jiqiao/iframe.htm,如何優化iframe框架的技巧
http://www.cnblogs.com/tianguook/archive/2010/06/24/1764235.html,Frame、iFrame、noframe的區別和使用
2011年12月22日 星期四
浮水印文字
引用連結:http://digitalbush.com/projects/watermark-input-plugin/
當載好兩個js檔之後,放到同一個資料夾,就可以使用了
<head runat="server">
<script src="jquery.js" type="text/javascript"></script>
<script src="jquery.watermarkinput.js" type="text/javascript"></script>
<script type="text/javascript">
jQuery(function($) {
$("#TextBox1").Watermark("輸入你要的字", "#dedede");
});
</script>
</head>
<body>
<div>
<asp:TextBox ID="TextBox1" runat="server></asp:TextBox>
</div>
</body>
PS.請注意一下如果是.master記得id要變成
jQuery(function($) {
$("#ctl00_ TextBox1 ").Watermark("輸入你要的字", "#dedede");
});
===
後續補充→發現這一篇可以做到更簡單去了解
ref→http://blog.roodo.com/esabear/archives/9329889.html
ref→http://blog.asflexer.com/jquery-textbox-watermark
.waterMarkText // 可以放你想要設定的任何浮水印效果
{
color:#888888;
}
<asp:TextBox ID="txbTitle" runat="server" tooltip="輸入浮水印文字"></asp:TextBox>
<script type="text/javascript">
$(function () {
var txtbox = $('#<%=txbTitle.ClientID%>');
txtbox.focus(function () {
if (txtbox.val() == this.title) {
txtbox.removeClass("waterMarkText");
txtbox.val("");
}
});
txtbox.blur(function () {
if (txtbox.val() == "") {
txtbox.addClass("waterMarkText");
txtbox.val(this.title);
}
});
txtbox.blur();
});
</script>
當載好兩個js檔之後,放到同一個資料夾,就可以使用了
<head runat="server">
<script src="jquery.js" type="text/javascript"></script>
<script src="jquery.watermarkinput.js" type="text/javascript"></script>
<script type="text/javascript">
jQuery(function($) {
$("#TextBox1").Watermark("輸入你要的字", "#dedede");
});
</script>
</head>
<body>
<div>
<asp:TextBox ID="TextBox1" runat="server></asp:TextBox>
</div>
</body>
PS.請注意一下如果是.master記得id要變成
jQuery(function($) {
$("#ctl00_ TextBox1 ").Watermark("輸入你要的字", "#dedede");
});
===
後續補充→發現這一篇可以做到更簡單去了解
ref→http://blog.roodo.com/esabear/archives/9329889.html
ref→http://blog.asflexer.com/jquery-textbox-watermark
.waterMarkText // 可以放你想要設定的任何浮水印效果
{
color:#888888;
}
<asp:TextBox ID="txbTitle" runat="server" tooltip="輸入浮水印文字"></asp:TextBox>
<script type="text/javascript">
$(function () {
var txtbox = $('#<%=txbTitle.ClientID%>');
txtbox.focus(function () {
if (txtbox.val() == this.title) {
txtbox.removeClass("waterMarkText");
txtbox.val("");
}
});
txtbox.blur(function () {
if (txtbox.val() == "") {
txtbox.addClass("waterMarkText");
txtbox.val(this.title);
}
});
txtbox.blur();
});
</script>
2011年12月16日 星期五
Mantis安裝篇
呼~最近因為需求而要架設Mantis,上網找了不少好文章
並將遇到的問題與解決方法丟上來,希望下次遇到少花點時間
共安裝了以下軟體
安裝順序也如下…
1.mysql-5.5.19-winx64.msi
2.php-5.3.8-Win32-VC9-x86.msi
3.phpMyAdmin-2.5.7-pl1
4.mantisbt-1.2.8
參考網址:http://www.php5.idv.tw/html.php?mod=article&do=show&shid=19
大部份按照上面裝的應該就少很多了…
測試一下mysql跟php是否連結,這個問題真的很煩人…@@a
認證可以參考:http://php.net/manual/en/function.mysql-connect.php
做一個測試頁面丟上去測…
<?php
$link = mysql_connect('localhost', '帳號', '密碼');
if (!$link) {
die('Could not connect: ' . mysql_error());
}
echo 'Connected successfully';
mysql_close($link);
?>
如果出現成功非常恭喜您,很不幸的跟我一樣失敗的話,建議先到
安裝PHP的資料夾看一下
更詳細一點可以看:http://micki.blogbus.com/logs/30395887.html
或者:http://www.dreamweaver.com.tw/index.php?fid=2&viewtopic=3436
1.MySQL Server 5.5\lib\libmysql.dll 丟到php\ext\底下
2.重開你的阿法器
##中間如果你的阿法器重開失敗,建議把MYSQL停用,亂放的php.ini檔先砍了,然後應該就能重開了= =;;
大致上安裝好沒問題就收案了XD
接下來只要將phpMyAdmin-2.5.7資料夾丟進去,也能順利開啟
詳細的話也可看:http://www.cnbruce.com/blog/showlog.asp?log_id=1211
這個也很不錯:http://www.chweng.idv.tw/serverguide/phpmyadmin.php
mantisbt配置說明可看:http://micki.blogbus.com/logs/38031962.html
mantisbt-1.2.8的資料夾也丟進去,開啟安裝頁面,輸入帳密也能開啟
預設為administrator /pwd: root
大概接下來可能會遇到還有上面的紅字問題:(php.ini )
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
新增這一段→ date.timezone = PRC
整理了一下比較詳細的設定mantis\config_inc.php
參考:http://www.prudentman.idv.tw/2009/01/mantis-13.html
# 時區設定,不加首頁會有warning
date_default_timezone_set("Asia/Taipei");
# 設定語系為繁體中文
$g_default_language = "chinese_traditional";
# 設定是否讓人註冊帳號(系統使用者都加入帳號以後可以改成OFF)
$g_allow_signup = ON;
# 選用SMTP模式
$g_phpMailer_method= PHPMAILER_METHOD_SMTP ;
$g_smtp_host= 'smtp.gmail.com';
$g_smtp_username = 'xxx@gmail.com';
$g_smtp_password = 'xxx';
$g_smtp_connection_mode = 'ssl';
$g_smtp_port = 465;
//File Upload
$g_file_upload_method = DISK;
$g_absolute_path_default_upload_folder = 'C:/mantis/upload/'; //記得手動建立這個目錄
$g_max_file_size = 5000000; //上傳檔案最大5MB, 與php.ini有關, 若有需要記得調整php.ini內的upload_max_filesize
$g_disallowed_files = 'php,php3,phtml,html,class,java,exe,pl'; //不允許上傳的檔案類型
如果要直接開啟的話是在Apache2.2\conf\httpd.conf
最尾頁加上
Alias /mantis "c:/mantis/"
<Directory "c:/mantis/">
Options Indexes
AllowOverride None
Order allow,deny
Allow from all
</Directory>
然後找
DirectoryIndex index.html
→DirectoryIndex index.html index.html index.html.var index.php
這樣就會轉頁面了XDD
改中文的話→管理→管理使用者→點一個使用者→語件→選中文(恩…自已翻英文)
然後要新增專案的話
可以到管理專案→看到左上角有一個『新增專案』的按鈕,不是新增類別喔T_T
並將遇到的問題與解決方法丟上來,希望下次遇到少花點時間
共安裝了以下軟體
安裝順序也如下…
1.mysql-5.5.19-winx64.msi
2.php-5.3.8-Win32-VC9-x86.msi
3.phpMyAdmin-2.5.7-pl1
4.mantisbt-1.2.8
參考網址:http://www.php5.idv.tw/html.php?mod=article&do=show&shid=19
大部份按照上面裝的應該就少很多了…
測試一下mysql跟php是否連結,這個問題真的很煩人…@@a
認證可以參考:http://php.net/manual/en/function.mysql-connect.php
做一個測試頁面丟上去測…
<?php
$link = mysql_connect('localhost', '帳號', '密碼');
if (!$link) {
die('Could not connect: ' . mysql_error());
}
echo 'Connected successfully';
mysql_close($link);
?>
如果出現成功非常恭喜您,很不幸的跟我一樣失敗的話,建議先到
安裝PHP的資料夾看一下
更詳細一點可以看:http://micki.blogbus.com/logs/30395887.html
或者:http://www.dreamweaver.com.tw/index.php?fid=2&viewtopic=3436
1.MySQL Server 5.5\lib\libmysql.dll 丟到php\ext\底下
2.重開你的阿法器
##中間如果你的阿法器重開失敗,建議把MYSQL停用,亂放的php.ini檔先砍了,然後應該就能重開了= =;;
大致上安裝好沒問題就收案了XD
接下來只要將phpMyAdmin-2.5.7資料夾丟進去,也能順利開啟
詳細的話也可看:http://www.cnbruce.com/blog/showlog.asp?log_id=1211
這個也很不錯:http://www.chweng.idv.tw/serverguide/phpmyadmin.php
mantisbt配置說明可看:http://micki.blogbus.com/logs/38031962.html
mantisbt-1.2.8的資料夾也丟進去,開啟安裝頁面,輸入帳密也能開啟
預設為administrator /pwd: root
大概接下來可能會遇到還有上面的紅字問題:(php.ini )
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
新增這一段→ date.timezone = PRC
整理了一下比較詳細的設定mantis\config_inc.php
參考:http://www.prudentman.idv.tw/2009/01/mantis-13.html
# 時區設定,不加首頁會有warning
date_default_timezone_set("Asia/Taipei");
# 設定語系為繁體中文
$g_default_language = "chinese_traditional";
# 設定是否讓人註冊帳號(系統使用者都加入帳號以後可以改成OFF)
$g_allow_signup = ON;
# 選用SMTP模式
$g_phpMailer_method= PHPMAILER_METHOD_SMTP ;
$g_smtp_host= 'smtp.gmail.com';
$g_smtp_username = 'xxx@gmail.com';
$g_smtp_password = 'xxx';
$g_smtp_connection_mode = 'ssl';
$g_smtp_port = 465;
//File Upload
$g_file_upload_method = DISK;
$g_absolute_path_default_upload_folder = 'C:/mantis/upload/'; //記得手動建立這個目錄
$g_max_file_size = 5000000; //上傳檔案最大5MB, 與php.ini有關, 若有需要記得調整php.ini內的upload_max_filesize
$g_disallowed_files = 'php,php3,phtml,html,class,java,exe,pl'; //不允許上傳的檔案類型
如果要直接開啟的話是在Apache2.2\conf\httpd.conf
最尾頁加上
Alias /mantis "c:/mantis/"
<Directory "c:/mantis/">
Options Indexes
AllowOverride None
Order allow,deny
Allow from all
</Directory>
然後找
DirectoryIndex index.html
→DirectoryIndex index.html index.html index.html.var index.php
這樣就會轉頁面了XDD
改中文的話→管理→管理使用者→點一個使用者→語件→選中文(恩…自已翻英文)
然後要新增專案的話
可以到管理專案→看到左上角有一個『新增專案』的按鈕,不是新增類別喔T_T
2011年12月14日 星期三
ZIP靨縮(子資料夾循迴
引用:http://blog.sina.com.cn/s/blog_456cc2c401000c70.html
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.IO;
using ICSharpCode.SharpZipLib.Checksums;
using ICSharpCode.SharpZipLib.Zip;
using ICSharpCode.SharpZipLib.GZip;
/// <summary>
/// ZipFloClass 的摘要说明
/// </summary>
public class ZipFloClass
{
public void ZipFile(string strFile, string strZip)
{
if (strFile[strFile.Length - 1] != Path.DirectorySeparatorChar)
strFile += Path.DirectorySeparatorChar;
ZipOutputStream s = new ZipOutputStream(File.Create(strZip));
s.SetLevel(6); // 0 - store only to 9 - means best compression
zip(strFile, s, strFile);
s.Finish();
s.Close();
}
private void zip(string strFile, ZipOutputStream s, string staticFile)
{
if (strFile[strFile.Length - 1] != Path.DirectorySeparatorChar) strFile += Path.DirectorySeparatorChar;
Crc32 crc = new Crc32();
string[] filenames = Directory.GetFileSystemEntries(strFile);
foreach (string file in filenames)
{
if (Directory.Exists(file))
{
zip(file, s, staticFile);
}
else // 否则直接压缩文件
{
//打开压缩文件
FileStream fs = File.OpenRead(file);
byte[] buffer = new byte[fs.Length];
fs.Read(buffer, 0, buffer.Length);
string tempfile = file.Substring(staticFile.LastIndexOf("\\") + 1);
ZipEntry entry = new ZipEntry(tempfile);
entry.DateTime = DateTime.Now;
entry.Size = fs.Length;
fs.Close();
crc.Reset();
crc.Update(buffer);
entry.Crc = crc.Value;
s.PutNextEntry(entry);
s.Write(buffer, 0, buffer.Length);
}
}
}
}
、、、、、、、、、、、、、、、
using System;
using System.Data;
using System.Web;
using System.Text;
using System.Collections;
using System.IO;
using System.Diagnostics;
using System.Runtime.Serialization.Formatters.Binary;
using ICSharpCode.SharpZipLib.BZip2;
using ICSharpCode.SharpZipLib.Zip;
using ICSharpCode.SharpZipLib.Zip.Compression;
using ICSharpCode.SharpZipLib.Zip.Compression.Streams;
using ICSharpCode.SharpZipLib.GZip;
using ICSharpCode.SharpZipLib.Checksums;
/// <summary>
/// UnZipFloClass 的摘要说明
/// </summary>
public class UnZipFloClass
{
public string unZipFile(string TargetFile, string fileDir)
{
string rootFile = " ";
try
{
//读取压缩文件(zip文件),准备解压缩
ZipInputStream s = new ZipInputStream(File.OpenRead(TargetFile.Trim()));
ZipEntry theEntry;
string path = fileDir;
//解压出来的文件保存的路径
string rootDir = " ";
//根目录下的第一个子文件夹的名称
while ((theEntry = s.GetNextEntry()) != null)
{
rootDir = Path.GetDirectoryName(theEntry.Name);
//得到根目录下的第一级子文件夹的名称
if (rootDir.IndexOf("\\") >= 0)
{
rootDir = rootDir.Substring(0, rootDir.IndexOf("\\") + 1);
}
string dir = Path.GetDirectoryName(theEntry.Name);
//根目录下的第一级子文件夹的下的文件夹的名称
string fileName = Path.GetFileName(theEntry.Name);
//根目录下的文件名称
if (dir != " " )
//创建根目录下的子文件夹,不限制级别
{
if (!Directory.Exists(fileDir + "\\" + dir))
{
path = fileDir + "\\" + dir;
//在指定的路径创建文件夹
Directory.CreateDirectory(path);
}
}
else if (dir == " " && fileName != "")
//根目录下的文件
{
path = fileDir;
rootFile = fileName;
}
else if (dir != " " && fileName != "")
//根目录下的第一级子文件夹下的文件
{
if (dir.IndexOf("\\") > 0)
//指定文件保存的路径
{
path = fileDir + "\\" + dir;
}
}
if (dir == rootDir)
//判断是不是需要保存在根目录下的文件
{
path = fileDir + "\\" + rootDir;
}
//以下为解压缩zip文件的基本步骤
//基本思路就是遍历压缩文件里的所有文件,创建一个相同的文件。
if (fileName != String.Empty)
{
FileStream streamWriter = File.Create(path + "\\" + fileName);
int size = 2048;
byte[] data = new byte[2048];
while (true)
{
size = s.Read(data, 0, data.Length);
if (size > 0)
{
streamWriter.Write(data, 0, size);
}
else
{
break;
}
}
streamWriter.Close();
}
}
s.Close();
return rootFile;
}
catch (Exception ex)
{
return "1; " + ex.Message;
}
}
}
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.IO;
using ICSharpCode.SharpZipLib.Checksums;
using ICSharpCode.SharpZipLib.Zip;
using ICSharpCode.SharpZipLib.GZip;
/// <summary>
/// ZipFloClass 的摘要说明
/// </summary>
public class ZipFloClass
{
public void ZipFile(string strFile, string strZip)
{
if (strFile[strFile.Length - 1] != Path.DirectorySeparatorChar)
strFile += Path.DirectorySeparatorChar;
ZipOutputStream s = new ZipOutputStream(File.Create(strZip));
s.SetLevel(6); // 0 - store only to 9 - means best compression
zip(strFile, s, strFile);
s.Finish();
s.Close();
}
private void zip(string strFile, ZipOutputStream s, string staticFile)
{
if (strFile[strFile.Length - 1] != Path.DirectorySeparatorChar) strFile += Path.DirectorySeparatorChar;
Crc32 crc = new Crc32();
string[] filenames = Directory.GetFileSystemEntries(strFile);
foreach (string file in filenames)
{
if (Directory.Exists(file))
{
zip(file, s, staticFile);
}
else // 否则直接压缩文件
{
//打开压缩文件
FileStream fs = File.OpenRead(file);
byte[] buffer = new byte[fs.Length];
fs.Read(buffer, 0, buffer.Length);
string tempfile = file.Substring(staticFile.LastIndexOf("\\") + 1);
ZipEntry entry = new ZipEntry(tempfile);
entry.DateTime = DateTime.Now;
entry.Size = fs.Length;
fs.Close();
crc.Reset();
crc.Update(buffer);
entry.Crc = crc.Value;
s.PutNextEntry(entry);
s.Write(buffer, 0, buffer.Length);
}
}
}
}
、、、、、、、、、、、、、、、
using System;
using System.Data;
using System.Web;
using System.Text;
using System.Collections;
using System.IO;
using System.Diagnostics;
using System.Runtime.Serialization.Formatters.Binary;
using ICSharpCode.SharpZipLib.BZip2;
using ICSharpCode.SharpZipLib.Zip;
using ICSharpCode.SharpZipLib.Zip.Compression;
using ICSharpCode.SharpZipLib.Zip.Compression.Streams;
using ICSharpCode.SharpZipLib.GZip;
using ICSharpCode.SharpZipLib.Checksums;
/// <summary>
/// UnZipFloClass 的摘要说明
/// </summary>
public class UnZipFloClass
{
public string unZipFile(string TargetFile, string fileDir)
{
string rootFile = " ";
try
{
//读取压缩文件(zip文件),准备解压缩
ZipInputStream s = new ZipInputStream(File.OpenRead(TargetFile.Trim()));
ZipEntry theEntry;
string path = fileDir;
//解压出来的文件保存的路径
string rootDir = " ";
//根目录下的第一个子文件夹的名称
while ((theEntry = s.GetNextEntry()) != null)
{
rootDir = Path.GetDirectoryName(theEntry.Name);
//得到根目录下的第一级子文件夹的名称
if (rootDir.IndexOf("\\") >= 0)
{
rootDir = rootDir.Substring(0, rootDir.IndexOf("\\") + 1);
}
string dir = Path.GetDirectoryName(theEntry.Name);
//根目录下的第一级子文件夹的下的文件夹的名称
string fileName = Path.GetFileName(theEntry.Name);
//根目录下的文件名称
if (dir != " " )
//创建根目录下的子文件夹,不限制级别
{
if (!Directory.Exists(fileDir + "\\" + dir))
{
path = fileDir + "\\" + dir;
//在指定的路径创建文件夹
Directory.CreateDirectory(path);
}
}
else if (dir == " " && fileName != "")
//根目录下的文件
{
path = fileDir;
rootFile = fileName;
}
else if (dir != " " && fileName != "")
//根目录下的第一级子文件夹下的文件
{
if (dir.IndexOf("\\") > 0)
//指定文件保存的路径
{
path = fileDir + "\\" + dir;
}
}
if (dir == rootDir)
//判断是不是需要保存在根目录下的文件
{
path = fileDir + "\\" + rootDir;
}
//以下为解压缩zip文件的基本步骤
//基本思路就是遍历压缩文件里的所有文件,创建一个相同的文件。
if (fileName != String.Empty)
{
FileStream streamWriter = File.Create(path + "\\" + fileName);
int size = 2048;
byte[] data = new byte[2048];
while (true)
{
size = s.Read(data, 0, data.Length);
if (size > 0)
{
streamWriter.Write(data, 0, size);
}
else
{
break;
}
}
streamWriter.Close();
}
}
s.Close();
return rootFile;
}
catch (Exception ex)
{
return "1; " + ex.Message;
}
}
}
2011年12月2日 星期五
Visual C# 或 Microsoft Visual Basic 使用者入門教學課程
http://msdn.microsoft.com/zh-tw/library/dd492171.aspx
MSDN提供的教學課程,共有四種,適合初學者磨刀…
引用內容如下:
教學課程 1:建立圖片檢視器
建置一個從檔案載入圖片並將圖片顯示在視窗中的程式。 了解如何拖曳表單上的控制項 (例如按鈕和圖片方塊)、設定其屬性,以及使用容器來順暢地調整表單的大小。 開始撰寫程式碼。
教學課程 2:建立迷宮程式
建置一個迷宮遊戲,使用者必須移動滑鼠指標而不能碰觸到任何圍牆。 了解如何使用 Panel 容器來配置表單、使用 Label 控制項建置迷宮、撰寫程式碼來顯示訊息方塊、設定滑鼠事件的事件處理常式、讓程式播放音效,以及使用類別來組織程式碼。
教學課程 3:建立數學測驗
建置一個計時的數學測驗遊戲,玩家必須在指定的時間內回答四個隨機的算術問題。 了解如何使用 Random 類別產生隨機數字、使用 Timer 控制項觸發事件、使用 if else 陳述式控制程式流程,以及執行基本的算術運算。
教學課程 4:建立配對遊戲
建置一個配對遊戲,而遊戲玩家必須配對隱藏的圖示。 了解如何使用 List 物件來保留物件、使用 foreach 迴圈、使用參考變數追蹤表單的狀態、建置可用於多個物件的事件處理常式,以及讓計時器於啟動時剛好引發一次。
從一些基本的地方,總能收獲很多呀…XDD
MSDN提供的教學課程,共有四種,適合初學者磨刀…
引用內容如下:
從一些基本的地方,總能收獲很多呀…XDD
2011年12月1日 星期四
文字連續跑馬燈
在網路上找了許久,本來想以jquery製作,不過發現比較像「段落式」的跑馬燈
一下就跑一段而如果有原本的html語法的跑馬燈的話,則是會在結束後留下一大段空白
需求是:【文字/連續/尾接頭】
最後發現了一篇還不錯
可以參考如下
<DIV id=all style="OVERFLOW: hidden; WIDTH: 210px; HEIGHT: 120px">
<DIV id=m1>
<TABLE height=15 cellSpacing=0 cellPadding=0 width=210 align=center border=0>
<TBODY>
<TR>
<TD>
一段話<BR>
二段話<BR>
三段話<BR>
</TD>
</TR>
</TBODY>
</TABLE>
</DIV>
<DIV id=m2></DIV>
</DIV>
<SCRIPT type=text/javascript>
var speed=45
m2.innerHTML=m1.innerHTML
function Marquee(){
if(m2.offsetTop-gg.scrollTop<=0)
all.scrollTop-=m1.offsetHeight
else{
all.scrollTop++
}
}
var MyMar=setInterval(Marquee,speed)
all.onmouseover=function() {clearInterval(MyMar)}
all.onmouseout=function() {MyMar=setInterval(Marquee,speed)}
</SCRIPT>
補充一點,如果FireFox看不到效果的話,最好增加一些語法
var m2= document.getElementById('m2');
var m1= document.getElementById('m1');
var all= document.getElementById('all');
引用:
參考:
http://blog.hsin.tw/2008/javascript-vertical-carousel/2011年11月10日 星期四
TCP/Port作用
在上網的時候,我們經常會看到「Port」這個詞,也會經常用到Port號,比如在FTP位址後面增加的「21」,21就表示Port號。那麼Port到底是什麼意思呢?怎樣查看Port號呢?一個Port是否成為網路惡意攻擊的大門呢?,我們應該如何面對形形色色的Port呢?下面就將介紹這方面的內容,以供大家參考。
Port簡介:本文介紹Port的概念,分類,以及如何關閉/開啟一個Port
Port簡介:本文介紹Port的概念,分類,以及如何關閉/開啟一個Port
21Port:21Port主要用於FTP(File Transfer Protocol,檔傳輸協定)服務。
23Port:23Port主要用於Telnet(遠端登錄)服務,是Internet上普遍採用的登錄和仿真程式。
25Port:25Port為SMTP(Simple Mail Transfer Protocol,簡單郵件傳輸協議)伺服器所開放,主要用於發送郵件,如今絕大多數郵件伺服器都使用該協定。
53Port:53Port為DNS(Domain Name Server,功能變數名稱伺服器)伺服器所開放,主要用於功能變數名稱解析,DNS服務在NT系統中使用的最為廣泛。
67、68Port:67、68Port分別是為Bootp服務的Bootstrap Protocol Server(引導程式協定服務端)和Bootstrap Protocol Client(引導程式協定用戶端)開放的Port。
69Port:TFTP是Cisco公司開發的一個簡單檔傳輸協議,類似於FTP。
79Port:79Port是為Finger服務開放的,主要用於查詢遠端主機線上用戶、作業系統類型以及是否緩衝區溢出等用戶的詳細資訊。
80Port:80Port是為HTTP(HyperText Transport Protocol,超文本傳輸協定)開放的,這是上網衝浪使用最多的協定,主要用於在WWW(World Wide Web,萬維網)服務上傳輸資訊的協定。
99Port:99Port是用於一個名為「Metagram Relay」(亞對策延時)的服務,該服務比較少見,一般是用不到的。
109、110Port:109Port是為POP2(Post Office Protocol Version 2,郵局協定2)服務開放的,110Port是為POP3(郵件協定3)服務開放的,POP2、POP3都是主要用於接收郵件的。
111Port:111Port是SUN公司的RPC(Remote Procedure Call,遠端程序呼叫)服務所開放的Port,主要用於分散式系統中不同計算器的內部進程通信,RPC在多種網路服務中都是很重要的組件。
113Port:113Port主要用於Windows的「Authentication Service」(驗證服務)。
119Port:119Port是為「Network News Transfer Protocol」(網路新聞組傳輸協定,簡稱NNTP)開放的。
135Port:135Port主要用於使用RPC(Remote Procedure Call,遠端程序呼叫)協定並提供DCOM(分散式元件對像模型)服務。
137Port:137Port主要用於「NetBIOS Name Service」(NetBIOS名稱服務)。
139Port:139Port是為「NetBIOS Session Service」提供的,主要用於提供Windows檔和印表機共用以及Unix中的Samba服務。
143Port:143Port主要是用於「Internet Message Access Protocol」v2(Internet消息訪問協定,簡稱IMAP)。
161Port:161Port是用於「Simple Network Management Protocol」(簡單網路管理協定,簡稱SNMP)。
443Port:43Port即網頁流覽Port,主要是用於HTTPS服務,是提供加密和通過安全Port傳輸的另一種HTTP。
554Port:554Port默認情況下用於「Real Time Streaming Protocol」(即時流協議,簡稱RTSP)。
1024Port:1024Port一般不固定分配給某個服務,在英文中的解釋是「Reserved」(保留)。
1080Port:1080Port是Socks代理服務使用的Port,大家平時上網使用的WWW服務使用的是HTTP協定的代理服務。
1755Port:1755Port默認情況下用於「Microsoft Media Server」(微軟媒體伺服器,簡稱MMS)。
4000Port:4000Port是用於大家經常使用的QQ聊天工具的,再細說就是為QQ用戶端開放的Port,QQ服務端使用的Port是8000。
5554Port:在今年4月30日就報導出現了一種針對微軟lsass服務的新蠕蟲病毒——震盪波(Worm.Sasser),該病毒可以利用TCP 5554Port開啟一個FTP服務,主要被用於病毒的傳播。
5632Port:5632Port是被大家所熟悉的遠端控制軟體pcAnywhere所開啟的Port。
8080Port:8080Port同80Port,是被用於WWW代理服務的,可以實現網頁流覽。
Port概念
Port概念
在網路技術中,Port(Port)大致有兩種意思:一是物理意義上的Port,比如,ADSL Modem、集線器、交換機、路由器用於連接其他網路設備的介面,如RJ-45Port、SCPort等等。二是邏輯意義上的Port,一般是指TCP/IP協議中的Port,Port號的範圍從0到65535,比如用於流覽網頁服務的80Port,用於FTP服務的21Port等等。我們這裏將要介紹的就是邏輯意義上的Port。
Port分類
邏輯意義上的Port有多種分類標準,下面將介紹兩種常見的分類:
1. 按Port號分佈劃分
(1)知名Port(Well-Known Ports)
知名Port即眾所周知的Port號,範圍從0到1023,這些Port號一般固定分配給一些服務。比如21Port分配給FTP服務,25Port分配給SMTP(簡單郵件傳輸協定)服務,80Port分配給HTTP服務,135Port分配給RPC(遠端程序呼叫)服務等等。
(2)動態Port(Dynamic Ports)
動態Port的範圍從1024到65535,這些Port號一般不固定分配給某個服務,也就是說許多服務都可以使用這些Port。只要運行的程式向系統提出訪問網路的申請,那麼系統就可以從這些Port號中分配一個供該程式使用。比如1024Port就是分配給第一個向系統發出申請的程式。在關閉程式進程後,就會釋放所佔用的Port號。
不過,動態Port也常常被病毒木馬程式所利用,如冰河默認連接Port是7626、WAY 2.4是8011、Netspy 3.0是7306、YAI病毒是1024等等。
2. 按協議類型劃分
按協議類型劃分,可以分為TCP、UDP、IP和ICMP(Internet控制消息協定)等Port。下面主要介紹TCP和UDPPort:
(1)TCP Port
TCP Port,即傳輸控制協定Port,需要在用戶端和伺服器之間建立連接,這樣可以提供可靠的資料傳輸。常見的包括FTP服務的21Port,Telnet服務的23Port,SMTP服務的25Port,以及HTTP服務的80Port等等。
(2)UDP Port
UDPPort,即用戶資料包協定Port,無需在用戶端和伺服器之間建立連接,安全性得不到保障。常見的有DNS服務的53Port,SNMP(簡單網路管理協定)服務的161Port,QQ使用的8000和4000Port等等。
查看Port
在Windows 2000/XP/Server 2003中要查看Port,可以使用Netstat命令:
依次點擊「開始→運行」,鍵入「cmd」並回車,打開命令提示符視窗。在命令提示符狀態下鍵入「netstat -a -n」,按下回車鍵後就可以看到以數位形式顯示的TCP和UDP連接的Port號及狀態(如圖)。
小知識:Netstat命令用法
命令格式:Netstat -a -e -n -o -s
-a 表示顯示所有活動的TCP連接以及計算器監聽的TCP和UDPPort。
-e 表示顯示乙太網發送和接收的位元組數、資料包數等。
-n 表示只以數位形式顯示所有活動的TCP連接的位址和Port號。
-o 表示顯示活動的TCP連接並包括每個連接的進程ID(PID)。
-s 表示按協定顯示各種連接的統計資訊,包括Port號。
關閉/開啟Port
在介紹各種Port的作用前,這裏先介紹一下在Windows中如何關閉/打開Port,因為默認的情況下,有很多不安全的或沒有什麼用的Port是開啟的,比如Telnet服務的23Port、FTP服務的21Port、SMTP服務的25Port、RPC服務的135Port等等。為了保證系統的安全性,我們可以通過下面的方法來關閉/開啟Port。
關閉Port
比如在Windows 2000/XP中關閉SMTP服務的25Port,可以這樣做:首先打開「控制面板」,雙擊「管理工具」,再雙擊「服務」。接著在打開的服務視窗中找到並雙擊「Simple Mail Transfer Protocol (SMTP)」服務,單擊「停止」按鈕來停止該服務,然後在「啟動類型」中選擇「已禁用」,最後單擊「確定」按鈕即可。這樣,關閉了SMTP服務就相當於關閉了對應的Port。
開啟Port
如果要開啟該Port只要先在「啟動類型」選擇「自動」,單擊「確定」按鈕,再打開該服務,在「服務狀態」中單擊「啟動」按鈕即可啟用該Port,最後,單擊「確定」按鈕即可。
提示:在Windows 98中沒有「服務」選項,你可以使用防火牆的規則設置功能來關閉/開啟Port。
21Port
21Port
Port說明:21Port主要用於FTP(File Transfer Protocol,檔傳輸協定)服務,FTP服務主要是為了在兩臺電腦之間實現檔的上傳與下載,一臺電腦作為FTP用戶端,另一臺電腦作為FTP伺服器,可以採用匿名(anonymous)登錄和授權用戶名與密碼登錄兩種方式登錄FTP伺服器。目前,通過FTP服務來實現檔的傳輸是互聯網上上傳、下載檔最主要的方法。另外,還有一個20Port是用於FTP資料傳輸的默認Port號。
在Windows中可以通過Internet資訊服務(IIS)來提供FTP連接和管理,也可以單獨安裝FTP伺服器軟體來實現FTP功能,比如常見的FTP Serv-U。
操作建議:因為有的FTP伺服器可以通過匿名登錄,所以常常會被駭客利用。另外,21Port還會被一些木馬利用,比如Blade Runner、FTP Trojan、Doly Trojan、WebEx等等。如果不架設FTP伺服器,建議關閉21Port。
23Port
23Port
Port說明:23Port主要用於Telnet(遠端登錄)服務,是Internet上普遍採用的登錄和仿真程式。同樣需要設置用戶端和伺服器端,開啟Telnet服務的用戶端就可以登錄遠端Telnet伺服器,採用授權用戶名和密碼登錄。登錄之後,允許用戶使用命令提示符視窗進行相應的操作。在Windows中可以在命令提示符視窗中,鍵入“Telnet”命令來使用Telnet遠端登錄。
操作建議:利用Telnet服務,駭客可以搜索遠端登錄Unix的服務,掃描作業系統的類型。而且在Windows 2000中Telnet服務存在多個嚴重的漏洞,比如提升許可權、拒絕服務等,可以讓遠端伺服器崩潰。Telnet服務的23Port也是TTS(Tiny Telnet Server)木馬的缺省Port。所以,建議關閉23Port。
25Port
25Port
Port說明:25Port為SMTP(Simple Mail Transfer Protocol,簡單郵件傳輸協議)伺服器所開放,主要用於發送郵件,如今絕大多數郵件伺服器都使用該協定。比如我們在使用電子郵件用戶端程式的時候,在創建帳戶時會要求輸入SMTP伺服器位址,該伺服器位址默認情況下使用的就是25Port(如圖)。
Port漏洞:
1. 利用25Port,駭客可以尋找SMTP伺服器,用來轉發垃圾郵件。
2. 25Port被很多木馬程式所開放,比如Ajan、Antigen、Email Password Sender、ProMail、trojan、Tapiras、Terminator、WinPC、WinSpy等等。拿WinSpy來說,通過開放25Port,可以監視電腦正在運行的所有視窗和模組。
操作建議:如果不是要架設SMTP郵件伺服器,可以將該Port關閉。
53Port
53Port
Port說明:53Port為DNS(Domain Name Server,功能變數名稱伺服器)伺服器所開放,主要用於功能變數名稱解析,DNS服務在NT系統中使用的最為廣泛。通過DNS伺服器可以實現功能變數名稱與IP位址之間的轉換,只要記住功能變數名稱就可以快速訪問網站。
Port漏洞:如果開放DNS服務,駭客可以通過分析DNS伺服器而直接獲取Web伺服器等主機的IP位址,再利用53Port突破某些不穩定的防火牆,從而實施攻擊。近日,美國一家公司也公佈了10個最易遭駭客攻擊的漏洞,其中第一位的就是DNS伺服器的BIND漏洞。
操作建議:如果當前的電腦不是用於提供功能變數名稱解析服務,建議關閉該Port。
67與68Port
67與68Port
Port說明:67、68Port分別是為Bootp服務的Bootstrap Protocol Server(引導程式協定服務端)和Bootstrap Protocol Client(引導程式協定用戶端)開放的Port。Bootp服務是一種產生於早期Unix的遠端啟動協議,我們現在經常用到的DHCP服務就是從Bootp服務擴展而來的。通過Bootp服務可以為局域網中的電腦動態分配IP位址,而不需要每個用戶去設置靜態IP位址。
Port漏洞:如果開放Bootp服務,常常會被駭客利用分配的一個IP位址作為局部路由器通過“中間人”(man-in-middle)方式進行攻擊。
操作建議:建議關閉該Port。
69Port
69Port
Port說明:69Port是為TFTP(Trival File Tranfer Protocol,次要檔傳輸協定)服務開放的,TFTP是Cisco公司開發的一個簡單檔傳輸協議,類似於FTP。不過與FTP相比,TFTP不具有複雜的交互存取介面和認證控制,該服務適用於不需要複雜交換環境的用戶端和伺服器之間進行資料傳輸。
Port漏洞:很多伺服器和Bootp服務一起提供TFTP服務,主要用於從系統下載啟動代碼。可是,因為TFTP服務可以在系統中寫入檔,而且駭客還可以利用TFTP的錯誤配置來從系統獲取任何檔。
操作建議:建議關閉該Port。
79Port
79Port
Port說明:79Port是為Finger服務開放的,主要用於查詢遠端主機線上用戶、作業系統類型以及是否緩衝區溢出等用戶的詳細資訊。比如要顯示遠端電腦www.abc.com上的user01用戶的資訊,可以在命令行中鍵入“finger user01@www.abc.com”即可。
Port漏洞:一般駭客要攻擊對方的電腦,都是通過相應的Port掃描工具來獲得相關資訊,比如使用“流光”就可以利用79Port來掃描遠端電腦作業系統版本,獲得用戶資訊,還能探測已知的緩衝區溢出錯誤。這樣,就容易遭遇到駭客的攻擊。而且,79Port還被Firehotcker木馬作為默認的Port。
操作建議:建議關閉該Port。
80Port
Port說明:80Port是為HTTP(HyperText Transport Protocol,超文本傳輸協定)開放的,這是上網衝浪使用最多的協定,主要用於在WWW(World Wide Web,萬維網)服務上傳輸資訊的協定。我們可以通過HTTP位址加“:80”(即常說的“網址”)來訪問網站的,比如http://www.cce.com.cn:80,因為流覽網頁服務默認的Port號是80,所以只要輸入網址,不用輸入“:80”。
Port漏洞:有些木馬程式可以利用80Port來攻擊電腦的,比如Executor、RingZero等。
操作建議:為了能正常上網衝浪,我們必須開啟80Port。
99Port
Port說明:99Port是用於一個名為“Metagram Relay”(亞對策延時)的服務,該服務比較少見,一般是用不到的。
Port漏洞:雖然“Metagram Relay”服務不常用,可是Hidden Port、NCx99等木馬程式會利用該Port,比如在Windows 2000中,NCx99可以把cmd.exe程式綁定到99Port,這樣用Telnet就可以連接到伺服器,隨意添加用戶、更改許可權。
操作建議:建議關閉該Port。
109與110Port
109與110Port
Port說明:109Port是為POP2(Post Office Protocol Version 2,郵局協定2)服務開放的,110Port是為POP3(郵件協定3)服務開放的,POP2、POP3都是主要用於接收郵件的,目前POP3使用的比較多,許多伺服器都同時支持POP2和POP3。用戶端可以使用POP3協定來訪問服務端的郵件服務,如今ISP的絕大多數郵件伺服器都是使用該協定。在使用電子郵件用戶端程式的時候,會要求輸入POP3伺服器位址,默認情況下使用的就是110Port(如圖)。
Port漏洞:POP2、POP3在提供郵件接收服務的同時,也出現了不少的漏洞。單單POP3服務在用戶名和密碼交換緩衝區溢出的漏洞就不少於20個,比如WebEasyMail POP3 Server合法用戶名資訊洩露漏洞,通過該漏洞遠端攻擊者可以驗證用戶帳戶的存在。另外,110Port也被ProMail trojan等木馬程式所利用,通過110Port可以竊取POP帳號用戶名和密碼。
操作建議:如果是執行郵件伺服器,可以打開該Port。
111Port
111Port
Port說明:111Port是SUN公司的RPC(Remote Procedure Call,遠端程序呼叫)服務所開放的Port,主要用於分散式系統中不同電腦的內部進程通信,RPC在多種網路服務中都是很重要的組件。常見的RPC服務有rpc.mountd、NFS、rpc.statd、rpc.csmd、rpc.ttybd、amd等等。在Microsoft的Windows中,同樣也有RPC服務。
Port漏洞:SUN RPC有一個比較大漏洞,就是在多個RPC服務時xdr_array函數存在遠端緩衝溢出漏洞,通過該漏洞允許攻擊者遠端或本地獲取root許可權。
113Port
113Port
Port說明:113Port主要用於Windows的“Authentication Service”(驗證服務),一般與網路連接的電腦都運行該服務,主要用於驗證TCP連接的用戶,通過該服務可以獲得連接電腦的資訊。在Windows 2000/2003 Server中,還有專門的IAS元件,通過該元件可以方便遠端存取中進行身份驗證以及策略管理。
Port漏洞:113Port雖然可以方便身份驗證,但是也常常被作為FTP、POP、SMTP、IMAP以及IRC等網路服務的記錄器,這樣會被相應的木馬程式所利用,比如基於IRC聊天室控制的木馬。另外,113Port還是Invisible Identd Deamon、Kazimas等木馬默認開放的Port。
操作建議:建議關閉該Port。
119Port
119Port
Port說明:119Port是為“Network News Transfer Protocol”(網路新聞組傳輸協定,簡稱NNTP)開放的,主要用於新聞組的傳輸,當查找USENET伺服器的時候會使用該Port。
Port漏洞:著名的Happy99蠕蟲病毒默認開放的就是119Port,如果中了該病毒會不斷發送電子郵件進行傳播,並造成網路的堵塞。
操作建議:如果是經常使用USENET新聞組,就要注意不定期關閉該Port。
135Port
135Port
Port說明:135Port主要用於使用RPC(Remote Procedure Call,遠端程序呼叫)協定並提供DCOM(分散式元件物件模型)服務,通過RPC可以保證在一臺電腦上運行的程式可以順利地執行遠端電腦上的代碼;使用DCOM可以通過網路直接進行通信,能夠跨包括HTTP協定在內的多種網路傳輸。
Port漏洞:相信去年很多Windows 2000和Windows XP用戶都中了“衝擊波”病毒,該病毒就是利用RPC漏洞來攻擊電腦的。RPC本身在處理通過TCP/IP的消息交換部分有一個漏洞,該漏洞是由於錯誤地處理格式不正確的消息造成的。該漏洞會影響到RPC與DCOM之間的一個介面,該介面偵聽的Port就是135。
操作建議:為了避免“衝擊波”病毒的攻擊,建議關閉該Port。
137Port
137Port
Port說明:137Port主要用於“NetBIOS Name Service”(NetBIOS名稱服務),屬於UDPPort,使用者只需要向局域網或互聯網上的某臺電腦的137Port發送一個請求,就可以獲取該電腦的名稱、註冊用戶名,以及是否安裝主網域控制器、IIS是否正在運行等資訊。
Port漏洞:因為是UDPPort,對於攻擊者來說,通過發送請求很容易就獲取目標電腦的相關資訊,有些資訊是直接可以被利用,並分析漏洞的,比如IIS服務。另外,通過捕獲正在利用137Port進行通信的資訊包,還可能得到目標電腦的啟動和關閉的時間,這樣就可以利用專門的工具來攻擊。
操作建議:建議關閉該Port。
139Port
139Port
Port說明:139Port是為“NetBIOS Session Service”提供的,主要用於提供Windows檔和印表機共用以及Unix中的Samba服務。在Windows中要在局域網中進行檔的共用,必須使用該服務。比如在Windows 98中,可以打開“控制面板”,雙擊“網路”圖示,在“配置”選項卡中單擊“檔及列印共用”按鈕選中相應的設置就可以安裝啟用該服務;在Windows 2000/XP中,可以打開“控制面板”,雙擊“網路連接”圖示,打開本地連接屬性;接著,在屬性視窗的“常規”選項卡中選擇“Internet協議(TCP/IP)”,單擊“屬性”按鈕;然後在打開的視窗中,單擊“高級”按鈕;在“高級TCP/IP設置”視窗中選擇“WINS”選項卡,在“NetBIOS設置”區域中啟用TCP/IP上的NetBIOS。
Port漏洞:開啟139Port雖然可以提供共用服務,但是常常被攻擊者所利用進行攻擊,比如使用流光、SuperScan等Port掃描工具,可以掃描目標電腦的139Port,如果發現有漏洞,可以試圖獲取用戶名和密碼,這是非常危險的。
操作建議:如果不需要提供檔和印表機共用,建議關閉該Port。
143Port
143Port
Port說明:143Port主要是用於“Internet Message Access Protocol”v2(Internet消息訪問協定,簡稱IMAP),和POP3一樣,是用於電子郵件的接收的協定。通過IMAP協定我們可以在不接收郵件的情況下,知道信件的內容,方便管理伺服器中的電子郵件。不過,相對於POP3協議要負責一些。如今,大部分主流的電子郵件用戶端軟體都支援該協定。
Port漏洞:同POP3協議的110Port一樣,IMAP使用的143Port也存在緩衝區溢出漏洞,通過該漏洞可以獲取用戶名和密碼。另外,還有一種名為“admv0rm”的Linux蠕蟲病毒會利用該Port進行繁殖。
操作建議:如果不是使用IMAP伺服器操作,應該將該Port關閉。
161Port
161Port
Port說明:161Port是用於“Simple Network Management Protocol”(簡單網路管理協定,簡稱SNMP),該協定主要用於管理TCP/IP網路中的網路協定,在Windows中通過SNMP服務可以提供關於TCP/IP網路上主機以及各種網路設備的狀態資訊。目前,幾乎所有的網路設備廠商都實現對SNMP的支持。
在Windows 2000/XP中要安裝SNMP服務,我們首先可以打開“Windows元件嚮導”,在“元件”中選擇“管理和監視工具”,單擊“詳細資訊”按鈕就可以看到“簡單網路管理協定(SNMP)”,選中該元件;然後,單擊“下一步”就可以進行安裝。
Port漏洞:因為通過SNMP可以獲得網路中各種設備的狀態資訊,還能用於對網路設備的控制,所以駭客可以通過SNMP漏洞來完全控制網路。
操作建議:建議關閉該Port。
443Port
443Port
Port說明:443Port即網頁流覽Port,主要是用於HTTPS服務,是提供加密和通過安全Port傳輸的另一種HTTP。在一些對安全性要求較高的網站,比如銀行、證券、購物等,都採用HTTPS服務,這樣在這些網站上的交換資訊其他人都無法看到,保證了交易的安全性。網頁的地址以https://開始,而不是常見的http://。
Port漏洞:HTTPS服務一般是通過SSL(安全套接字層)來保證安全性的,但是SSL漏洞可能會受到駭客的攻擊,比如可以黑掉線上銀行系統,盜取信用卡帳號等。
操作建議:建議開啟該Port,用於安全性網頁的訪問。另外,為了防止駭客的攻擊,應該及時安裝微軟針對SSL漏洞發佈的最新安全補丁。
554Port
554Port
Port說明:554Port默認情況下用於“Real Time Streaming Protocol”(即時流協議,簡稱RTSP),該協議是由RealNetworks和Netscape共同提出的,通過RTSP協議可以借助於Internet將流媒體檔傳送到RealPlayer中播放,並能有效地、最大限度地利用有限的網路帶寬,傳輸的流媒體檔一般是Real伺服器發佈的,包括有.rm、.ram。如今,很多的下載軟體都支援RTSP協定,比如FlashGet、影音傳送帶等等。
Port漏洞:目前,RTSP協議所發現的漏洞主要就是RealNetworks早期發佈的Helix Universal Server存在緩衝區溢出漏洞,相對來說,使用的554Port是安全的。
操作建議:為了能欣賞並下載到RTSP協議的流媒體檔,建議開啟554Port。
1024Port
1024Port
Port說明:1024Port一般不固定分配給某個服務,在英文中的解釋是“Reserved”(保留)。之前,我們曾經提到過動態Port的範圍是從1024~65535,而1024正是動態Port的開始。該Port一般分配給第一個向系統發出申請的服務,在關閉服務的時候,就會釋放1024Port,等待其他服務的調用。
Port漏洞:著名的YAI木馬病毒默認使用的就是1024Port,通過該木馬可以遠端控制目標電腦,獲取電腦的螢幕圖像、記錄鍵盤事件、獲取密碼等,後果是比較嚴重的。
操作建議:一般的殺毒軟體都可以方便地進行YAI病毒的查殺,所以在確認無YAI病毒的情況下建議開啟該Port。
1080Port
1080Port
Port說明:1080Port是Socks代理服務使用的Port,大家平時上網使用的WWW服務使用的是HTTP協定的代理服務。而Socks代理服務不同於HTTP代理服務,它是以通道方式穿越防火牆,可以讓防火牆後面的用戶通過一個IP位址訪問Internet。Socks代理服務經常被使用在局域網中,比如限制了QQ,那麼就可以打開QQ參數設置視窗,選擇“網路設置”,在其中設置Socks代理服務。另外,還可以通過安裝Socks代理軟體來使用QQ,比如Socks2HTTP、SocksCap32等。
Port漏洞:著名的代理伺服器軟體WinGate默認的Port就是1080,通過該Port來實現局域網內電腦的共用上網。不過,如Worm.Bugbear.B(怪物II)、Worm.Novarg.B(SCO炸彈變種B)等蠕蟲病毒也會在本地系統監聽1080Port,給電腦的安全帶來不利。
操作建議:除了經常使用WinGate來共用上網外,那麼其他的建議關閉該Port。
1755Port
1755Port
Port說明:1755Port默認情況下用於“Microsoft Media Server”(微軟媒體伺服器,簡稱MMS),該協定是由微軟發佈的流媒體協定,通過MMS協定可以在Internet上實現Windows Media伺服器中流媒體檔的傳送與播放。這些檔包括.asf、.wmv等,可以使用Windows Media Player等媒體播放軟體來即時播放。其中,具體來講,1755Port又可以分為TCP和UDP的MMS協議,分別是MMST和MMSU,一般採用TCP的MMS協定,即MMST。目前,流媒體和普通下載軟體大部分都支援MMS協定。
Port漏洞:目前從微軟官方和用戶使用MMS協議傳輸、播放流媒體檔來看,並沒有什麼特別明顯的漏洞,主要一個就是MMS協議與防火牆和NAT(網路位址轉換)之間存在的相容性問題。
操作建議:為了能即時播放、下載到MMS協議的流媒體檔,建議開啟該Port。
4000Port
4000Port
Port說明:4000Port是用於大家經常使用的QQ聊天工具的,再細說就是為QQ用戶端開放的Port,QQ服務端使用的Port是8000。通過4000Port,QQ用戶端程式可以向QQ伺服器發送資訊,實現身份驗證、消息轉發等,QQ用戶之間發送的消息默認情況下都是通過該Port傳輸的。4000和8000Port都不屬於TCP協定,而是屬於UDP協定。
Port漏洞:因為4000Port屬於UDPPort,雖然可以直接傳送消息,但是也存在著各種漏洞,比如Worm_Witty.A(維迪)蠕蟲病毒就是利用4000Port向隨機IP發送病毒,並且偽裝成ICQ資料包,造成的後果就是向硬碟中寫入亂數據。另外,Trojan.SkyDance特洛伊木馬病毒也是利用該Port的。
操作建議:為了用QQ聊天,4000大門敞開也無妨。
5554Port
5554Port
Port說明:在今年4月30日就報導出現了一種針對微軟lsass服務的新蠕蟲病毒——震盪波(Worm.Sasser),該病毒可以利用TCP 5554Port開啟一個FTP服務,主要被用於病毒的傳播。
Port漏洞:在感染“震盪波”病毒後會通過5554Port向其他感染的電腦傳送蠕蟲病毒,並嘗試連接TCP 445Port並發送攻擊,中毒的電腦會出現系統反復重啟、運行緩慢、無法正常上網等現象,甚至會被駭客利用奪取系統的控制許可權。
操作建議:為了防止感染“震盪波”病毒,建議關閉5554Port。
5632Port
5632Port
Port說明:5632Port是被大家所熟悉的遠端控制軟體pcAnywhere所開啟的Port,分TCP和UDP兩種,通過該Port可以實現在本地電腦上控制遠端電腦,查看遠端電腦螢幕,進行檔傳輸,實現檔同步傳輸。在安裝了pcAnwhere被控端電腦啟動後,pcAnywhere主控端程式會自動掃描該Port。
Port漏洞:通過5632Port主控端電腦可以控制遠端電腦,進行各種操作,可能會被不法分子所利用盜取帳號,盜取重要資料,進行各種破壞。
操作建議:為了避免通過5632Port進行掃描並遠端控制電腦,建議關閉該Port。
8080Port
8080Port
Port說明:8080Port同80Port,是被用於WWW代理服務的,可以實現網頁流覽,經常在訪問某個網站或使用代理伺服器的時候,會加上“:8080”Port號,比如http://www.cce.com.cn:8080。
Port漏洞:8080Port可以被各種病毒程式所利用,比如Brown Orifice(BrO)特洛伊木馬病毒可以利用8080Port完全遙控被感染的電腦。另外,RemoConChubo,RingZero木馬也可以利用該Port進行攻擊。
操作建議:一般我們是使用80Port進行網頁流覽的,為了避免病毒的攻擊,我們可以關閉該Port。
2011年11月2日 星期三
在 ASP.NET Web 網頁之間傳遞值
之前是用JAVA寫成開查詢頁,這次就直接來靠ASP.NET
目前狀況,
母子模版(book.aspx)
(資源頁面)page.aspx
限制其實還蠻大的…
☆要是從資源頁面轉到目標頁,不然會讀不到
☆還只能用Server.Transfer("book.aspx")參考→http://rexmen.pixnet.net/blog/post/26431572-asp.net%E8%BD%89%E6%8F%9B%E5%88%B0%E4%B8%8B%E4%B8%80%E5%80%8B%E7%B6%B2%E9%A0%81%E7%9A%84%E4%B8%89%E5%85%A9%E4%BA%8B%EF%BC%9F
另外Web.sitemap也要增加資源頁面的名稱(因為母版有用到)
總之在book.aspx
<%@ Page Title="" Language="C#" ....(略)%>
<%@ PreviousPageType VirtualPath="AccountMail.aspx" %>
就能使用了→Label1.Text = PreviousPage.PAGE;
但要進來之前還要先轉一層…
連到page.aspx轉到book.aspx
說來這算方便嗎?也這只是因應個人需求...
2011年11月1日 星期二
Iframe 只有y捲軸,不顯示x捲軸
參考→http://blog.roodo.com/jarway/archives/3244293.html
<iframe ID="I1" frameborder="0" height="600" width="100%"
marginheight="0" marginwidth="0"
name="I1" scrolling="auto" src="AccountRegister_Role.aspx"
style="overflow-x: hidden; erflow-y: auto; border-width: 0px;">
</iframe>
2011年10月28日 星期五
廣告輪播
今天要做的是廣告輪播
以前如果只有java→http://www.webpage.idv.tw/maillist/maillist2/code/01/01.htm
大概是要像這篇文這樣做,然後一個一個語法加,
但現在…
JQery在這方面可是強大到不行~><~
參考網址:
超多範例可以這看→http://malsup.com/jquery/cycle/begin.html
然後這是暫停與重新啟動→http://jquery.malsup.com/cycle/pause.html
最後再參考網路上的一篇(針對滑鼠滑入判定)→http://abgne.tw/jquery/apply-jquery/form-field-mouseover-get-focus-change-bg-color.html
目標:做一個廣告頁面,滑鼠移過去暫停,就這樣…
在head標頭內加
<style type="text/css">
.slideshow { height: 232px; width: 232px; }
.slideshow img { padding: 15px; border: 1px solid #ccc; background-color: #eee; }
</style>
<!-- include jQuery library -->
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
<!-- include Cycle plugin -->
<script type="text/javascript" src="http://jquery.malsup.com/cycle/jquery.cycle.all.js"></script>
<script type="text/javascript">
$(document).ready(function(){
$('.slideshow').cycle({
fx: 'fade', // choose your transition type, ex: fade, scrollUp, shuffle, etc...
speed: 1000
});});
$(function() {
// 當滑鼠移到 .slideshow 上時, 停止播放輪播
$('.slideshow').hover(
function()
{
$('.slideshow').cycle('pause');
},
function()
{
$('.slideshow').cycle('resume');
});
});
</script>
body只有這個...
<body>
<form id="form1" runat="server">
</form>
</body>
</html>
因為圖片要從資料庫拿,所以要另外處理,就變成…
.cs檔內
using System;
using System.Web.UI.WebControls;
using System.Text;
protected void Page_Load(object sender, EventArgs e)
{
Literal l1 = new Literal();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < form1.Controls.Count; i++)
{
sb.Append("<div class=\"slideshow\">");
sb.Append("<img src=" + @"http://jquery.malsup.com/cycle/images/beach1.jpg" + @" width=200 height=200 />");
sb.Append("<img src=" + @"http://jquery.malsup.com/cycle/images/beach2.jpg" + @" width=200 height=200 />");
sb.Append("<img src=" + @"http://jquery.malsup.com/cycle/images/beach3.jpg" + @" width=200 height=200 />");
sb.Append("</div>");
Label1.Text = sb.ToString();
this.Controls.Add(l1);
}
}
超方便,給jquery個GJ!!
以前如果只有java→http://www.webpage.idv.tw/maillist/maillist2/code/01/01.htm
大概是要像這篇文這樣做,然後一個一個語法加,
但現在…
JQery在這方面可是強大到不行~><~
參考網址:
超多範例可以這看→http://malsup.com/jquery/cycle/begin.html
然後這是暫停與重新啟動→http://jquery.malsup.com/cycle/pause.html
最後再參考網路上的一篇(針對滑鼠滑入判定)→http://abgne.tw/jquery/apply-jquery/form-field-mouseover-get-focus-change-bg-color.html
目標:做一個廣告頁面,滑鼠移過去暫停,就這樣…
在head標頭內加
<style type="text/css">
.slideshow { height: 232px; width: 232px; }
.slideshow img { padding: 15px; border: 1px solid #ccc; background-color: #eee; }
</style>
<!-- include jQuery library -->
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
<!-- include Cycle plugin -->
<script type="text/javascript" src="http://jquery.malsup.com/cycle/jquery.cycle.all.js"></script>
<script type="text/javascript">
$(document).ready(function(){
$('.slideshow').cycle({
fx: 'fade', // choose your transition type, ex: fade, scrollUp, shuffle, etc...
speed: 1000
});});
$(function() {
// 當滑鼠移到 .slideshow 上時, 停止播放輪播
$('.slideshow').hover(
function()
{
$('.slideshow').cycle('pause');
},
function()
{
$('.slideshow').cycle('resume');
});
});
</script>
body只有這個...
<body>
<form id="form1" runat="server">
</form>
</body>
</html>
因為圖片要從資料庫拿,所以要另外處理,就變成…
.cs檔內
using System;
using System.Web.UI.WebControls;
using System.Text;
protected void Page_Load(object sender, EventArgs e)
{
Literal l1 = new Literal();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < form1.Controls.Count; i++)
{
sb.Append("<div class=\"slideshow\">");
sb.Append("<img src=" + @"http://jquery.malsup.com/cycle/images/beach1.jpg" + @" width=200 height=200 />");
sb.Append("<img src=" + @"http://jquery.malsup.com/cycle/images/beach2.jpg" + @" width=200 height=200 />");
sb.Append("<img src=" + @"http://jquery.malsup.com/cycle/images/beach3.jpg" + @" width=200 height=200 />");
sb.Append("</div>");
Label1.Text = sb.ToString();
this.Controls.Add(l1);
}
}
超方便,給jquery個GJ!!
2011年10月27日 星期四
字串超過一定,變…
常在資料庫的字串過長,這樣外表不美觀,會加入以下的程式碼
在head上加入
<script runat="server">
string CutStr(object str, int count)
{
if (str.ToString().TrimEnd().Length > count)
{
return str.ToString().Substring(0, count) + "...";
}
return str.ToString();
}
</script>
會加一個.TrimEnd()去掉空白是因為後來發現資料庫有些字串後面會多回傳空白字串,冏"
Text='<%# CutStr(Eval("name"),8) %>'
要使用就這樣吧
資料庫取得字串,後面是要擷取的最大長度
在head上加入
<script runat="server">
string CutStr(object str, int count)
{
if (str.ToString().TrimEnd().Length > count)
{
return str.ToString().Substring(0, count) + "...";
}
return str.ToString();
}
</script>
會加一個.TrimEnd()去掉空白是因為後來發現資料庫有些字串後面會多回傳空白字串,冏"
Text='<%# CutStr(Eval("name"),8) %>'
要使用就這樣吧
資料庫取得字串,後面是要擷取的最大長度
2011年10月26日 星期三
Web.sitemap 自帶參數
最近遇到要同時傳兩個參數到網頁,但發現網路上大多都是自已動態生成…
偏偏覺得是個小網站,又放一個動態生成的話,實在太廢力了…
好加在後來有找到解決方法了~就在此分享並筆記一下
因為一個問題,而不同的解答
從而學到更多,大概也是我喜歡寫程式的因素…
當你要連的url是這種情形:
http://test/bookclass.aspx?type=1&id=25
sitemap如果能好解決的話
通當是這樣:(Web.sitemap)
<siteMapNode url="http://test/bookclass.aspx?type=1&id=25" title="百科全書" description="" />
喔…對了,要改成
<siteMapNode url="http://test/bookclass.aspx?type=1&id=25" title="百科全書" description="" />
我想網路應該可以找到很多這種提示
另外再補充一則連結→http://blog.csdn.net/foamflower/article/details/4678312
有興趣可以看一下…
通常這樣Web.sitemap大概就可以解決很多問題,但是:p
不幸的事總是常發生
http://test/bookclass.aspx?type=1&id=25→type=1是百科全書,而且id可能從1~100都是
http://test/bookclass.aspx?type=2&id=25→type=2是程式用書,而且id也是1~100都是
後來發現這篇→http://www.cnblogs.com/mxh691/archive/2011/05/27/2059933.html#commentform
解決了一切參數的問題>"<
照著他的參考,又改成我想要的,不用生成啥sitemap,雖然這也是一勞永逸…
將參考的code po在下面,有興趣可以玩玩,並祝有個愉快的一天
Web.sitemap
//之後的id再補
<siteMapNode url="~/test/bookclass.aspx?type=1" title="百科全書" description="" />
<siteMapNode url="~/test/bookclass.aspx?type=2" title="程式用書" description="" />
Default.master.cs
using System.Web;
public partial class Default_master : System.Web.UI.MasterPage
{
private string sid; //書的id
private string stype; //書的type
protected void Page_Load(object sender, EventArgs e)
{
//先將參數抓出來
sid= Request.QueryString.Get("id");
stype= Request.QueryString.Get("type");
SiteMap.SiteMapResolve += new SiteMapResolveEventHandler(SiteMap_SiteMapResolve);
}
SiteMapNode SiteMap_SiteMapResolve(object sender, SiteMapResolveEventArgs e)
{
//只需一個執行一個請求
SiteMap.SiteMapResolve -= new SiteMapResolveEventHandler(SiteMap_SiteMapResolve);
//需回傳的Node
SiteMapNode currentNode = null;
//如果已有找到Node,就設定為新的clone就好了
if (SiteMap.CurrentNode != null)
{
currentNode = SiteMap.CurrentNode.Clone(true);
}
else
{
//如果為空,判定抓取參數
if (sid!= "" && stype != "")
{
//將sitempa的點抓出來
SiteMapNode smn = SiteMap.Provider.FindSiteMapNode(@"~/test/bookclass.aspx?type=" + type);
//重設定一個新的連結
string newurl = smn.Url + @"&id=" + topicid;
//重做一個新的連結點(smn.Url 是唯讀),基本都跟smn一樣,只是url變成新的而已
SiteMapNode newnode = new SiteMapNode(this.SiteMapPath1.Provider, smn.Key, newurl, smn.Title, smn.Description);
newnode.ParentNode = smn.ParentNode;
currentNode = newnode;
}
}
return currentNode;
}
}
補充:如果是放在website同一層資料夾的話
用下可面的寫法,可能會讀不到
<siteMapNode url="bookclass.aspx?type=1" title="百科全書" description="" />
建議加入
<siteMapNode url="~/bookclass.aspx?type=1" title="百科全書" description="" />
good luck~=V=
另外偷補一個→http://blog.faq-book.com/?p=1940
用string.Format來將Eval的資料繫結帶到網址後面的對應位置
俺的作法(紅字代表連結的資料庫的欄位名稱)
<asp:HyperLinkField DataNavigateUrlFields="type,id"
DataNavigateUrlFormatString="bookclas.aspx?type={0}&id={1}"
ItemStyle-HorizontalAlign ="Left" ItemStyle-width ="200"
DataTextField="name">
接著補(總覺得應該開新版了)→http://download.csdn.net/detail/dyx2525775/2635106
防圖片被盜連
偏偏覺得是個小網站,又放一個動態生成的話,實在太廢力了…
好加在後來有找到解決方法了~就在此分享並筆記一下
因為一個問題,而不同的解答
從而學到更多,大概也是我喜歡寫程式的因素…
當你要連的url是這種情形:
http://test/bookclass.aspx?type=1&id=25
sitemap如果能好解決的話
通當是這樣:(Web.sitemap)
<siteMapNode url="http://test/bookclass.aspx?type=1&id=25" title="百科全書" description="" />
喔…對了,要改成
<siteMapNode url="http://test/bookclass.aspx?type=1&id=25" title="百科全書" description="" />
我想網路應該可以找到很多這種提示
字元 | ||
' | ' | |
" | " | |
& | & | |
< | < | |
> | > | |
換行 | Chr(10),Chr(13) | |
Tab | Chr(9) | |
space |   | Chr(20) |
另外再補充一則連結→http://blog.csdn.net/foamflower/article/details/4678312
有興趣可以看一下…
通常這樣Web.sitemap大概就可以解決很多問題,但是:p
不幸的事總是常發生
http://test/bookclass.aspx?type=1&id=25→type=1是百科全書,而且id可能從1~100都是
http://test/bookclass.aspx?type=2&id=25→type=2是程式用書,而且id也是1~100都是
後來發現這篇→http://www.cnblogs.com/mxh691/archive/2011/05/27/2059933.html#commentform
解決了一切參數的問題>"<
照著他的參考,又改成我想要的,不用生成啥sitemap,雖然這也是一勞永逸…
將參考的code po在下面,有興趣可以玩玩,並祝有個愉快的一天
Web.sitemap
//之後的id再補
<siteMapNode url="~/test/bookclass.aspx?type=1" title="百科全書" description="" />
<siteMapNode url="~/test/bookclass.aspx?type=2" title="程式用書" description="" />
Default.master.cs
using System.Web;
public partial class Default_master : System.Web.UI.MasterPage
{
private string sid; //書的id
private string stype; //書的type
protected void Page_Load(object sender, EventArgs e)
{
//先將參數抓出來
sid= Request.QueryString.Get("id");
stype= Request.QueryString.Get("type");
SiteMap.SiteMapResolve += new SiteMapResolveEventHandler(SiteMap_SiteMapResolve);
}
SiteMapNode SiteMap_SiteMapResolve(object sender, SiteMapResolveEventArgs e)
{
//只需一個執行一個請求
SiteMap.SiteMapResolve -= new SiteMapResolveEventHandler(SiteMap_SiteMapResolve);
//需回傳的Node
SiteMapNode currentNode = null;
//如果已有找到Node,就設定為新的clone就好了
if (SiteMap.CurrentNode != null)
{
currentNode = SiteMap.CurrentNode.Clone(true);
}
else
{
//如果為空,判定抓取參數
if (sid!= "" && stype != "")
{
//將sitempa的點抓出來
SiteMapNode smn = SiteMap.Provider.FindSiteMapNode(@"~/test/bookclass.aspx?type=" + type);
//重設定一個新的連結
string newurl = smn.Url + @"&id=" + topicid;
//重做一個新的連結點(smn.Url 是唯讀),基本都跟smn一樣,只是url變成新的而已
SiteMapNode newnode = new SiteMapNode(this.SiteMapPath1.Provider, smn.Key, newurl, smn.Title, smn.Description);
newnode.ParentNode = smn.ParentNode;
currentNode = newnode;
}
}
return currentNode;
}
}
補充:如果是放在website同一層資料夾的話
用下可面的寫法,可能會讀不到
<siteMapNode url="bookclass.aspx?type=1" title="百科全書" description="" />
建議加入
<siteMapNode url="~/bookclass.aspx?type=1" title="百科全書" description="" />
good luck~=V=
另外偷補一個→http://blog.faq-book.com/?p=1940
用string.Format來將Eval的資料繫結帶到網址後面的對應位置
俺的作法(紅字代表連結的資料庫的欄位名稱)
<asp:HyperLinkField DataNavigateUrlFields="type,id"
DataNavigateUrlFormatString="bookclas.aspx?type={0}&id={1}"
ItemStyle-HorizontalAlign ="Left" ItemStyle-width ="200"
DataTextField="name">
接著補(總覺得應該開新版了)→http://download.csdn.net/detail/dyx2525775/2635106
防圖片被盜連
2011年10月25日 星期二
流水號資料表
有時後會遇到像是需要流水號編號,
可是又會刪去,並新增
這時後真的很頭大,
是有在網路上看到不錯的範例,但是因為我的選單是做成下拉式的
所以需按照新增的順序往下排,就不採用了
不過怕未來需用上,在此做個筆記一下
建立資料表:
create table T_User(F_ID int identity(1,1) not null,F_Name varchar(20) not null)
插入數據:
insert into T_User(F_Name) values('我是第一名') Select SCOPE_IDENTITY()
存儲過程:
CREATE PROCEDURE [dbo].[sp_User](@F_Name int) AS
begin tran Insertinto_T_User
Insert into dbo.T_User(F_Name) values(@F_Name)
Select SCOPE_IDENTITY()
詳細內容可轉往→http://www.cnblogs.com/yank/archive/2008/04/16/1156713.html
另外自已寫的
很簡單:(但是老 實說不太滿意
★需找到目前流水號最大值
★取得目前所有的流水序號表
★如果有相同的流水號,就+1處理
★找到空缺(代表中間有被刪除
★一直到最大值都沒有空缺,則將最大值+1處理,為目前的流水號
SqlCommand cmd = new SqlCommand("SELECT [id] From [tb] ORDER BY [id] DESC", Connection);
DataTable dt = new DataTable();
SqlDataAdapter da = new SqlDataAdapter(cmd);
da.Fill(dt);
if (dt != null)
{
int maxid = Int32.Parse(dt.Rows[0][0].ToString());
int curid = 0;
bool bhave = false;
//尋找有無間值(起始值為1,故從2開始)
for (int i = 2; i < maxid; i++)
{
//檢查此序號已有使用
bhave = false;
foreach (DataRow dataRow in dt.Rows)
{
if (dataRow[0].ToString().Equals(i.ToString()))
{
bhave = true;
break;
}
}
if (!bhave)
{
curid = i;
break;
}
}
//無找到,加在最後面
if (curid == 0)
{
curid = maxid + 1;
}
tagid = curid.ToString();
可是又會刪去,並新增
這時後真的很頭大,
是有在網路上看到不錯的範例,但是因為我的選單是做成下拉式的
所以需按照新增的順序往下排,就不採用了
不過怕未來需用上,在此做個筆記一下
建立資料表:
create table T_User(F_ID int identity(1,1) not null,F_Name varchar(20) not null)
插入數據:
insert into T_User(F_Name) values('我是第一名') Select SCOPE_IDENTITY()
存儲過程:
CREATE PROCEDURE [dbo].[sp_User](@F_Name int) AS
begin tran Insertinto_T_User
Insert into dbo.T_User(F_Name) values(@F_Name)
Select SCOPE_IDENTITY()
詳細內容可轉往→http://www.cnblogs.com/yank/archive/2008/04/16/1156713.html
另外自已寫的
很簡單:(但是老 實說不太滿意
★需找到目前流水號最大值
★取得目前所有的流水序號表
★如果有相同的流水號,就+1處理
★找到空缺(代表中間有被刪除
★一直到最大值都沒有空缺,則將最大值+1處理,為目前的流水號
SqlCommand cmd = new SqlCommand("SELECT [id] From [tb] ORDER BY [id] DESC", Connection);
DataTable dt = new DataTable();
SqlDataAdapter da = new SqlDataAdapter(cmd);
da.Fill(dt);
if (dt != null)
{
int maxid = Int32.Parse(dt.Rows[0][0].ToString());
int curid = 0;
bool bhave = false;
//尋找有無間值(起始值為1,故從2開始)
for (int i = 2; i < maxid; i++)
{
//檢查此序號已有使用
bhave = false;
foreach (DataRow dataRow in dt.Rows)
{
if (dataRow[0].ToString().Equals(i.ToString()))
{
bhave = true;
break;
}
}
if (!bhave)
{
curid = i;
break;
}
}
//無找到,加在最後面
if (curid == 0)
{
curid = maxid + 1;
}
tagid = curid.ToString();
訂閱:
文章 (Atom)