簡體   English   中英

在PHP中搜索MySQL表

[英]Search a MySQL table in PHP

我正在構建一個腳本,用戶可以在其中查詢(搜索)MySQL數據庫。

用戶首先從下拉列表中選擇表格,然后他們最多可以選擇4個“過濾器”,例如userID=001

這是我的代碼:

      $con=mysqli_connect("localhost","Username","Password","DBname");
           // Check connection
           if(mysqli_connect_errno()) {
              echo "Failed to connect to MySQL: " . mysqli_connect_error();
           }

$query = "SELECT * FROM ".$table." WHERE 1=1 ";

if($filter1 != "" or $filter1v  != "" )
{
    $query .= " and $filter1 LIKE'%$filter1v%'";
}

if($filter2 != "" or $filter2v  != "" )
{
    $query .= " and $filter2 LIKE'%$filter2v%'";
}

if($filter3 != "" or $filter3v  != "" )
{
    $query .= " and $filter3 LIKE'%$filter3v%'";
}

if($filter4 != "" or $filter4v != "")
{
    $query .= " and $filter4 LIKE'%$filter4v%'";
}

$query .= ";";    

$resultRAW = mysqli_query($con, $query); 
echo mysqli_error($con);
$result = array();
while($data = mysqli_fetch_array($resultRAW, MYSQLI_ASSOC))
{
    $result[] = $data;
}
echo "<table class='table table-striped' id='tableWithExportOptions'>";

$amountRows = count($result);
for($i = 0; $i < $amountRows; $i++)
{
    $keys = array_keys($result[$i]);
    $amountColumns = count($keys);

    if ($i == 0)
    {
         echo "<thead><tr>";
         //I replaced the foreach clause because of performance reasons but they would work as well
         for($j = 0; $j < $amountColumns; $j++)
         {
             echo "<th>".$keys[$j]."</th>";
         }

         echo "</tr></thead>";
     }

     echo "<tr>";
     for($j = 0; $j < $amountColumns; $j++)
     {
         echo "<th>".$result[$i][$keys[$j]]."</th>";
     }
     echo "</tr>";
}
echo "</table>";

?>

如果用戶不選擇任何過濾器,則腳本可以正常運行,但是使用過濾器時不會顯示任何結果?

根據您的數據庫,這可能會有所不同。 但是您不能將字符串附加到結果中。 $ result是一個MySQL Result對象。 您需要使用以下代碼來獲取結果:

$array = array();
while($data = mysqli_fetch_array($result, MYSQLI_ASSOC))
{
    $array[] = $data;
}

然后,您可以使用結果數組$ array並做您想做的任何事情

如果要以這種方式創建查詢,則需要稍后調用mysqli_query並構建如下所示的查詢:

$con = mysqli_connect("localhost","Username","Password","DBname");
// Check connection
if(mysqli_connect_errno())
{
    echo "Failed to connect to MySQL: ".mysqli_connect_error();
}


$query = "SELECT * FROM ".$table." WHERE 1=1 ";
if($field != "" or $fieldvalue != "" )
{
    $query .= " and ".$field." LIKE'%".$fieldvalue."%'";
}

if($filter1 != "" or $filter1value  != "" )
{
    $query .= " and ".$filter1." LIKE'%".$filter1value."%'";
}

if($filter2 != "" or $filter2value  != "" )
{
    $query .= " and ".$filter2." LIKE'%".$filter2value."%'";
}

if($filter3 != "" or $filter3value  != "" )
{
    $query .= " and ".$filter3." LIKE'%".$filter3value."%'";
}

if($filter4 != "" or $filter4value  != "")
{
    $query .= " and ".$filter4." LIKE'%".$filter4value."%'";
}

$query .= ";";    

$resultRAW = mysqli_query($con, $query);

$result = array();
while($data = mysqli_fetch_array($resultRAW, MYSQLI_ASSOC))
{
    $result[] = $data;
}

