我正在使用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);
}
答案 0 :(得分:2)
我不确定我是否遵循了复杂的代码,但是这样的话
$filter = "filter's";
$params = array();
$sql = "SELECT * FROM messages";
if (isset($filter)) {
$sql .= ' WHERE content LIKE ?';
$params[] = "%$filter%";
}
$stmt = $this->query($sql, $params);
我们的想法是动态地创建一个包含占位符的查询,但保留所有可变部分仅通过占位符。
答案 1 :(得分: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);