Как вставить случайное число в базу данных без повтора - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть регистрация, где для каждого человека, который регистрируется, получает уникальный идентификатор пользователя. этот идентификатор пользователя не должен повторяться, чтобы у каждого человека был уникальный идентификатор. Идентификатор пользователя затем вставляется в 2 разные таблицы. Но каждый раз, когда новый человек регистрирует номер для идентификатора пользователя в базе данных, всегда возвращается 0.

вот мой код:

    $userid = '';
function randomDigits($length){
$numbers = range(0,10000000);
shuffle($numbers);
for($i = 0; $i < $length; $i++){
    global $digits;
    $userid .= $numbers[$i];
}
return $userid;
}

    $query = "INSERT INTO Users (user_id, user_type, name, lastname, email, phone, address, apt, city, state, zip, username, password) VALUES ('$userid','parent','$name', '$lastname', '$email', '$phone', '$address', '$apt', '$city', '$state', '$zip', '$username', '$hash')";
    $result = mysqli_query($query);


    $sql = "INSERT INTO dancers (user_id, name, dancer_name, dancer_middlename, dancer_lastname, dancer_age, dancer_dob, dancer_number, school_code, teacher_name, class_location, date_enrolled, date_comp) VALUES ('$userid', '$name', '$dancer_name', '$dancer_middlename', '$dancer_lastname', '$dancer_age', '$dancer_dob', '$dancer_number', '$schoolcode', '$teacher', '$location', '$date_enrolled', '$date_comp')";


     $result2 = mysqli_query($sql);
     if(!$result = $con->query($query)){
         die('there was an error running query [' . $con->error . ']');
     }else {
       //  header("location: thankyou.html");
     }
    if(!$result2 = $con->query($sql)){
         die('there was an error running query [' . $con->error . ']');
     }else {
         header("location: thankyou.html");
     }
    }

EDIT

Сначала я использовал автоинкремент, но у меня это не получалось. Проблема в том, что да, он автоматически увеличивается для таблицы Users, но мне нужно ЖЕ ИДЕВОЙ идентификатор пользователя из таблицы Users, который также должен быть вставлен в таблицу Dancers.

Таблица танцоров должна иметь свой уникальный идентификатор, а также идентификатор пользователя. Это важно, потому что пользователи могут удалять танцоров и их страницы, поэтому в изобретении, что кто-то удаляется, автоинкремент не работает. Поэтому изначально, когда я использовал автоматическое увеличение для пользователей, это было так, как оно будет вставлено, а 3 было удалено.

ТАБЛИЦА ПОЛЬЗОВАТЕЛЕЙ

user-id |   user-type   |   name   |  etc   |

1       |   parent      |  Ashley  | etc    |

2       |   parent      |  Liz     | etc    |

4       |   parent      |  Chris   | etc    |

СТОЛ ТАНЦОВ

id   |   user-id   | name   |  dancer name   |

1    |     0       | Ashley |     Ben        |

2    |     0       | Liz    |     Tom        |

3    |     0       | Chris  |     Meg        |

Но это то, что должно быть:

ТАБЛИЦА ПОЛЬЗОВАТЕЛЕЙ

user-id |   user-type   |   name   |  etc   |

1       |   parent      |  Ashley  | etc    |

2       |   parent      |  Liz     | etc    |

4       |   parent      |  Chris   | etc    |

СТОЛ ТАНЦОВ

id   |   user-id   | name   |  dancer name   |

1    |     1       | Ashley |     Ben        |

2    |     2       | Liz    |     Tom        |

3    |     4       | Chris  |     Meg        |

РЕДАКТИРОВАТЬ 2 С ОТВЕТОМ

Я использовал приближенный D в ответе Дамиана Пабло Гонсалеса.

Вот правильный код:

$userId = rand(1,9999999);
$check_userId ="select count(*) count from Users where user_id = " . 
$userId;
while ($row['count'] > 0);

