2009-02-26 29 views
1

"Kullanıcı adı" ve "e-posta" veritabanı alanlarını belirsiz bırakmak için ayarladım, bunun altında aşağıdaki kodu kullanırken sadece "kullanıcı adı" zaten mevcutsa, bir hata daha sonra yankılanır. E-posta mevcutsa, yukarıdaki gibi aynı hata gösterildiğinde, kullanıcı bir mysql yinelenen hatası alır.yinelenen girişler mysql ve php

<?php 

require_once ('connection.php'); 

$username=$_POST['username']; 
$password=md5($_POST['password']); 
$email=($_POST['email']); 
$ip=$_SERVER['REMOTE_ADDR']; 
session_start(); 

$query = "INSERT INTO users (username, password, email, rank, ip, active) VALUES  ('$username','$password', '$email', '1', '$ip', '0')"; 

$sql = "SELECT username AND email FROM users WHERE username = '$username' AND email  = '$email'" ; 
$result=mysql_query($sql); 
$count=mysql_num_rows($result); 
$row = mysql_fetch_array($result); 

if ($count== 0) 
{ 
if (!mysql_query($query)) 
{ 
die('Error: ' . mysql_error()); 
} 
    echo "You are signed up, please follow the link on your email to active your  account."; 
} 
else 
{ 
    echo "Username or Email already exists"."<br><a href=\"sign_up.php\">Try Again</a></br>"; 
} 
? 

Teşekkür

+0

Lütfen kodunuzu değiştirin, böylece sql enjeksiyonuna karşı savunmasız değildir. Diğerleri arasında bu konuya bakın. http://stackoverflow.com/questions/1973/what-is-the-best-way-to-avoid-sql-injection-attacks – Kibbee

cevap

3

WHERE username = '$username' OR email  = '$email'" 

yanındaki Düzenle

WHERE username = '$username' AND email  = '$email'" 

anahtarlama deneyin: Burada yapmaya çalıştığımız şey tahmin etmeye çalışıyorum. Açıklamanızdan, kullanıcı adı veya e-postanın benzersiz olmasını ve bu sütunlarda iki ayrı benzersiz dizininiz olmasını istersiniz. Kodunuz, kullanıcı adı ve e-postanın birleşiminin benzersiz olup olmadığını kontrol eder.

Düzenleme 2: Ayrıca, ben size SQL Injection ve Concurrency kavramları içine bakmak isteyebilirsiniz düşünüyorum.

+0

Şimdilik çok iyi çalıştığınız için teşekkürler =) –

+0

Ayrıca SEÇ kullanıcı adını SE yapmaya gerek yok VE e-posta ... sadece SELECT 1 yapın (select kullanıcı adı ve e-posta herhangi bir anlam ifade etmez) – tehvan

+0

... ve lütfen bu cevabı onaylayın – tehvan

1

VEYA yerine WHERE deyiminde bir OR yan tümcesine geçin. Ayrıca, güvenli olduklarından emin olmadan, $ _POST (veya $ _GET ve $ _REQUEST) için verilen değerleri KULLANMAYIN. İçinde SQL ile bir kullanıcı adı gönderirsem ne olur?

','','','','',''); DELETE FROM users; 

Veritabanına göndermeden önce verileri temizlemek için add_slashes() veya benzeri bir işlem kullandığınızdan emin olun.

+0

Hatırlatıcı için teşekkürler Jus eklendi: $ username = stripslashes ($ username); $ password = stripslashes ($ password); $ username = mysql_real_escape_string ($ kullanıcı adı); $ password = mysql_real_escape_string ($ şifre); İyi olmalı mı? –

+0

Ayrıntılara bağlı olarak, ana şey herhangi bir metinde mysql_real_escape_string() kullanmaktır. MD5 asla bir sorun olan metni döndürmediğinden, paroladaki md5() iyi olmalıdır. Çalışacaklarından emin olmak için genellikle is_numeric() ile sayıları test ederim. Stripslashes() bazen yararlıdır. – acrosman