用下划线替换URL中的空格

时间:2009-02-24 18:46:13

标签: php sql

如何使用下划线(_)替换URL中的空格?

$query = mysql_query("SELECT * FROM users WHERE username = '$_GET[user]'");

但如果用户在其用户名中有空格,我想用下划线替换空格。 所以profile.php?user = John Johnson的网址是profile.php?user = John_Johnson。

我该怎么做?

谢谢!

11 个答案:

答案 0 :(得分:13)

正如其他地方所提到的,str_replace会做你特别想要的,但是......

我更担心profile.php?user=John' DROP DATABASE--

不要构建这样的查询。 EVER。请参阅SQL Injection了解原因。请查看this article以获得正确的方法。

哦,a comic用作记忆辅助工具来强化你永远不应该这样做。

编辑:回复您的回复(您最好编辑原始问题,这样很明显您正在澄清您的问题)。如果您将用户“John Johnson”存储在数据库中,但您想使用URL profile.php?user=John_Johnson访问他,则需要撤消您正在执行的替换:

 $user  = str_replace('_', ' ', $_GET['user']);
 $user  = mysql_escape_string($user);
 $query = mysql_query("SELECT * FROM users WHERE username = '$user'");

 // finns inte användaren så skriver vi ut ett felmeddelande
 if (!mysql_num_rows($query)) exit('<p>The user you are looking for appears to be          missing.</p>');

这将需要profile.php?user=John_Johnson并生成sql查询:SELECT * FROM users WHERE username = 'John Johnson'

您回复的示例代码将使用profile.php?user=John Johnson并生成sql查询:SELECT * FROM users WHERE username = 'John_Johnson'我怀疑它与您想要的相反。

但同样,我强烈建议您查看准备好的陈述。 mysql_escape_string实际上是一种权宜之计。所需要的只是忘记使用它一次,你已经打开了你的网站黑客。

答案 1 :(得分:3)

不要从未经检查的用户输入创建SQL字符串。

至少在第一眼看到mysql_escape_string() to avoid being hacked

$user  = str_replace(' ', '_', $_GET[user]);
$user  = mysql_escape_string($user);
$query = mysql_query("SELECT * FROM users WHERE username = '$user'");

答案 2 :(得分:3)

由于您不需要使用正则表达式来执行此替换,因此您应该避免使用它们,因为它们会产生很大的开销。

此外,由于你只是在字符而不是字符串之后,你应该选择为字符到字符映射编写的函数:strtr()

$result = strtr($original, " ", "_");

答案 3 :(得分:2)

答案 4 :(得分:2)

像这样使用str_replace()

$query = mysql_query("SELECT * FROM users WHERE username = 'str_replace(' ', '_',$_GET[user])'");

答案 5 :(得分:1)

您可以使用str_replace或strtr在实际变量中替换它。 Strtr通常表现得更快。

$newUsername = strtr($_GET['user'], ' ', '_');

应该这样做,以及你的新查询:

$query = mysql_query("SELECT * FROM users WHERE username = '$newUsername'");

答案 6 :(得分:1)

比夫,

试试这个:

$user = urldecode($_GET['user']);

$user现在包含'John Smith'而不是'John%20Smith',我认为这是查询失败的原因。

$user = mysql_escape_string($user);
$query = mysql_query("SELECT * FROM users WHERE username = $user");

您的问题似乎与URL编码字符阻止匹配。希望有所帮助。

答案 7 :(得分:0)

您正在寻找str_replace功能。 (还有一些其他选择,但str_replace对于这种情况就足够了)

$query = mysql_query("SELECT * FROM users WHERE username = '" . str_replace(' ', '_', $_GET[user] . "'");

警告:您应该认真阅读有关SQL注入的内容。以下是一些介绍:

http://sk.php.net/security.database.sql-injection

答案 8 :(得分:0)

您可能需要查看preg_replace()并将所有“”替换为“_”,如下所示:

$result = preg_replace("\s", "_", $_GET['user']);

但是你不应该将用户输入直接放入这样的查询中。看看PHP输入敏感度。

编辑:抱歉忘了正则表达式要求\ s表示空格。

答案 9 :(得分:0)

很奇怪你的代码似乎都不起作用...... 我在数据库中有一个名为John Johnson的用户。它适用于没有空间的那些。

代码:

     $user  = str_replace(' ', '_', $_GET['user']);
     $user  = mysql_escape_string($user);
     $query = mysql_query("SELECT * FROM users WHERE username = '$user'");

     // finns inte användaren så skriver vi ut ett felmeddelande
     if (!mysql_num_rows($query)) exit('<p>The user you are looking for appears to be          missing.</p>');

答案 10 :(得分:0)

$path = "your website and the path here"; // like http://stackoverflow.com/index.php?id=1
$page = $_SERVER["QUERY_STRING"];
if(stristr($page, ' ')) {
    $page = str_replace(" ","_" , $page);
    $page = str_replace("%20%","_" , $page);
    $page = str_replace("%20","_" , $page);
    $page = str_replace("q=","" , $page);
    echo "<meta http-equiv=\"refresh\" content=\"0; url=$path/$page\" />";
    die();
}

如果你有像website.com/index.phphdsdhdh这样的页面 你应该删除这一行

$page = str_replace("q=","" , $page);

如果你想停止sql注入,你可以使用

addslashes();

或使用此功能

$page = strtolower($_SERVER["QUERY_STRING"]); if(stristr($page, 'union' or stristr($page, 'and' or stristr($page, 'or' or stristr($page, 'select'){ die("sql injection attack");}

把它放在配置