如何使用下划线(_)替换URL中的空格?
$query = mysql_query("SELECT * FROM users WHERE username = '$_GET[user]'");
但如果用户在其用户名中有空格,我想用下划线替换空格。 所以profile.php?user = John Johnson的网址是profile.php?user = John_Johnson。
我该怎么做?
谢谢!
答案 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注入的内容。以下是一些介绍:
答案 8 :(得分:0)
您可能需要查看preg_replace()并将所有“”替换为“_”,如下所示:
$result = preg_replace("\s", "_", $_GET['user']);
但是你不应该将用户输入直接放入这样的查询中。看看PHP输入敏感度。
编辑:抱歉忘了正则表达式要求\ s表示空格。
答案 9 :(得分:0)
代码:
$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");}
把它放在配置
中