在PHP中搜索MySQL表

时间:2016-06-02 08:22:38

标签: php mysql

我正在构建一个脚本,用户可以在其中查询(搜索)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>";

?>

如果用户没有选择任何过滤器,则脚本可以正常工作,但是在使用过滤器时,它不会显示任何结果?

4 个答案:

答案 0 :(得分:1)

根据您的数据库,这可能会有所不同。但是你不能在结果中追加一个字符串。 $ 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攻击的一个非常好的观点。为了防止那些我建议使用准备好的陈述。更多信息可以在这里找到:Prevent SQL Injection。 不幸的是,这不适用于表名,因此您需要手动测试任何appleios输入。如果你“信任”这个变量那么它可能没问题但是如果它是一个使用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>";

如果这不起作用请告诉我,我没有测试过。

答案 1 :(得分:0)

因为您将字符串连接到$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);

答案 2 :(得分:0)

我能看到的很少东西让我停下来。

  • 但首先,回答你的问题:

mysqli_query();方法执行您传递给它的查询。在您的代码中,您在检查并添加过滤器及其值之前,使用mysqli_query();执行基本查询。因此,无论用户在您的下拉列表中选择什么,都将始终首先执行不带过滤器的查询。您需要首先构建整个查询字符串,然后在对查询进行所有检查和可能的添加后,使用mysqli_query();执行查询。

  • 此外,以后可能会破坏的事情:

此外,您可能希望在if语句中使用and / &&or就像你拥有它一样,如果SELECT填充了一个值而$filter1value没有$filter1,那么你的WHERE语句就会中断,它会在你的if和echo子句将使用值但没有字段连接到您的查询。

提示: mysqli_stmt_bind_param();您的SQL命令可以查看您的php代码生成的内容,以便在开发之前运行它来查看它是否是有效的SQL。

我和许多其他PHP开发人员更喜欢使用PDO亲自与数据库进行交互,但这只是我的偏好。

我想给你一个代码示例,说明我将如何完成它,但老实说,我会改变你的代码,所以我离开了它。

旁注:我不确定您对输入的安全级别,以及您通过直接将输入变量包含在SQL命令字符串中所做的事情。这让你对SQL注入攻击持开放态度。非常危险,具体取决于谁将能够访问您的脚本。也许尝试使用带参数的预准备语句来保持安全性。在这种情况下,请查看mysqli_prepare();它的朋友,mysqli方法,您正在使用<svg viewBox="0 0 100 100" height="150px" width="150px"> <rect x="10" y="10" rx="5" width="80" height="80" fill="pink" stroke="green" stroke-width="5"/> </svg>。如果您正在接受系统的外部输入,请始终在您使用的数据库库上使用预准备语句。它有一天会挽救你的工作。

只需我的两分钱就可以使用它,不要使用它。 :)

答案 3 :(得分:-1)

我猜你应该在执行查询之前在查询字符串上添加过滤器,而不是将过滤器添加到结果中? E.g。

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

// some more ifs...

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