而且我會非常小心$ table。 在查詢中。 這看起來像是發起SQL Inejction攻擊的好時機。 為了防止這種情況,我建議使用准備好的語句。 在此處可以找到更多信息: 防止SQL注入 不幸的是,這不適用於表名,因此您需要為任何惡意輸入手動對其進行測試。 如果您“信任”此變量,則可能沒問題,但是如果使用rinput,我會至少調用:

 $table = mysqli_real_escape_string($table);

編輯:

echo "<table class='table table-striped' id='tableWithExportOptions'>";

$amountRows = count($result);
for($i = 0; $i < $amountRows; $i++)
{
    $keys = array_keys($result[$i]);
    $amountColumns = count($keys);

    if ($i == 0)
    {
         echo "<thead><tr>";
         //I replaced the foreach clause because of performance reasons but they would work as well
         for($j = 0; $j < $amountColumns; $j++)
         {
             echo "<th>".$keys[$j]."</th>";
         }

         echo "</tr></thead>";
     }

     echo "<tr>";
     for($j = 0; $j < $amountColumns; $j++)
     {
         echo "<th>".$result[$i][$keys[$j]]."</th>";
     }
     echo "</tr>";
}
echo "</table>";

如果這不起作用,請告訴我,我尚未對此進行測試。

因為您將字符串連接到$result = mysqli_query

$result = "SELECT * FROM $table WHERE 1=1";
if ($field != "" or $fieldvalue != "") {
    $result .= " and $field   LIKE'%$fieldvalue%'";
}

if ($filter1 != "" or $filter1value != "") {
    $result .= " and $filter1 LIKE'%$filter1value%'";
}

if ($filter2 != "" or $filter2value != "") {
    $result .= " and $filter2 LIKE'%$filter2value%'";
}

if ($filter3 != "" or $filter3value != "") {
    $result .= " and $filter3 LIKE'%$filter3value%'";
}

if ($filter4 != "" or $filter4value != "") {
    $result .= " and $filter4 LIKE'%$filter4value%'";
}

mysqli_query($con, $result);

我幾乎看不到的東西讓我在這里停下來。

  • 但首先,要回答您的問題:

mysqli_query(); 方法執行傳遞給它的查詢。 在您的代碼中,您正在使用mysqli_query();執行基本查詢mysqli_query(); 在檢查並添加過濾器及其值之前。 因此,無論用戶在下拉菜單中選擇什么,都將首先執行不帶過濾器的查詢。 您需要先構建整個查詢字符串,然后使用mysqli_query();執行查詢mysqli_query(); 經過所有檢查以及可能添加到查詢中。

  • 此外,以后可能會破壞事情的事情:

另外,您可能希望在if語句中使用and / && or就像您擁有的那樣,如果在$filter1value填充了一個值,而在$filter1沒有填充它,則將允許SELECT語句中斷,它將在if中測試為true,並且WHERE子句將使用值但沒有字段連接到您的查詢中。

提示: echo您的SQL命令,以查看您的php代碼生成了什么,以在開發期間運行它之前查看它是否是有效的SQL。

我自己和其他許多PHP開發人員都更喜歡使用PDO與數據庫進行個人交互,但這只是我的偏愛。

我想給你一個代碼示例,說明我將如何做,但是老實說我會改變你的代碼太多,所以我離開了。

旁注:我不確定輸入的安全性是什么,但是通過將輸入變量直接包含在SQL命令字符串中來確定您正在做什么,因此您很容易受到SQL注入攻擊。 非常危險,具體取決於誰將能夠訪問您的腳本。 也許嘗試使用帶有參數的預備語句來保持一點安全性。 請查看mysqli_prepare(); 它的朋友, mysqli_stmt_bind_param(); 在這種情況下使用mysqli 如果要接受系統的外部輸入,請始終在使用的數據庫庫上使用准備好的語句。 它將節省您一天的工作。

只有我的兩分錢使用它,不要使用它。 :)

我猜您應該在執行查詢之前在查詢字符串上添加過濾器,而不是在結果中添加過濾器? 例如

$query = "SELECT * FROM $table WHERE 1=1";
if (...) {
    $query .= ...
}

// some more ifs...

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM