Altçizgiyle URL boşluk yerine

11 Cevap php

Nasıl (_) bir çizgi ile URL boşluk değiştirebilirsiniz?

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

But if a user has a space in her/his username I wanna replace the space with an underline. So the URL for profile.php?user=John Johnson would be profile.php?user=John_Johnson.

Bunu nasıl yapabilirim?

Teşekkürler!

11 Cevap

Başka yerlerde de belirtildiği gibi, str_replace size özellikle arıyoruz ne yapacaklar, ama ...

I profile.php?user=John' DROP DATABASE-- konusunda daha endişeli olurdum

Böyle sorguları inşa etmeyin. HİÇ. SQL Injection neden bir nedeni bakın. Bunu yapmak için doğru yolu için this article bir göz atın.

Oh, ve a comic bunu ASLA gerektiğini güçlendirmek için bir hafıza yardımı olarak kullanmak için.

EDIT: yanıt (bu sizin sorunuzu açıklığa kavuşturulması olduğu açıktır böylece sizin özgün soru düzenleyerek daha iyiyiz) yanıt olarak. Eğer kullanıcı varsa 'John Johnson' profile.php?user=John_Johnson, sen yapıyorsun değiştirme ters gerekir veritabanında saklanan, ancak URL ona erişmek istiyorsanız:

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

Bu almak profile.php?user=John_Johnson ve sql sorgu üretecektir: SELECT * FROM users WHERE username = 'John Johnson'

Eğer cevapladı örnek kod profile.php?user=John Johnson almak ve sql sorgu üretmek istiyoruz: ne istediğinizi tam tersi SELECT * FROM users WHERE username = 'John_Johnson' hangi sanıyorum.

Fakat yine de, ben şiddetle hazırlanmış tablolara bakarak tavsiye ederim. mysql_escape_string stop-gap ölçmek gerçekten. Tüm bu alır bir kez kullanmak için unutmak ve hack sitenizi açtık.

Denetlenmeyen kullanıcı girişi SQL dizeleri oluşturmak etmeyin.

En kullanımda mysql_escape_string() to avoid being hacked yumruk görüşte:

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

Bunu değiştirme yapmak için normal ifadeler gerek yok çünkü onlar önemli ek yük beri, bunları kaçınmalısınız.

Sadece karakterler değil dizeleri sonra konum beri Ayrıca, eğer karakter-to-karakteri haritalama için yazılmış fonksiyonu için gitmeli: strtr ()

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

str_replace() bu gibi kullanın:

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

Sadece str_replace veya strtr kullanarak gerçek değişkeni içinde yerini alabilir. Strtr genellikle daha hızlı olduğu gösterilmiştir.

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

Onu, ve yeni bir sorgu yapmalıyım:

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

Biff,

Bu deneyin:

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

$user şimdi sorgu başarısız neden olduğunu varsaymak yerine, 'John% 20Smith' ve 'John Smith' içerir.

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

Senin sorunun URL kodlu karakterleri bir maç önlenmesi ile gibi görünüyor. Umut olur.

str_replace function aradığınız budur. (Orada diğer bazı alternatifler vardır ama str_replace bu durum için yeterli)

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

WARNING: Sen ciddi bir SQL enjeksiyonu hakkında bir şeyler okumalısınız. İşte bazı bir tanıtım:

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

weird none of your codes seem to work... i have a user called John Johnson in the database. It works with the ones without space.

Kodu:

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

Sen preg_replace() bakmak ve _ "gibi pek" ile "tüm" değiştirmek isteyebilirsiniz:

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

Ama böyle bir sorgu doğrudan kullanıcı girişi koyarak edilmemelidir. PHP girdi duyarlılaşma içine bak.

EDIT: Üzgünüm regex \ boşluk anlamına s gerektirir unuttum.

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

If you got the page like website.com/index.phphdsdhdh you should remove this line

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

Eğer sql enjeksiyon durdurmak isterseniz kullanabilirsiniz

addslashes();

veya bu işlevi kullanın

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

config koydum