我有一个页面project.php
。我试图实施slu ..所以假设我有一个名为A Project
的数据库条目,而slug是a-project
。这是PHP代码
$slug = $_GET['name'];
try {
$sql = "SELECT id FROM projects WHERE slug = '" . $slug . "' AND display = 1";
$s = $pdo->prepare($sql);
$s->execute();
} catch(PDOException $e) {
die("Failed to run query: " . $e->getMessage());
}
这很有效。但是,当我决定在.htaccess中添加重写规则时,如此:
RewriteRule ^projects/([0-9a-zA-Z]+) project.php?name=$1 [NC,L]
结果如下:
Failed to run query: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
回显查询返回SELECT id FROM projects WHERE slug = 'a' AND display = 1
,当在phpMyAdmin中运行时,正常,因为它没有重写规则就可以正常运行。
使用var_dump($_GET);
返回array(1) { ["name"]=> string(1) "a" }
这只发生在多字段上,如果项目的slug只是project
它可以工作
为什么我的重写规则在第一个单词后破坏了slug并破坏了我的查询,我该如何修复它?
答案 0 :(得分:0)
([0-9a-zA-Z]+)
匹配0到9之间的所有字符,a和z以及A和Z.您会注意到-
字符不在它们之间。由于用于slug的路径段很可能不会用于其他任何内容,因此请考虑将其与([^/]+)
匹配。这将匹配到下一个/
。
RewriteRule ^projects/([^/]+) project.php?name=$1 [NC,L]
如法比奥所述:请使用准备好的陈述。您当前的代码是对SQL注入开放的。如果您学习如何正确使用预准备语句,您再也不用担心导致sql注入的外部输入。