$query = "INSERT INTO Users (user_id, user_type, name, lastname, email, phone, address, apt, city, state, zip, username, password) VALUES ('$userid','parent','$name', '$lastname', '$email', '$phone', '$address', '$apt', '$city', '$state', '$zip', '$username', '$hash')";
    $result = mysqli_query($query);


    $sql = "INSERT INTO dancers (user_id, name, dancer_name, dancer_middlename, dancer_lastname, dancer_age, dancer_dob, dancer_number, school_code, teacher_name, class_location, date_enrolled, date_comp) VALUES ('$userid', '$name', '$dancer_name', '$dancer_middlename', '$dancer_lastname', '$dancer_age', '$dancer_dob', '$dancer_number', '$schoolcode', '$teacher', '$location', '$date_enrolled', '$date_comp')";


     $result2 = mysqli_query($sql);
     if(!$result = $con->query($query)){
         die('there was an error running query [' . $con->error . ']');
     }else {
       //  header("location: thankyou.html");
     }
    if(!$result2 = $con->query($sql)){
         die('there was an error running query [' . $con->error . ']');
     }else {
         header("location: thankyou.html");
     }
    }

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

Для уникального случайного числа вы можете использовать функцию ниже. Вы можете передать длину, как вы хотите.

    public static function generateUniqueId($length = 7) {
        $salt = "abcdefghijkmnpqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXYZ23456789";
        srand(); // start the random generator
        $userId = ""; // set the inital variable
        for ($i = 0; $i < $length; $i++) { // loop and create userId
            $userId .= substr($salt, rand() % strlen($salt), 1);
        }
        return $userId;
    }
0 голосов
/ 06 сентября 2018

Подход A

(На мой взгляд, лучший) Как и предполагал Ррей, лучше использовать поле автоинкремента, оно охватывает все для вас, чтобы вам не приходилось беспокоиться об этом.

Для этого попробуйте эту команду MySQL. ALTER TABLE Users MODIFY COLUMN user_id INT auto_increment. После этого вы можете просто вставить другие поля, и user_id всегда будет уникальным:

$query = "INSERT INTO Users (user_type, name, lastname, email, phone, address, apt, city, state, zip, username, password) VALUES ('parent','$name', '$lastname', '$email', '$phone', '$address', '$apt', '$city', '$state', '$zip', '$username', '$hash')";
$result = mysqli_query($query);

Подход B :

вставка следующего доступного идентификатора:

$query = "INSERT INTO Users (user_id, user_type, name, lastname, email, phone, address, apt, city, state, zip, username, password) SELECT max(user_id)+1,'parent','$name', '$lastname', '$email', '$phone', '$address', '$apt', '$city', '$state', '$zip', '$username', '$hash' from Users";
$result = mysqli_query($query);

Посмотрите, что я сделал: я использовал INSERT (fields) SELECT, без VALUES. Это вставит идентификатор в то же время, что и читает. Для этого необходимо, чтобы user_id был числовым.

Подход C

(как я видел, вы используете кавычки для user_id, возможно, это строковое поле)

1) Если user_id - строка, сгенерируйте очень вероятный уникальный идентификатор, используя uniqid ()

Получает префиксный уникальный идентификатор на основе текущего времени в микросекундах.

2) Затем, чтобы быть уверенным, проверьте, не используется ли он.

do {
    $uniq = uniqid();
    $query ="select count(*) count from Users where user_id = '" . $uniq ."'";
    //execute and do a fetch 
} while ($row['count'] > 0);

Он будет продолжать пытаться, пока id не станет действительно уникальным Это требует, чтобы user_id был строковым полем, как varchar, так как uniqid () возвращает буквы и цифры.

Подход D

(аналогично C, но числовому)

1) Если user_id является целым числом, сгенерируйте очень вероятный уникальный идентификатор, используя rand ()

rand - генерирует случайное целое число

2) Затем, чтобы быть уверенным, проверьте, не используется ли он.

do {
    $uniq = rand(1,999999);
    $query ="select count(*) count from Users where user_id = " . $uniq;
    //execute and do a fetch 
} while ($row['count'] > 0);

будет ке

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