Как создать функцию, которая помещает уникальную запись в таблицу или цикл sql? - PullRequest
0 голосов
/ 04 октября 2009

Я в основном хочу создать уникальный логин varchar в таблице на основе имени и фамилии.

Итак, Джо Блоб подписывается, и мы идем:

// 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

I'mЛюбопытно, как я могу превратить это в функцию, чтобы она прошла, а затем попробовать JoBlob1 (если таковой существует, то) JoBlob2 (если таковой не существует), JoBlob3 и т. д. и т. д. и в бесконечность?У меня есть некоторые идеи, но они кажутся слишком длинными.

Как мне подойти к этому?

Ответы [ 5 ]

1 голос
/ 04 октября 2009

Вот функция, которая сделает это, если вы действительно хотите обрабатывать ваши имена пользователей. При необходимости мы можем добавить простую инструкцию возврата в конец. Он использует простые вызовы PHP MySQL:

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 );
1 голос
/ 04 октября 2009

Точно, что спросить -

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

но ваш алгоритм сам по себе очень плохой на мой взгляд

1 голос
/ 04 октября 2009

В следующем коде описана общая процедура - обработка ошибок не выполняется, оставлена ​​на 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 голосов
/ 04 октября 2009

не уверен, что это накладные расходы - это лучший подход, но это сработает (хотя и не проверенный код)

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 голосов
/ 04 октября 2009

Ну, уродливое решение состоит в том, чтобы использовать count (ваше новое имя пользователя.family) и добавить специальный список name.family + результат +1 (конечно же, переведенный в char)

Я просто использую генератор случайных строк, менее читаемый, но делаю работу за меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...