2016-02-02 133 views
0

我正在嘗試創建一個包含多個字段的數據庫進行搜索,但如果有空字段,它將顯示整個數據庫。我懷疑這是因爲OR中的查詢,我不知道如何解決它。顯示整個數據庫的多字段搜索表格

<?php 
if (isset($_POST['Submit'])) 
{ 
$con = mysqli_connect(); 
if (mysqli_connect_errno()) 
{ 
    echo "Failed to connect to MySQL: " . mysqli_connect_error(); 
} 

$surname = $_POST['surname']; 
$firstname = $_POST['firstname']; 
$maiden = $_POST['maiden']; 
$birth = $_POST['birth']; 
$death = $_POST['death']; 
$keyword = $_POST['keyword']; 

$sql = "SELECT * FROM obits WHERE surname LIKE '%" . $surname . "%' OR firstname LIKE '%" . $firstname . "%' OR maiden LIKE '%" . $maiden . "%' OR birth LIKE '%" . $birth . "%' OR death LIKE '%" . $death . "%' OR obittext LIKE '%" . $keyword . "%'"; 

$result = mysqli_query($con, $sql); 

進一步下跌,我有這樣的:

if (isset($result) && $result->num_rows > 0); 

則如下表等等。我想我有所有相關的信息在這裏。有什麼建議麼?請使用英文而不是程序員,我很新。提前致謝!

+0

「請使用英文而不是程序員」, - 那部分讓我知道了,恩。回到業務。不知道你的意思是「顯示整個數據庫 - 但是是的,由於你的Query中有大量的ORs,並且在每一列進行了'Wildcard'搜索,它會產生很多結果 – andre3wap

+0

它顯示每個在數據庫中輸入一個空白的字段 – aloeveraking24

+0

爲什麼在將數據發送到查詢之前不對其進行驗證? – CapeStar

回答

1

讓我們看看其中的一個條件:

surname LIKE '%" . $surname . "%' 

假設,$surnameMiller在這裏,您可以選擇有一個像%Miller%姓的所有行。 %標誌是通配符,它​​基本上可以代表任何東西。這意味着您要選擇姓氏包含Miller的所有行,並在其之前或之後使用任何字符串,包括空行。

現在,如果Miller在這種情況下將爲空,那麼您正在尋找%%,因此在它之前或之後有任何空字符串 - 所以真的是任何可能的字符串。因此,每一行都會被選中。

由於這不僅適用於姓氏,而且適用於任何列,因此將任何條件留空將導致所有行被選中。

Find more info on SQL Wildcards.

跳過空值的where子句,您可以動態構建它:

$condition = "WHERE"; 

if(!empty($surname)){ 
    $condition .= "surname LIKE '$surname' OR"; 
} 

if(!empty($firstname)){ 
    $condition .= "firstname LIKE '$firstname' OR"; 
} 

// ... 

$sql = "SELECT * FROM obits " . $condition; 

注:

  • 將有在條件尾隨OR你將不得不刪除。
  • 如果所有條件都是空白,這也會導致錯誤。

但它應該給你一個願望! :-)

側面說明: 你應該看看prepared statements。將POST變量直接傳遞到SQL語句中是highly dangerous

+0

沒關係,我該如何解決這個問題? – aloeveraking24

+0

好吧,讓我更具體。這就是爲什麼我認爲LIKE可能是要走的路。如果它導致這個問題,我將如何修復它,同時還有一點點拼寫錯誤的緩衝區? – aloeveraking24

+0

只需檢查發佈數據中的空值。如果它不爲空,則運行查詢。否則不運行。 – CapeStar

相關問題