我认为这是一个很简单的问题。这是我的最佳选择还是有一个“正确的”方法?
<?php
$correctOrder = array("name", "address", "phone", "starttime", "endtime",
"status", "details");
$sql->sql1 = "SELECT * FROM `pickups` WHERE";
if (isset($_GET["name"])){
$sql->sql2 = "`name` LIKE '%" . $_GET['name'] . "%'";
}
if (isset($_GET["address"])){
if (!isset($_GET['name'])){
$q = "`address` LIKE '%" . $_GET['address'] . "%'";
} else {
$q = "AND `address` LIKE '%" . $_GET['address'] . "%'";
}
$sql->sql3 = $q;
}
...
...
echo implode(" ", (array) $sql);
?>
所以,现在:
?name=Jari%20Martikainen&address=some%20random%20street
以及
?name=Jari%20Martikainen&address=some%20random%20street&blah=har
和
?address=some%20random%20street&blah=har&name=Jari%20Martikainen
所有的结果都是一样的,但这似乎不是一个非常有效的方法。
3条答案
按热度按时间aamkag611#
这段代码使用一个数组来计算它感兴趣的参数,并构建一个where子句数组。
我使用
"name" => "name"
在这个数组中($correctOrder
)它允许参数名和列名不同。您应该在这里添加任何需要的参数。另外,这段代码使用绑定变量,不确定您使用的是什么风格的数据库访问,但是您可以传递
$data
数组到execute
把他们绑起来。这个
count($where) > 0
零件将只添加where
子句中添加了一些内容,并且内爆添加了适当的and
就像胶水一样。根据测试数据。。。
这只适用于字符串,但您可以为其他数据字段添加特定代码,并将子句添加到
$where
在到达生成语句的最后一部分之前。kx1ctssn2#
这比你要求的要大一点。
首先,以1=1开始where子句,然后遍历搜索词数组,如果$u get数组中包含where子句,则扩展where子句。
其次,我将使用一个pdo对象连接到数据库,然后绑定$\u get值。这将有助于保护您免受sql注入/黑客攻击。
下面,我循环浏览您的搜索词,如果$\u get数组中有内容,则将它们保存到名为$sqlparams的数组中。然后循环使用$sqlparams并绑定这些值。
hc2pp10m3#
构建阵列(
$ands
)属于和子句,但没有“and”。然后生成查询:
我发现这个模式很简单,干净,避免了像这样的混乱
1=1
或者去掉多余的AND
.