2017-03-20 10 views
1

**詳細の編集PHP検索ページを作成してSQL Serverデータベースを検索する

SQL Serverデータベースの結果を表示するための検索ページの作成に問題があります。私のSSMSで必要なものを出力するので、私のSQLは正しいです。私がテストしたので、私の接続情報も正しいです。私の問題は、検索フォームにそれを結びつけることから来ています - 私は結果を見つけるためにそれを得ることができません。しかし、テーブルを印刷したいのであれば、それはうまく印刷されますが、実際にはこれを検索する必要があります。私は一般的にPHPとSQLでまだかなり新しいですが、これは私がこれまで持っているものです。

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

私が検索するたびに私が手なし:

$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>'; 
     } 
    } 
} 

マイ検索フォームは次のようになります結果。だから私の質問は:私の検索フォームが正しいと私のWHERE col_1 LIKE '%$searchq%'は正しいですか?私は何が欠けていますか?また、preg_replaceはSQLインジェクションの防止に役立ちませんか?

これほど説明的でない場合は、私にお知らせください。

+1

正確に何が起こっていますか?あなたは問題があると言いましたが、問題の内容は述べていません。また、あなたのコードはSQLインジェクションに対して脆弱です - パラメータ化されたクエリ/プリペアドステートメントの使用を研究します。 – ADyson

+0

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

+0

昨日の長い日、残して申し訳ありません。私が検索すると結果が見つかりません。私はちょうど得る$出力に基づいて何もなかった。 dbをXMLファイルにダンプしてセキュリティ上のリスクを防ぐためにファイルを検索する方が良いでしょうか? –

答えて

0

私はこの問題は、このラインをどうするだと思う:php.netsqlsrv_num_rows()のドキュメント(強調鉱山)から

$count = sqlsrv_num_rows($query); 

パラメータ
行数が返されるためのステートメント。 statmentリソースは、静的またはkeysetカーソルで作成する必要があります。

パラメータ - sqlsrv_num_rows

戻り、エラーが発生した場合、成功とFALSEに取り出された行の数を返します
値。 フォワードカーソル(デフォルト)またはダイナミックカーソルが使用されている場合は、FALSEが戻されます。

戻り値は - あなたがあなたのクエリでカーソルを指定することができなかったので、デフォルトのカーソルを使用すると、クエリが結果を返されていた場合falseに関係なく、返され

sqlsrv_num_rows。

ifステートメントでは、$count == 0にチェックを入れます。このチェックはがfalseと評価され、厳密な型比較(===)を使用していないため、trueを返します。したがって、あなたは常に「何もありません」と表示されます。

この問題を解決するには、のstaticまたはkeysetカーソルをクエリに指定する必要があります。例としてカーソルとしてSQLSRV_CURSOR_STATICを使用しますが、SQLSRV_CURSOR_KEYSETを使用できます。カーソルの詳細については、See hereを参照してください。

一般的な構文は次のとおりです。私はこの釘付けいる

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

ありがとうございます。私は、パラメータ化されたクエリについてもう少し読んで、報告するつもりです! –

0

と思います。それは私が必要とするすべてを表示します。です。これはパラメータ化されたクエリとして設定されています。私のクラスタグでは出力をスタイルすることができます。

私の唯一の問題は、誰かが通りの番号を入力し、通りの名前または通りの名前が2つ以上の単語である場合、私は結果を得ることはありません。おそらく私の$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>"; 
関連する問題