我正在构建一个脚本,用户可以在其中查询(搜索)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>";
?>
如果用户没有选择任何过滤器,则脚本可以正常工作,但是在使用过滤器时,它不会显示任何结果?
答案 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);