2009-02-26 9 views
1

J'ai mis mes champs de base de données "nom d'utilisateur" et "email" à unquie, en utilisant le code ci-dessous cela ne fonctionne que si le "nom d'utilisateur" existe déjà, une erreur est alors répercutée. Si l'email existe, l'utilisateur reçoit une erreur de doublon mysql, quand la même erreur que ci-dessus devrait être montrée.dupliquer les entrées mysql et 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>"; 
} 
? 

Merci

+0

Veuillez modifier votre code afin qu'il ne soit pas trop vulnérable à l'injection SQL. Voir ce sujet, entre autres. http://stackoverflow.com/questions/1973/what-is-the-best-way-to-avoid-sql-injection-attacks – Kibbee

Répondre

3

Essayez de changer

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

à

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

Modifier: J'essaie de deviner ce que vous essayez de faire ici. D'après votre description, il semble que vous souhaitiez que le nom d'utilisateur ou l'e-mail soit unique et que vous disposiez de deux index uniques distincts sur ces colonnes. Votre code vérifie que la combinaison du nom d'utilisateur et du courrier électronique est unique.

Edit 2: Aussi, je pense que vous voudrez peut-être se pencher sur les concepts de SQL Injection et Concurrency.

+0

Merci beaucoup qui fonctionne bien maintenant =) –

+0

aussi il n'y a pas besoin de faire SELECT nom d'utilisateur ET email ... juste faire SELECT 1 (faire sélectionner nom d'utilisateur ET email n'a aucun sens) – tehvan

+0

... et s'il vous plaît upvote cette réponse si elle vous a aidé – tehvan

1

Passez à une clause OR dans votre instruction WHERE au lieu de AND. En outre, N'utilisez PAS les valeurs données dans $ _POST (ou $ _GET et $ _REQUEST d'ailleurs) sans vous assurer qu'elles sont sécurisées. Que se passerait-il si j'y envoyais un nom d'utilisateur avec SQL?

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

Assurez-vous de l'aide add_slashes() ou un processus similaire à nettoyer les données avant de les envoyer à la base de données.

+0

Merci pour le rappel Jus ajouté: $ username = stripslashes ($ username); $ password = stripslashes ($ mot de passe); $ username = mysql_real_escape_string ($ nom d'utilisateur); $ password = mysql_real_escape_string ($ mot de passe); Ça devrait aller? –

+0

Selon les détails, l'essentiel est d'utiliser mysql_real_escape_string() sur n'importe quel texte. Le mot de passe md5() sur le mot de passe devrait être correct puisque MD5 ne renvoie jamais de texte qui pose problème. Je teste généralement les nombres avec is_numeric() pour m'assurer qu'ils fonctionneront. Les stripslashes() sont parfois utiles. – acrosman