Slugs在第一个字后打破了

时间:2014-08-31 12:43:25

标签: php mysql .htaccess mod-rewrite

我有一个页面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并破坏了我的查询,我该如何修复它?

1 个答案:

答案 0 :(得分:0)

([0-9a-zA-Z]+)匹配0到9之间的所有字符,a和z以及A和Z.您会注意到-字符不在它们之间。由于用于slug的路径段很可能不会用于其他任何内容,因此请考虑将其与([^/]+)匹配。这将匹配到下一个/

RewriteRule ^projects/([^/]+) project.php?name=$1 [NC,L]

如法比奥所述:请使用准备好的陈述。您当前的代码是对SQL注入开放的。如果您学习如何正确使用预准备语句,您再也不用担心导致sql注入的外部输入。