-1

我正在使用 MySQL 来执行查询:

public function query($query, $params = array(), $format = array()) {

    if ( !is_array( $params ) ) return false;

    $dbh = parent::$dbh;

    if ( empty($dbh) ) return false;

    $stmt = $dbh->prepare($query);

    if ( !empty($format)) {
        $values = array_values($params);
        foreach ( $format as $key => $bind ) {
            switch ($bind) {
                case '%d':
                    $stmt->bindValue($key + 1, $values[$key], PDO::PARAM_INT);
                    break;
                case '%s':
                    $stmt->bindValue($key + 1, $values[$key], PDO::PARAM_STR);
                    break;
                default:
                    $stmt->bindValue($key + 1, $values[$key], PDO::PARAM_STR);
                    break;
            }

        }
    }

    $stmt->execute($params);

    return $stmt;

}

如何安全地从使用 LIKE 的搜索中删除无效字符:

例如:

 $filter = "filter's";

 if (isset($filter)) {
    $search_filter = 'content LIKE \'%'.$filter.'%\'';

    $sql = "SELECT $search_filter FROM  messages";

    $stmt = $this->query($sql);
}
4

2 回答 2

2

我不确定我是否遵循您的复杂代码,但类似这样

$filter = "filter's";

$params = array();
$sql = "SELECT * FROM messages";
if (isset($filter)) {
    $sql .= ' WHERE content LIKE ?';
    $params[] = "%$filter%";
} 
$stmt = $this->query($sql, $params);

这个想法是动态地创建一个带有占位符的查询,但让所有可变部分仅通过占位符进行。

于 2013-07-17T16:25:52.650 回答
1

最简单的方法是使用 PDO::quote

更改 $search_field 的分配

$search_filter = 'content like '.$dbh->quote("%".$filter."%");

如果你想转移到参数化查询,你会做

$sql = "select * from messages where content like ?";
$params = "%".$filter."%";
$stmt = $dbh->prepare($sql);
$stmt->execute($params);
于 2013-07-17T16:56:28.713 回答