[英]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.