2013-11-22 145 views
0

我正在創建一個接收用戶輸入(科學紙DOI)並查詢數據庫以顯示圖形的Web應用程序。我一直試圖通過檢查用戶輸入是否與正確的DOI相匹配來限制從遠程服務器(具有Web服務器的專用DMZ)以來對數據庫的連接。如果它沒有連接到數據庫將被製作,我希望這將有助於加快應用程序,如果有許多用戶立即進行查詢。檢查用戶使用PHP輸入HTML表單輸入

僞:所有論文DOI都以「10.1103 /」開頭,因爲它們都是物理論文。這部分我已經正確實施使用substr。接下來,我想在輸入端,查看每個字符,以確保它只是只包含這些字符:

  • 「/」
  • 「」

實施例的DOI:

  • 10.1103/RevModPhys.9.1
  • 10.1103/RevModPhys.76.1015
  • 10.1103/PhysRevLett.95.208304

這是我的代碼:

function checkDOI($doi) { 
      if (substr($doi, 0, 8) != "10.1103/") { 
        echo "Invalid DOI"; 
        return false; 
      } 
      for ($n = 0; $n < strlen($doi)+1; $n++) { 
        if (!ctype_alnum($doi[n]) && $doi[n] != "." && $doi[n] != "/") { 
          echo "Invalid DOI"; 
          return false; 
        } 
      } 
      echo "Valid DOI"; 
      return true; 
    } 

    if(isset($_POST['submit'])) { 
      $doi_input = $_POST['doi_input']; 
      checkDOI($doi_input); 
    } 

我第一次使用PHP和JavaScript,僞代碼很簡單,但由於某種原因,第二條if語句出錯了。不知道我是否真的能做到這一點。回聲僅用於測試。

您是否認爲對每個輸入進行檢查會顯着降低應用程序的速度?是否值得限制連接到MySQL的數量?

一旦我有這個工作只查詢數據庫,如果檢查返回true,代碼的底部將被修改。

感謝您的幫助!

+0

使用正則表達式,而不是一個循環。但無論如何,我不認爲它會顯着降低應用程序的速度。 – Barmar

回答

0

檢查每一個字符輸入,以確保它僅包含的只有這些字符

我建議你使用preg_match。嘗試這樣的:

$value="10.1103/RevModPhys.9.1"; 
if(preg_match("/^[a-zA-Z0-9\/.]+$/", $value)){ 
    echo "match found"; 
    }else{ 
    echo "no match found"; 
    } 

點擊這裏:Demo

欲瞭解更多信息:preg_match

+1

這對我有用。非常感謝! –

0

你的錯誤是$doi[n],它不是一個數組,它應該是索引是無效的。

因此,使用這樣的函數

$chars_doi = str_split($doi); 

循環之前獲得字符數組,然後在你的循環使用

$chars_doi[$n] 

所以,你應該是這樣的:

$chars_doi = str_split($doi); 
$size = sizeof($chars_doi) - 1; 
for ($n = 0; $n < $size; $n++) { 
    if (!ctype_alnum($chars_doi[$n]) && $chars_doi[$n] != "." && $chars_doi[$n] != "/") { 
     echo "Invalid DOI"; 
     return false; 
    } 
} 

小提示,避免使用功能如strlen/sizeof等oop參數或它將在每次迭代中被調用。性能預先將值存儲在變量中會更好。