Nasıl bir tablo bir dize zaten kullanımda olup olmadığını görmek için kontrol edebilirim?

5 Cevap php

Ben dize zaten orada olmadığını görmek benim userdb tabloda benim adınızı kolon (adı birincil) denetlemek için bu kodu kullanıyorum. Orada değilse o benim tablo adı sütuna bir önceki formdan girilen dize ekler. O zaman orada Ama eğer "(kullanıcı adı) zaten kullanılıyor!" Diyor.

Bu ben önceki forma Sam girdiklerinde böyle "Sam" olarak adı sütununda bir giriş koymak ve çalışır. Ben adı sütununda "Sam" ve sonra önceki forma tüm küçük ile sam girerseniz Ama anahtar için 1 Yinelenen giriş 'Sam' görüntüler.

Ben sadece dize olursa olsun ben bir önceki forma girmek kasanın ne tür zaten kullanımda olduğunu söylemek istiyorum.

$result = mysql_query("SELECT username FROM userdb") or die(mysql_error()); 
$row = mysql_fetch_array( $result );
$checkuser = $row['username'];

if ( $checkuser == $username ) {
    echo "<font color='red'>" .$username. "<font color='black'> is already in use!";
    die(mysql_error());
} else {
    mysql_query("INSERT INTO userdb (username, password) VALUES('$username', '$password' ) ") or die(mysql_error());;
    echo "Data Inserted!";
}

5 Cevap

Bu yarış koşullarına yol açabilir çünkü bu şekilde yapmak gerekir. Bu sizin kontrol ve ekleme arasında, başkası tabloya bu kullanıcı adını ekler, ne olur bu.

Bunu yapmak için doğru yolu adı üzerinde bir birincil anahtar ve bir istisna ya da hata kodu DBMS dönen alıcı, kayıt eklemek olduğunu.

Adı var zaten, tekrar takılı olmayacak ve hata yakalayacağız.

Orada değilse, o eklenir ve bir hata alırsınız.

Lütfen muhafaza sorunu açısından, tüm kullanıcı adları ekleme veya denetlemeden önce küçük harfe dönüştürmek istiyorum, ya tüm kontrolleri karışık durumda sürümü ve küçük harf DB kopyalama ve yerel kopyası hem yerleştirin.

Kodu değiştirin:

strtolower($checkuser) == strtolower($username)
$result = mysql_query("SELECT count(*) FROM userdb where UCASE(username)=UCASE($checkuser);"

Sonucu satır sayısını kontrol edin.

Pseudocode:

If num_rows>0
    Username exists;

Kısa cevap:

Eğer kullanıcı adları küçük harf duyarsız olmasını istiyorsanız, bir harf duyarsız bir şekilde veritabanında bunları saklamak gerekir. Her şeyden önce düşük durumda (veya tüm üst durumda) için verilen kullanıcı adı dönüştürün.

$lcusername = strtolower($username);

Eğer verilen kodu $ adınızı kullanın Daha sonra her yerde $ lcusername kullanın.

Uzun cevap:

Bir tablo içinde bir anahtar öncesi varlığını kontrol gerekmez. Eğer kullanıcı adı alanında bir PRIMARY KEY nitelik varsayarsak, sadece (-küçük harfe dönüştürdükten sonra) tabloya veri çalışın. Veritabanı "yinelenen anahtar" hatası verir ise, kullanıcı adı zaten var ve hata iletisi görüntüler biliyorum. Veritabanı başarıyla (belki mysql_affected_rows işlevini kullanarak) satır eklenen olduğunu döndürür. Bu büyük ölçüde kod basitleştirilmesi, INSERT yapmadan önce bir SELECT yapmak zorunda sizi kurtarır.

Ayrıca olası güvenlik açıklarını önlemek yardımcı tabloya ekleme olacak tüm dizeleri kaçmak gerekir.

$lcusername = strtolower($username);

// Escape strings
$esclcusername = mysql_real_escape_string($lcusername);
$escpassword = mysql_real_escape_string($password);

mysql_query("INSERT INTO userdb (username, password) VALUES('$esclcusername', '$escpassword') ");
if (mysql_affected_rows() == -1) {
    // Display error message
} elseif (mysql_affected_rows() == 1) {
    // Yay! Insert successful
} else {
    // Affected rows is 0. Something went wrong
}

Bu doğru yapmak ve yarış koşulları önlemek için tek yol * kullanıcının verilerini eklemek ve hata yinelenen bir anahtar hatası olup olmadığını görmek için herhangi bir hataları incelemek için bir girişimdir. Eğer PDO kullanarak olsaydı bunu yakalamak ve incelemek verebilecek bir istisna olurdu (olmalıdır). Ben sadece ne kadar emin değilim, hala can tuzak ve PHP'nin standart hata işleme kullanarak hataları incelemek düşünüyorum.

* Burada yarış durumu şudur:

  1. Kullanıcı adı benzersiz kontrol, öyle.
  2. Başka bir kullanıcı adı ile bir hesap oluşturur
  3. Sen artık bir hataya neden özgün kullanıcı, aynı kullanıcı adına sahip bir hesap oluşturmak için çalışır.