-1

我正在为使用 PDO 的搜索功能使用准备好的语句,并且我正在使用 like 子句。mysql是5.5.32

function dblink(){
    # hidden #
    $conn = new PDO("mysql:host=localhost;dbname=$database", 
     $username, $password,  array(
     PDO::ATTR_PERSISTENT => true, 
     PDO::ATTR_EMULATE_PREPARES => false, 
     PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
     PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ
    ));
    return $conn;
}

$conn    = dblink();
$query   = "select * from tablename where attrib like ? ;";
$stmt    = $conn->prepare($query);

$stmt->execute(array($_POST['field']."%"));

$results = $stmt->fetchAll(PDO::FETCH_OBJ);

当用户在 html 表单中输入 % for field 时,这会转储所有表格内容。我认为准备好的语句会处理它,并且执行中有 % 以便它与输入的子字符串匹配。

如何仅将 POST 字段用作普通文本,以免引起此类问题?

4

1 回答 1

1

当用户在 html 表单中输入 % for field 时,这会转储所有表格内容。

是的。这就是 LIKE 运算符的确切目的。
不,它与准备好的声明无关。后者用于格式化您的数据,而不是干扰查询逻辑。

如果您不喜欢代码的工作方式,请更改它。但目前它的工作方式与您的编码方式完全相同,没有任何缺陷。

于 2013-07-15T19:16:14.410 回答