У меня есть таблица mysql, которая будет хранить адреса пользователей электронной почты (каждая из них уникальна и является основным полем) и временную метку.
Я добавил еще один столбец с именем 'unique_code' (varchar(64), utf8_unicode_ci)
.
Я бы очень благодарен за помощь;
a) Создание 5-значного буквенно-цифрового кода, то есть: 5ABH6
b) Проверьте все строки в столбце «unique_code», чтобы убедиться, что он уникален, иначе сгенерируйте и снова проверьте
c) Вставьте однозначно сгенерированный 5-значный буквенно-цифровой код в 'unique_code'
, соответствующий только что введенному адресу электронной почты.
d) отобразить код на экране.
Какой код я должен поставить и где?
Мой текущий php выглядит следующим образом:
require "includes/connect.php"; $msg = ''; if($_POST['email']){ // Requested with AJAX: $ajax = ($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest'); try{ if(!filter_input(INPUT_POST,'email',FILTER_VALIDATE_EMAIL)){ throw new Exception('Invalid Email!'); } $mysqli->query("INSERT INTO coming_soon_emails SET email='".$mysqli->real_escape_string($_POST['email'])."'"); if($mysqli->affected_rows != 1){ throw new Exception('You are already on the notification list.'); } if($ajax){ die('{"status":1}'); } $msg = "Thank you!"; } catch (Exception $e){ if($ajax){ die(json_encode(array('error'=>$e->getMessage()))); } $msg = $e->getMessage(); } }
Надеюсь это поможет:
a) Я сделал что-то очень похожее на это, когда создавал уникальные коды, которые должны были использоваться как URL-адреса. Я написал это для генерации кодов:
private function _generateCode($length = 5) { $characters = 'bcdfghjkmnpqrstvwxyz'; $string = ''; for ($i = 0; $i < $length; $i++) { $string .= $characters[rand(0, strlen($characters) - 1)]; } return $string; }
$ characters – строка с допустимыми символами. Мы решили удалить гласные, чтобы не было возможности сделать нежелательные слова 🙂 Вы могли бы изменить это. Есть более простые способы написать его, но нам нужно что-то совершенно конкретное.
Вы бы использовали его так:
$unique_code = _generateCode();
b) Для этого просто заверните инструкцию insert в инструкцию select для этого уникального кода. Если код существует, сгенерируйте другой код и повторите попытку. Один из способов сделать это – это (NB: это не проверено, и это может быть восприимчиво к бесконечному циклу, если вам случается попасть в ситуацию, когда вы использовали все свои коды;) И вы, вероятно, должны добавить чек чтобы убедиться, что INSERT был успешным):
$unique_code = ""; $inserted = false; // Keep looping until we've inserted a record while(!$inserted) { // Generate a code $unique_code = _generateCode(); // Check if it exists if ($result = mysqli->query("SELECT unique_code FROM coming_soon_emails WHERE unique_code = '$unique_code'")) { // Check no record exists if ($result->num_rows == 0) { // Create new record $mysqli->query("INSERT INTO coming_soon_emails (email,unique_code) VALUES ('" . $mysqli->real_escape_string($_POST['email']) . "','$unique_code')"); // Set inserted to true to ext loop $inserted = true; // Close the result object $result->close(); } } else { // Quit if we can't check the database die('Something went wrong with select'); } } // Output the code echo $unique_code;
c) Чтобы вставить уникальный код, просто добавьте это в свой оператор insert, где $ unique_code – это переменная, назначенная возвращаемым значением из приведенной выше функции:
$mysqli->query("INSERT INTO coming_soon_emails (email,unique_code) VALUES ('".$mysqli->real_escape_string($_POST['email'])."','$unique_code')");
d) Просто повторите переменную, которую вы присвоили коду, например:
echo $unique_code;
Немного более элегантным решением было бы использовать MySQL для выполнения большинства работ для вас, установив unique_code
поля unique_code
в VARCHAR(5)
и разместив на нем индекс UNIQUE
. Затем вы можете использовать запрос:
$sql = "UPDATE coming_soon_emails SET `unique_code` = MD5(CONCAT(`email`, NOW())) WHERE `email` = {$email}";
и ваш PHP-код будет выглядеть так:
while(!$mysqli->query($sql)) { // If the error that was thrown wasn't a duplicate key problem, // something else is wrong (ie can't connect to MySQL server). if($mysqli->errno != 1062) { // Error handling code break; } }
Используя этот подход, переход к более длинному уникальному коду (например, 6 символов) так же просто, как изменить поле unique_code
на длину 6.