Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 有没有一种方法可以为sql查询提供一个可调整的预处理语句_Php_Mysql - Fatal编程技术网

Php 有没有一种方法可以为sql查询提供一个可调整的预处理语句

Php 有没有一种方法可以为sql查询提供一个可调整的预处理语句,php,mysql,Php,Mysql,所以我尝试创建一个HTML前端,它可以使用文本字段来搜索SQL数据库。但是可以搜索多个列,许多列包含数字或字母。用户可以一次搜索一个或多个列 在我自己的测试服务器中,我尝试将可能的查询分解为下拉列表;并有开关箱来处理选择。但这并不奏效。我的最终目标是让textbox承载所有查询数据,并将其传递给一个准备好的语句 所以我的问题,;是否有一种方法使准备好的语句具有适应性,以处理单个搜索案例或多个搜索案例。例如,其中第1列类似于查询1(第2列类似于查询2) 这可能有点冗长,我相信有更好的方法可以循环或

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

在我自己的测试服务器中,我尝试将可能的查询分解为下拉列表;并有开关箱来处理选择。但这并不奏效。我的最终目标是让textbox承载所有查询数据,并将其传递给一个准备好的语句


所以我的问题,;是否有一种方法使准备好的语句具有适应性,以处理单个搜索案例或多个搜索案例。例如,其中第1列类似于查询1(第2列类似于查询2)

这可能有点冗长,我相信有更好的方法可以循环或排列*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;

?>

Col1:

Col2:

Col3:

Col4:





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

<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>
可以使用此数据库查询获取表的列列表。然后使用
array\u intersect\u key
可以筛选出已提交但表中不存在的名称和列名


从information_schema.columns中选择column_name,其中table_name='table'

不要让用户发送您要连接到查询中的SQL。但是,只要确保列名来自列表,而不是user input.PS,就可以根据用户参数按需构建查询。没有适当的安全措施,文本字段Col1可能需要JS。
$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