2017-03-20 82 views
1

**編輯的更多信息創建PHP搜索頁面搜索SQL Server數據庫

我在創建搜索頁面來顯示從SQL Server數據庫結果的問題。我的SQL是正確的,因爲它在SSMS中輸出我想要的內容。我的連接信息也正確,因爲我已經測試過了。我的問題來自將其綁定到搜索表單 - 我找不到任何結果。如果我想讓它打印一張表格,它的打印效果很好,但是,我真的需要這樣做才能用作搜索。我仍然很新的PHP和SQL一般,但是這是我到目前爲止有:

$serverName = "myserver"; 
$connectionInfo = array("Database"=>"mydb", "UID"=>"myuser", "PWD"=>"mypass"); 
$conn = sqlsrv_connect($serverName, $connectionInfo) OR die ('broke:' .sqlsrv_errors()); 
$output = ''; 
if(isset($_POST['search'])) { 
    $searchq = $_POST['search']; 
    $searchq = preg_replace("#[^0-9a-z]#i", "", $searchq); 
    $query = sqlsrv_query($conn, "SELECT columns_I_need 
            FROM tables_I_need 
            WHERE col_1 LIKE '%$searchq%'") or die('broke:' .sqlsrv_errors()); 
$count = sqlsrv_num_rows($query); 

if($count == 0) { 
     $output = 'There was nothing'; 
    } else { 
     while($row = sqlsrv_fetch_array($query)) { 
      $stname = $row['streetname']; 
      $stno = $row['streetnumber']; 
      $apno = $row['permitnumber']; 

      $output .= '<div> '.$stname.' '.$stno.'</div>'; 
     } 
    } 
} 

我的搜索形式如下:

<form> action="" method="post"> 
    <input type="text" name="search" placeholder="Search for address..."> 
    <input type="submit" value="Submit"> 
</form> 
<?php print("$output"); ?> 

每次我搜索我沒有得到任何結果。所以我想我的問題是:我的搜索表單是否正確,我的WHERE col_1 LIKE '%$searchq%'是否正確?我錯過了什麼?另外,preg_replace沒有幫助防止SQL注入?

如果這些描述不夠詳細,請告訴我。

+1

究竟發生了什麼問題?你說過有問題,但沒有說出問題是什麼。此外,您的代碼易受SQL注入攻擊 - 研究使用參數化查詢/準備語句。 – ADyson

+0

http://bobby-tables.com/php.html –

+0

昨天很長一段時間,對不起,離開了。當我搜索它時沒有找到任何結果。我剛剛得到沒有任何基於$輸出。將數據庫轉儲爲XML文件,然後搜索該文件以防止出現安全風險,會更好嗎? –

回答

0

我認爲這個問題是這一行做:

$count = sqlsrv_num_rows($query); 

從上php.net(重點煤礦)的文檔sqlsrv_num_rows()

參數
返回了行數的聲明。 必須使用靜態或密鑰集光標創建statment資源。

參數 - sqlsrv_num_rows

返回值
成功返回檢索和FALSE,如果發生錯誤的行數。 如果使用前向光標(默認)或動態光標,則返回FALSE。

返回值 - sqlsrv_num_rows

因爲你沒有在查詢中指定一個光標,光標默認的使用和false返回,無論如果查詢返回了結果。

然後在您的if聲明中,檢查$count == 0。此檢查將返回true,因爲0可以評估爲false並且您沒有使用嚴格類型比較(===)。因此你總會看到「沒有任何東西」。

爲了解決這個問題,你需要指定一個靜態鍵集光標查詢。我將使用SQLSRV_CURSOR_STATIC作爲我的光標作爲示例,但您可以使用SQLSRV_CURSOR_KEYSETSee here瞭解有關不同遊標的更多信息。

一般語法是:

$stmt = sqlsrv_query($conn, $query, $params, array("Scrollable" => SQLSRV_CURSOR_STATIC)); 
+0

謝謝你。我會做更多的參數化查詢閱讀和報告! –

0

我覺得我有這個板上釘釘了。它顯示我需要的一切,我相信它被設置爲參數化查詢,並與我的類標籤,我可以風格的輸出。

我唯一的問題是,如果有人輸入街道號碼,街道名稱或街道名稱是兩個或更多的話,我沒有得到任何結果。我的$sql聲明可能很簡單。我想:

WHERE (STNO LIKE '%$search_term%' AND STNAME LIKE '%$search_term%') OR APNO LIKE '%$search_term%'

但是,這並不讓我無論什麼。

$serverName = "myserver"; 
$connectionInfo = array("Database"=>"mydb", "UID"=>"myuser", 
"PWD"=>"mypass"); 
$conn = sqlsrv_connect($serverName, $connectionInfo) OR die ('broke:' 
.sqlsrv_errors()); 

$search_term = $_GET['query']; 

$sql = "SELECT my rows FROM my tables 
WHERE STNO LIKE '%$search_term%' OR STNAME LIKE '%$search_term%' OR APNO LIKE '%$search_term%' 
ORDER BY STNO"; 

echo "<div class='search-term-display'>You searched for: ", $search_term, "</div>"; 

if(isset($_GET['query'])) { 
    $search_term = $_POST['query']; 
    $search_term = preg_replace("#[^0-9a-z]#i", "", $search_term); 
    $query = sqlsrv_query($conn, $sql, array(), array("Scrollable" => 'static')); 

while($data = sqlsrv_fetch($query)) { 
     while($row = sqlsrv_fetch_array($query)){ 
      $stno = $row['STNO']; 
      $stname = $row['STNAME']; 
      $apno = $row['APNO']; 
      $suffix = $row['SUFFIX']; 
      $hseptyp = $row['HSEPTYP']; 
      $dttm = $row['COMPDTTM']->format('d/m/Y'); 
      $partial = $row['PARTIAL']; 
      $waived = $row['WAVIED']; 
      $failed = $row['FAILED']; 
      $inspcomments = $row['INSPECTIONCOMMENTS']; 
      $fcomments = $row['FAILEDCOMMENTS']; 
      $descript = $row['DESCRIPT']; 

      echo "<hr>"; 
      echo "<div class='insp_address'>".$stno.' '.$stname.' Permit Number: '.$apno."</div>"; 
      echo "<div class='insp_date'>".'Inspection Date: '.$dttm."</div>"; 
      echo "<div class='sys_type'>".'Septic System Type: ' .$hseptyp."</div>"; 
      echo "<div class='code_violation_status'>".'Code Violation Status: ' .$descript."</div>"; 
      echo "<div class='code_violation'>".'Code: '.$failed."</div>"; 
      echo "<div class='insp_comments_title'>Inspection Comments:</div>"; 
      echo "<div class='insp_comments'>".$fcomments."</div>"; 
    } 
     sqlsrv_free_stmt($query); 

    } 
} 
echo "</div>";