php mysql获取代码审阅

ny6fqffe  于 2021-06-25  发布在  Mysql
关注(0)|答案(3)|浏览(396)

我认为这是一个很简单的问题。这是我的最佳选择还是有一个“正确的”方法?

<?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

所有的结果都是一样的,但这似乎不是一个非常有效的方法。

aamkag61

aamkag611#

这段代码使用一个数组来计算它感兴趣的参数,并构建一个where子句数组。
我使用 "name" => "name" 在这个数组中( $correctOrder )它允许参数名和列名不同。您应该在这里添加任何需要的参数。
另外,这段代码使用绑定变量,不确定您使用的是什么风格的数据库访问,但是您可以传递 $data 数组到 execute 把他们绑起来。

$correctOrder = array("name" => "name", "address" => "address");

$_GET = [ 'name' => 'name1', 'address' => 'add'];

$where = [];
$data = [];
foreach ( $_GET as $paramName => $param ) {
    if ( isset($correctOrder[$paramName]) ) {
        $where[] = "`{$correctOrder[$paramName]}` like ? ";
        $data[] = '%'.$param.'%';
    }
}

$sql = "SELECT * FROM `pickups`";
if ( count($where) > 0 ){
    $sql .= " WHERE ".implode( " and ", $where);
}

echo $sql.PHP_EOL;
print_r($data);

这个 count($where) > 0 零件将只添加 where 子句中添加了一些内容,并且内爆添加了适当的 and 就像胶水一样。
根据测试数据。。。

SELECT * FROM `pickups` WHERE `name` like ?  and `address` like ? 
Array
(
    [0] => %name1%
    [1] => %add%
)

这只适用于字符串,但您可以为其他数据字段添加特定代码,并将子句添加到 $where 在到达生成语句的最后一部分之前。

kx1ctssn

kx1ctssn2#

这比你要求的要大一点。
首先,以1=1开始where子句,然后遍历搜索词数组,如果$u get数组中包含where子句,则扩展where子句。
其次,我将使用一个pdo对象连接到数据库,然后绑定$\u get值。这将有助于保护您免受sql注入/黑客攻击。
下面,我循环浏览您的搜索词,如果$\u get数组中有内容,则将它们保存到名为$sqlparams的数组中。然后循环使用$sqlparams并绑定这些值。

// connect to database via PDO
try {
    $db = new PDO($dsn, $username, $password, $options);    
} catch (PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage();
}

$correctOrder = array("name", "address", "phone", "starttime", "endtime", 
                "status", "details");  

$sql = "SELECT * FROM `pickups` WHERE 1=1 ";  

// check the $_GET array, build SQL, remember values in $sqlParams
$sqlParams = [];
foreach ($correctOrder as $key) {
    if (isset($_GET[$key])) {
        $sql .= "and `$key` LIKE :$key ";
        $sqlParams[":$key"] = "%{$_GET[$key]}%";
    }
}

// bind values from $sqlParams into SQL statement
$stmt = $db->prepare($sql);
foreach ($sqlParams as $key => &$value) {
    $stmt->bindParam($key, $value);
}

// execute SQL statement, catching exception
try {
    $stmt->execute();
} catch (PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage();
}

// cycle through results and do stuff
while ($row = $stmt->fetch()) {
    print_r($row);
}
hc2pp10m

hc2pp10m3#

构建阵列( $ands )属于和子句,但没有“and”。

$ands = array();
if (...)
    $ands[] = "name LIKE ...";
if (...)
    $ands[] = "address LIKE ...";
...

然后生成查询:

$query = "SELECT ... WHERE " . implode(' AND ', $ands);

我发现这个模式很简单,干净,避免了像这样的混乱 1=1 或者去掉多余的 AND .

相关问题