Заменить пробелы в URL-адресе подчеркиванием

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

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

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

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

Спасибо!

Ответов (11)

Используйте str_replace () следующим образом:

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

Бифф,

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

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

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

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

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

$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.phdsdhdh, вы должны удалить эту строку

$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");}

поместите это в конфиг

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

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

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

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

Код:

     $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>');

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

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

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

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

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

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

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

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

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

str_replace?

Функция 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

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

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

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

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

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

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

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