2009-10-04 11 views
0

Je veux fondamentalement créer un login varchar unique dans une table basée sur un prénom et un nom.Comment créer une fonction qui place une entrée unique dans la table ou la boucle sql?

Alors Jo Blob signe et nous aller:

// check to see if username 'JoBlob' exists.... 

SELECT * FROM special_users WHERE username = $names[0] . $names[1] 

// if it doesn't exist 

    INSERT INTO special_users username= $names[0] . $names[1] 



// BUT if it does exist 

    // add some numbers to the username and insert 

Je suis curieux de savoir comment je peux transformer cela en une fonction pour qu'elle traverserait puis essayer JoBlob1 (si cela existe, alors) JoBlob2 (sauf si cela existe), JoBlob3 etc etc et dans l'infini? J'ai quelques idées mais elles semblent excessivement longues.

Comment dois-je aborder cette question?

Répondre

1

Exactement ce que demande -

 
insert into special_users (username) select concat('Joe',(select count(0) from special_users where username like 'Joe%')); 

mais votre algorithme très mauvais à mon point de vue

+0

solution très simple mais élégante dans tous les sens, sauf la capture du nom d'utilisateur réel inséré – robjmills

0

Eh bien, la solution est laide sera d'utiliser count (nouvel utilisateur name.family) et ajouter la liste spéciale name.family + le résultat +1 (traduit en CHAR bien sûr)

je viens d'utiliser un générateur de chaîne aléatoire, moins lisible, mais fais le travail pour moi.

+0

N'utilisez pas de code qui obtient l'ID, puis insérez-le avec cet ID dans un environnement multi-utilisateur. Et chaîne aléatoire ne garantit pas le résultat unique –

1

Le code suivant décrit la procédure générale - il n'y a pas de traitement d'erreur, ce qui reste à l'OP:

/** 
* @param array $names 
* @param PDO $db 
* @return array|false -- false on error and an array(
*  'id'  => auto-increment-id 
*  'username' => the username inserted 
*) 
*/ 
function addUser(array $names, PDO $db) // $db is the PDO-resource, that's the DB connection handle 
{ 
    $searchStmt = $db->prepare('SELECT COUNT(*) FROM special_users WHERE username = :username'); 
    $count = 0; 
    while(true) { 
     $username = $names[0] . $names[1]; 
     if ($count > 0) { 
      $username .= $count; 
     } 
     $searchStmt->execute(array(':username' => $username)); 
     if ($searchStmt->fetchColumn(0) == 0) { 
      // insert new user here 
      $insertStmt = $db->prepare('INSERT INTO special_users (username) VALUES (:username)'); 
      $inserted = $insertStmt->execute(array(':username' => $username)); 
      if ($inserted) { 
       return array(
        'id'  => $db->lastInsertId(), 
        'username' => $username 
       ); 
      } else { 
       return false; 
      } 
     } else { 
      $count++; 
     } 
     // break condition to avoid endless loop 
     if ($count > 1000) { 
      return false; 
     } 
    } 
} 
0

pas sûr que les frais généraux sage c'est la meilleure approche, mais cela fonctionnerait (code non testé si)

function checkUnique($username){ 
return (mysql_num_rows(mysql_query("SELECT username FROM special_users WHERE username = '".mysql_real_escape_string($username)."'"))>0) ? FALSE : TRUE; 
} 

function findUsername($username,$iterator=0){ 
$usernamecheck = ($iterator>0) ? ($username.$iterator) : $username; 
if(checkUnique($usernamecheck)){ 
    return $usernamecheck; 
}else{ 
    findUsername($username,($iterator+=1)); 
} 
} 

$unique = findUsername('JoBlob'); // use the output of findUsername for your insert 
+0

au moins en utilisant mysql_num_rows au lieu de sélectionner count() à cet effet - est horrible. –

1

Voici une fonction qui fera exactement cela, si c'est vraiment la façon dont vous souhaitez gérer vos noms d'utilisateur. Nous pouvons ajouter une simple déclaration de retour à la fin si nécessaire. Il utilise des appels PHP MySQL simples:

function addUser($name, $connection) 
{ 
    assert($connection && strlen($name)); 
    $count_query = "SELECT COUNT(*) FROM special_users WHERE username LIKE '" 
        . mysql_real_escape_string($name) . "%'"; 

    $results = mysql_query($count_query); 
    $row  = mysql_fetch_array($results); 
    $username = ($row[0]) ? mysql_real_escape_string($name) . $row[0] 
          : mysql_real_escape_string($name); 

    $insert_query = "INSERT INTO special_users (username) VALUE ('$username')"; 

    if (!mysql_query($insert_query, $connection)) 
    { 
     die('Error: ' . mysql_error()); 
    } 
} 

//$con defined somewhere above... 
for($i = 0; $i < 5; ++$i) 
    addUser("David Letterman", $con); 
Questions connexes