2010-12-13 8 views
0

J'ai un script qui est censé collecter des données d'un champ "UserID" dans ma table sql, soumettre toutes les données dans un tableau, puis comparer une variable à ce qui est dans le tableau. Si la valeur de la variable est déjà dans le tableau, dites à l'utilisateur que cette valeur est invalide.Formatage de la sortie du tableau à l'aide de la fonction foreach

$sql = "SELECT *" //User info 
    . " FROM Users" ; 
$result = mysql_query($sql); 
//insert where line for assessorid 


$users = array(); 

while(($user = mysql_fetch_assoc($result))) { 
$users[] = $user; 
} 

foreach($users as $user){ 
$user['UserID']; 
} 

J'ai besoin de la sortie des utilisateurs $ équivalent à array ('user1', 'utilisateur2', 'user3'); Ce qui se passe, c'est que les données proviennent d'un formulaire en $ user_name. Je veux utiliser dans une déclaration comme suit:

if(in_array($user_name,$users)){ 
    echo "username available" 
} 
else{ 
    echo "not available"} 

J'ai essayé d'utiliser la fonction d'extraction, mais tout simplement créé un grand désordre. Je ne sais pas ce qui est incorrect à propos de ce que je fais, à moins que le format de $ users en tant que tableau ne puisse être analysé dans la fonction in_array() telle qu'elle est actuellement formatée. Tout conseil est fort apprécié. Merci!

Répondre

0

Peut-être que je manque quelque chose ... Pourquoi ne pas le faire comme ceci:

SELECT UserID FROM Users WHERE Username = 'username' 

Ensuite, il suffit d'utiliser mysql_num_rows() pour vérifier si le nom d'utilisateur existe déjà ou non. Cela devrait être à la fois plus rapide et plus efficace (sur le plan de la mémoire).

1
$sql = "SELECT USERID FROM Users" ; 

$result = mysql_query($sql); 

$users = array(); 

while(($user = mysql_fetch_assoc($result))) { 
$users[] = $user['USERID']; 
} 

Lorsque vous dites

$users[] = $user; 

Vous ne spécifiez pas quelle colonne dans le jeu de résultats doit être annexée au tableau.

0

Dans ce cas, vous collectez toutes les données de la base de données et vous devez également effectuer un traitement inefficace en PHP. Il est préférable d'interroger pour cette valeur pour voir si elle est dans la base de données,:

$username = mysql_real_escape_string($username); 
$query = " 
    select 
    count('x') as usercount 
    from 
    users u 
    where 
    u.username = '$username'"; 

La, si le « userCount » est 0, le nom d'utilisateur n'existe pas. Si> 0, le nom d'utilisateur existe. De cette façon, vous laissez la base de données faire le travail pour lequel elle est conçue, et la seule valeur réellement récupérée est ce nombre unique.

0

Avez-vous essayé de modifier votre requête? Actuellement, vous obtenez toutes les valeurs pour chaque utilisateur, mais vous venez de voir besoin de UserID. Vous pouvez le faire:

$sql = "SELECT UserID FROM Users"; 
$result = mysql_query($sql); 

$users = array(); 

while(($user = mysql_fetch_assoc($result))) 
{ 
    $users[] = $user['UserID']; 
} 

// ... 
if (in_array($user_name, $users)) 
{ 
    echo 'Username not available'; 
} 
else 
{ 
    echo 'Username available'; 
} 

Ou vous pouvez simplement rechercher dans la base de données pour le nom d'utilisateur donné:

$sql = 'SELECT count(*) FROM Users WHERE UserID = '.mysql_escape_string($user_name); 
$result = mysql_query($sql); 

// and then just check if the resulting row is equal to 0 
0

Avez-vous essayé d'écrire un script qui va vérifier si un nom d'utilisateur est pris?

Si tel est le cas, il peut être plus facile (et plus efficace) de structurer la requête réelle vers cette fin plutôt que de s'appuyer sur l'approche programmatique.

$sql = "SELECT COUNT(*) FROM Users WHERE Username = '$username'"; 

Ensuite, vous pouvez appliquer ce résultat à un compte et permettre à l'utilisateur d'enregistrer ou non en fonction de si une valeur supérieure à zéro (un utilisateur a déjà pris ce nom) ou non (son libre) est retourné.

+0

Bien sûr, vous ne devriez jamais mettre $ username inaperçu dans votre SQL, sauf si vous êtes impatient de savoir ce que les autres pourraient faire pour votre site avec injection SQL. –

+0

Bien sûr - Je donne ceci simplement comme un exemple de la requête COUNT car l'OP semble ne pas le savoir. Cela ne sera jamais utilisé pour insérer ou valider un identifiant. J'utilise généralement PDO dans tous les accès à la base de données pour aider à la preuve contre cela aussi bien. – DeaconDesperado

0

Comme cela a été mentionné, c'est un moyen plutôt inefficace de vérifier un nom d'utilisateur existant. Les suggestions pour modifier votre requête sont de bons conseils.

Cependant, pour faire face au problème avec le code que vous avez fourni:

in_array() ne sera pas détecter la présence d'une valeur dans un tableau multidimensionnel. Votre tableau $users ressemble probablement quelque chose comme ceci:

$users = array(
    array('userID', 'foo', 'bar'), 
    array('userID', 'foo', 'bar'), 
    array('userID', 'foo', 'bar') 
) 

et in_array ne recherche pas en dessous du premier ensemble d'indices. Si c'est vraiment ce que vous voulez faire, voir cette question: in_array() and multidimensional array