Заменить пробелы в URL-адресе подчеркиванием
Как заменить пробелы в URL-адресе подчеркиванием (_)?
$query = mysql_query("SELECT * FROM users WHERE username = '$_GET[user]'");
Но если в имени пользователя есть пробел, я хочу заменить пробел подчеркиванием. Таким образом, URL-адрес для profile.php? User = John Johnson будет profile.php? User = John_Johnson.
Как я могу это сделать?
Спасибо!
Ответов (11)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 - это то, что вы ищете. (Есть и другие альтернативы, но в этом случае достаточно str_replace)
$query = mysql_query("SELECT * FROM users WHERE username = '" . str_replace(' ', '_', $_GET[user] . "'");
ВНИМАНИЕ! Вам следует серьезно прочитать что-нибудь о SQL-инъекции. Вот введение:
Вы можете посмотреть на preg_replace () и заменить все "" на "_" следующим образом:
$result = preg_replace("\s", "_", $_GET['user']);
Но вы не должны помещать вводимые пользователем данные непосредственно в такой запрос. Изучите сенсибилизацию ввода PHP.
РЕДАКТИРОВАТЬ: Извините, забыл, что регулярное выражение требует \ s для обозначения пробела.
Поскольку для этой замены регулярные выражения не требуются, их следует избегать, поскольку они связаны со значительными накладными расходами.
Кроме того, поскольку вам нужны только символы, а не строки, вам следует использовать функцию, написанную для преобразования символов в символы: strtr ()
$result = strtr($original, " ", "_");