Nasıl sql tablo veya döngü içinde benzersiz bir giriş koyar bir işlev oluştururum?

5 Cevap php

Ben temelde bir ilk ve son isim tabanlı bir tablodaki benzersiz giriş varchar oluşturmak istiyorum.

Yani Jo Blob imzalar ve başlıyoruz:

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

Ben geçmesi ve sonra (tabii varsa, o zaman) JoBlob2 (ki olmadıkça), JoBlob3 vs vs JoBlob1 denemek ve sonsuzluğa olacağını ben bir fonksiyon içine açabilirsiniz nasıl merak ediyorum? Bazı fikirlerim var ama onlar etrafında aşırı uzun bir yol görünüyor.

Bunu nasıl yaklaşmalıdır?

5 Cevap

Tam olarak ne sormak -

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

ama algoritması kendisi benim açımdan çok kötü

Aşağıdaki kod genel prosedür özetliyor - hiçbir hata işleme var, o OP için sol:

/**
 * @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;
        }
    }
}

Gerçekten sizin adlarını işlemek istiyorum yolu ise burada sadece yapacak bir fonksiyon, bu. Gerekirse Biz sonuna kadar basit getirisi açıklama ekleyebilirsiniz. Düz PHP MySQL aramaları kullanır:

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 );

Peki, çirkin çözüm (name.family yeni kullanıcı) sayısı kullanmak olacaktır ve özel liste name.family eklemek + sonuç +1 (tabii char) tercüme edecektir

Ben sadece rastgele bir dize jeneratör, daha az okunabilir kullanın, ama benim için iş yapmak.

değil emin havai-bilge bu iyi yaklaşımdır ama bu işe (denenmemiş kodu gerçi)

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