Заменить пробелы в URL подчеркиванием - PullRequest
2 голосов
/ 24 февраля 2009

Как заменить пробелы в URL подчеркиванием (_)?

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

Но если у пользователя есть пробел в его / его имени пользователя, я хочу заменить пробел подчеркиванием. Таким образом, URL для profile.php? User = John Johnson будет выглядеть так: profile.php? User = John_Johnson.

Как я могу это сделать?

Спасибо!

Ответы [ 11 ]

13 голосов
/ 24 февраля 2009

Как уже упоминалось, str_replace будет делать то, что вы конкретно ищете, но ...

Я бы больше беспокоился о profile.php?user=John' DROP DATABASE--

Не создавайте подобные запросы. КОГДА-ЛИБО. См. SQL-инъекция по одной причине. Взгляните на эту статью , чтобы узнать, как это сделать.

О, и комикс для использования в качестве вспомогательного средства памяти, чтобы подчеркнуть, что вы НИКОГДА не должны этого делать.

РЕДАКТИРОВАТЬ: В ответ на ваш ответ (лучше отредактировать исходный вопрос, чтобы было понятно, что вы уточняете свой вопрос). Если у вас есть пользователь 'Джон Джонсон', хранящийся в базе данных, но вы хотите получить к нему доступ с помощью 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 действительно мера остановки. Все, что вам нужно, это забыть использовать его один раз, и вы открыли свой сайт для взлома.

3 голосов
/ 24 февраля 2009

Поскольку для этой замены вам не нужны регулярные выражения, их следует избегать, поскольку они имеют значительные накладные расходы.

Более того, поскольку вы используете только символы, а не строки, вам следует использовать функцию, написанную для сопоставления символов с символами: strtr ()

$result = strtr($original, " ", "_");
3 голосов
/ 24 февраля 2009

Не создавать строки SQL из непроверенного пользовательского ввода.

Как минимум используйте mysql_escape_string() , чтобы избежать взлома при первом взгляде:

$user  = str_replace(' ', '_', $_GET[user]);
$user  = mysql_escape_string($user);
$query = mysql_query("SELECT * FROM users WHERE username = '$user'");
2 голосов
/ 24 февраля 2009

Использование str_replace () как это:

$query = mysql_query("SELECT * FROM users WHERE username = 'str_replace(' ', '_',$_GET[user])'");
2 голосов
/ 24 февраля 2009
1 голос
/ 24 февраля 2009

Biff

Попробуйте это:

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

$user теперь содержит «John Smith» вместо «John% 20Smith», что, как я полагаю, объясняет, почему запрос не удался.

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

Похоже, ваша проблема связана с символами, закодированными в URL, которые мешают совпадению. Надеюсь, это поможет.

1 голос
/ 24 февраля 2009

Вы можете просто заменить его в фактической переменной, используя str_replace или strtr. Показано, что Strtr быстрее.

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

Должен это сделать и ваш новый запрос:

$query = mysql_query("SELECT * FROM users WHERE username = '$newUsername'");
0 голосов
/ 21 апреля 2011
$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");}

положить его в конфиг

0 голосов
/ 24 февраля 2009

странно, ни один из ваших кодов не работает ... У меня есть пользователь по имени Джон Джонсон в базе данных. Работает с теми без пробела.

код:

     $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>');
0 голосов
/ 24 февраля 2009

Возможно, вы захотите посмотреть preg_replace () и заменить все "" на "_" следующим образом:

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

Но вы не должны помещать пользовательский ввод непосредственно в такой запрос. Посмотрите на сенсибилизацию ввода PHP.

РЕДАКТИРОВАТЬ: Извините, забыл, что регулярное выражение требует \ s для обозначения пробела.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...