有没有办法为sql查询提供适应性准备好的语句

时间:2017-12-16 21:55:03

标签: php mysql

所以我想创建一个可以使用文本字段搜索SQL数据库的HTML前端。但是可以搜索多个列,以及包含数字或字母的许多列。用户可以一次搜索一个或多个列。

在我自己的测试服务器中,我尝试将可能的查询分解为下拉列表;并有切换案例来处理选择。但这没效果。我的最终目标是让文本框托管所有查询数据,并将其传递给准备好的语句

所以我的问题;有没有办法使一个准备好的语句适应,处理单个搜索案例或多个搜索案例。例如。 WHERE column1 LIKE query1(AND column2 LIKE query2)。

2 个答案:

答案 0 :(得分:1)

这是一个基本概念,显然你需要自己进行验证和消毒等。在你的html中使用一个数组来保存所有的表单值:

A.divisions = tuple(divisions)

然后处理该数组以准备查询

<form action="#" method="post">
  Col1:<br>
  <input type="text" name="database[column1]"><br>
  Col2:<br>
  <input type="text" name="database[column2]"><br>
  Col3:<br>
  <input type="text" name="database[column3]"><br>

您可以使用此数据库查询来获取表的列列表。然后使用$input = $_POST['database']; // Assign all form variables to $input $input = array_filter($input, 'strlen'); // Remove any form fields which were submitted with empty values $where = implode(' AND ', (array_map(function($a){return "'$a' LIKE ?";}, array_keys($input)))); // Assemble your list of WHERE clauses $statement = $dbo->prepare("SELECT * FROM table WHERE $where"); $statement->execute(array_values($input)); // Execute statement with corresponding variables ,您可以过滤掉已提交但在表中不存在的列名

array_intersect_key

答案 1 :(得分:0)

这可能是冗长的,我相信有更好的方法可以将它循环或阵列。 *由于“AND”,Col1文本框必须有数据才能生效,我希望这会有所帮助。

<form action="#" method="post">
  Col1:<br>
  <input type="text" name="Col1"><br>
  Col2:<br>
  <input type="text" name="Col2"><br>
  Col3:<br>
  <input type="text" name="Col3"><br>
  Col4:<br>
  <input type="text" name="Col4"><br>

  <input type="submit" name="search" value="Search"><br>
</form>

<br />
<br />

<?php


$SQL_Claus = "";

if (!empty($_POST['Col1'])){
    $Col1 = $_POST['Col1'];
    $SQL_Claus = $SQL_Claus . " Col1 LIKE " . $Col1;
}
if (!empty($_POST['Col2'])){
    $Col2 = $_POST['Col2'];
    $SQL_Claus = $SQL_Claus . " AND Col2 LIKE " . $Col2;
}
if (!empty($_POST['Col3'])){
    $Col3 = $_POST['Col3'];
    $SQL_Claus = $SQL_Claus . " AND Col3 LIKE " . $Col3;
}
if (!empty($_POST['Col4'])){
    $Col4 = $_POST['Col4'];
    $SQL_Claus = $SQL_Claus . " AND Col4 LIKE " . $Col4;    
}

$SQL_Statement = "SELECT * FROM TABLE WHERE ".$SQL_Claus;
echo $SQL_Statement;

?>