Как добавить PHP в этот учебник, MySQL запрос включен? - PullRequest
1 голос
/ 16 марта 2011

Учебник здесь: http://tutorialzine.com/2010/10/ajaxed-coming-soon-page/

Где это происходит:

15          $mysqli->query("INSERT INTO coming_soon_emails
16                          SET email='".$mysqli->real_escape_string($_POST['email'])."'");
17   
18          if($mysqli->affected_rows != 1){
19              throw new Exception('This email already exists in the database.');
20          }

Как только он проверит, что электронная почта не является дубликатом, я хотел бы добавить уникальный (ни одна из двух записей электронной почты не должна иметь одинаковый) буквенно-цифровой код: AQ4ILB9

Тогда, когда пользователь получает «Спасибо!» сообщение в текстовом поле, я хочу, чтобы он также отображал уникальный код, как указано выше.

Я должен установить новый столбец в БД для добавления кода, правильно? Какие свойства он должен иметь при добавлении, чтобы выполнить вставку кода выше? Возможно автоматическое создание уникального кода для каждой записи, чтобы БД выполняла вставку случайного кода, а не проверку цикла в php?

Как я могу отобразить код для пользователя, когда "Спасибо!" сообщение отображается.

Любая помощь в редактировании учебника будет высоко ценится!

Спасибо!

файл table.sql

--
-- Table structure for table `coming_soon_emails`
--

CREATE TABLE `coming_soon_emails` (
  `email` varchar(64) collate utf8_unicode_ci NOT NULL,
  `ts` timestamp NOT NULL default CURRENT_TIMESTAMP,
  PRIMARY KEY  (`email`)
) E

ДОПОЛНИТЕЛЬНОЕ РЕДАКТИРОВАНИЕ
скрытый div при поступлении в ближайшее время. Php

<div id="code">
Thank you! Your code is: <p style="margin-top:20px;"><?php echo $ref_code;?></p>
</div>

этим я тоже должен был заменить

$msg = "Thank you! Subscription Code: " . $email_code;

с

$ref_code = "example.com/" . $email_code;

Теперь, если вы посмотрите файл script.js, мой был изменен на:

$(document).ready(function(){

    // Binding event listeners for the form on document ready

    $('#email').defaultText('Your Email Address');

    // 'working' prevents multiple submissions
    var working = false;

    $('#form').submit(function(){

        if(working){
            return false;
        }
        working = true;

        $.post("./index.php",{email:$('#email').val()},function(r){
            if(r.error){
                $('#email').val(r.error);
            }
            else { $("#form").hide(); $("#code").fadeIn('slow');}

            working = false;
        },'json');

        return false;
    });
});

// A custom jQuery method for placeholder text:

$.fn.defaultText = function(value){

    var element = this.eq(0);
    element.data('defaultText',value);

    element.focus(function(){
        if(element.val() == value){
            element.val('').removeClass('defaultText');
        }
    }).blur(function(){
        if(element.val() == '' || element.val() == value){
            element.addClass('defaultText').val(value);
        }
    });

    return element.blur();
}

Однако, остальное { $("#form").hide(); $("#invite").fadeIn('slow');} больше не работает! Мысли?

Ответы [ 4 ]

1 голос
/ 16 марта 2011

Для вашего второго вопроса, исправьте ajax:

        if(r.error){
            $('#email').val(r.error);
        } else {
           $('#email').val(r.msg); 
               $("#form").hide(); $("#code").fadeIn('slow');
        }

и в скрипте php исправьте:

    $msg = "Thank you! Subscription Code: " . $email_code;

    if($ajax){
        echo json_encode(array('msg' => $msg)); // add this
        //throw new Exception($msg);  // delete this
    }

Вам нужно будет изменить в соответствии с вашими вариантами ...

Новые файлы:

https://colorchallenge.com/comingsoon/cs.txt (php)

https://colorchallenge.com/comingsoon/script.txt (javascript)


http://www.colorchallenge.com/comingsoon/coming-soon.php

http://www.colorchallenge.com/comingsoon/coming-soon.txt

и SQL: http://www.colorchallenge.com/comingsoon/table.sql

Новый альтернативный ответ с действительно случайным кодом:

Обновленная таблица SQL:

CREATE TABLE IF NOT EXISTS `coming_soon_emails` (   
  `email_id` int(11) NOT NULL auto_increment,   
  `email` varchar(64) collate utf8_unicode_ci NOT NULL,   
  `code` char(7) collate utf8_unicode_ci DEFAULT NULL,
  `ts` timestamp NOT NULL default CURRENT_TIMESTAMP,   
  PRIMARY KEY  (`email_id`),   
  UNIQUE KEY `email` (`email`),
  UNIQUE KEY `code` (`code`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 

в comming-soon.php:

Добавить после: "includes / connect.php";

function gen_code($codeLen = 7) {
    $code = '';
    for ($i=0; $i<$codeLen; $i++) { 
        $d=rand(1,30)%2; 
        $code .= $d ? chr(rand(65,90)) : chr(rand(48,57)); 
    } 
    return $code;
}

function add_code($email_id) {
    $code = gen_code(7);
    $mysqli->query("UPDATE coming_soon_emails SET code='" . $code ."' WHERE email_id='" . $email_id . "'");
    if($mysqli->affected_rows != 1) {
      add_code($email_id);
    } else return $code;
}

Затем измените:

if($mysqli->affected_rows != 1){     
    throw new Exception('This email already exists in the database.'); 
} 

На:

if($mysqli->affected_rows != 1){     
    throw new Exception('This email already exists in the database.'); 
} else {
  $email_code = add_code($mysqli->insert_id);
}

Наконец, обновите сообщение еще раз, включив в него код ... Изменение:

$msg = "Thank you!"; 

Быть:

$msg = "Thank you! Subscription Code: " . $email_code;

Также (без редактирования javascript), чтобы убедиться, что он предоставляет ответ, который вы можете изменить:

    if($ajax){
        die('{"status":1}');
    }

    $msg = "Thank you! Subscription Code: " . $email_code;

на:

    $msg = "Thank you! Subscription Code: " . $email_code;
    if($ajax){
      throw new Exception($msg);
    }

По сути, последнее изменение просто заставляет его всегда выдавать исключение .. которое затем обеспечивает отображение сообщения, если это ajax-запрос

---


Полная окончательная копия ближайшие-скоро. Php

<?php

require "includes/connect.php";

function gen_code($codeLen = 7) {     
$code = '';     
for ($i=0; $i<$codeLen; $i++) {         
 $d=rand(1,30)%2;       
 $code .= $d ? chr(rand(65,90)) : chr(rand(48,57));      }  
 return $code; 
 }  


 function add_code($email_id) {
 global $mysqli;
 $code = gen_code(7); 
 $mysqli->query("UPDATE coming_soon_emails SET code='" . $code ."' WHERE email_id='" . $email_id . "'");  
 if($mysqli->affected_rows != 1) {   
 add_code($email_id);  
 } else return $code; } 

$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('This email already exists in the database.');
        } else {   
          $email_code = add_code($mysqli->insert_id); 
        } 


    $msg = "Thank you! Subscription Code: " . $email_code;

    if($ajax){
        throw new Exception($msg);
    }



    }
    catch (Exception $e){

        if($ajax){
            die(json_encode(array('error'=>$e->getMessage())));
        }

        $msg = $e->getMessage();        
    }
}
?>


<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>AJAX-ed Coming Soon Page with jQuery and PHP | Tutorialzine Demo</title>

<link rel="stylesheet" type="text/css" href="css/styles.css" />
<link rel="stylesheet" type="text/css" href="css/nivo-slider.css" />

</head>

<body>

<div id="page">

    <h1>Coming Soon</h1>

    <div id="slideshowContainer">
        <div id="slideshow">
            <img src="img/slides/slide1.jpg" width="454" height="169" alt="Coming Soon: Our Awesome Web App">
            <img src="img/slides/slide2.jpg" width="454" height="169" alt="Extensive Functionality">
            <img src="img/slides/slide3.jpg" width="454" height="169" alt="Complete with an iPhone App">
        </div>
    </div>

    <h2>Subscribe</h2>

    <form method="post" action="">
        <input type="text" id="email" name="email" value="<?php echo $msg?>" />
        <input type="submit" value="Submit" id="submitButton" />
    </form>

</div>

<!-- Feel free to remove this footer -->

<div id="footer">
    <div class="tri"></div>
    <h1>AJAX-ed Coming Soon Page</h1>
    <a class="tzine" href="http://tutorialzine.com/2010/10/ajaxed-coming-soon-page/">Read &amp; Download on</a>
</div>

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.3/jquery.min.js"></script>
<script src="js/jquery.nivo.slider.pack.js"></script>
<script src="js/script.js"></script>

</body>
</html>
0 голосов
/ 16 марта 2011
<?php

require "includes/connect.php";

function genkey($codeLen = 7) {
    $code = '';
    for ($i=0; $i<$codeLen; $i++) { 
        $d=rand(1,30)%2; 
        $code .= $d ? chr(rand(65,90)) : chr(rand(48,57)); 
    } 
    return $code;
}


function make_code($email) // Function to add unique key to database
{

    // Generate a random 7 character string for the unique key. Change the 7 to however long you want the unique code to be.
    $randString = genkey(7);

    // Try insterting a unique key
    $mysqli->query("UPDATE coming_soon_emails
              SET code='" . $string . "' WHERE email='".$email."'");

    // Ensure that the row was updated with a unique code. If not, try again.
$c = $mysqli->fetch_array(query("SELECT count(*) FROM coming_soon_email WHERE code = '$randString'"));

if($c['count(*)'] > 1) // More than one row already has this code. Try again.
{

    make_code($email);  

}


}

$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!');
        }

        $email = mysql_real_escape_string($_POST['email']); // Secure input to prevent database injection attacks

// Insert a row into mysql with the e-mail
$mysqli->query("INSERT INTO coming_soon_emails
              SET email='".$mysqli->real_escape_string($email)."'");

// Check if row was created successfully (only successful if e-mail is unique)
if($mysqli->affected_rows != 1){ // If no row was created, try again.
    throw new Exception('This email already exists in the database.');
}


        if($ajax){
            die('{"status":1}');
        }

        $msg = "Thank you!";
    }
    catch (Exception $e){

        if($ajax){
            die(json_encode(array('error'=>$e->getMessage())));
        }

        $msg = $e->getMessage();        
    }
}
?>
0 голосов
/ 16 марта 2011

ОБНОВЛЕНИЕ: Лучшая кодовая рандомизация: подключите это к пользовательскому * коду и передайте ему

function genkey($codeLen = 7) {
    $code = '';
    for ($i=0; $i<$codeLen; $i++) { 
        $d=rand(1,30)%2; 
        $code .= $d ? chr(rand(65,90)) : chr(rand(48,57)); 
    } 
    return $code;
}

Ориентировочный ответ:

Если вы просто хотите работать с простым небезопаснымкод вместо адреса электронной почты, вы можете использовать шестнадцатеричное значение плюс основание для значения «кода» ...

Сначала обновите таблицу, чтобы она имела первичный ключ с автоматическим приращением, а электронную почту - как вторичный уникальный ключ..

CREATE TABLE IF NOT EXISTS `coming_soon_emails` (
  `email_id` int(11) NOT NULL auto_increment,
  `email` varchar(64) collate utf8_unicode_ci NOT NULL,
  `ts` timestamp NOT NULL default CURRENT_TIMESTAMP,
  PRIMARY KEY  (`email_id`),
  UNIQUE KEY `email` (`email`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

Затем в примере кода (coming-soon.php вокруг строки 17) измените:

if($mysqli->affected_rows != 1){
    throw new Exception('This email already exists in the database.');
}

на:

if($mysqli->affected_rows != 1){
   throw new Exception('This email already exists in the database.');
} else {
   $email_id = $mysqli->insert_id;
   $email_code = dechex($email_id + 1000000);  // just makes the code longer
}

Наконец, измените comming-soon.php (около строки 28) с:

    $msg = "Thank you!";

на:

    $msg = "Thank you! Subscription ID: " . $email_code;

Тогда, если вы хотите работать с отпиской, просто снимите число ивычтите все, что было добавлено к нему (10000000 в моем примере) ...

Это зависит только от того, насколько "безопасным" вы хотите код ... Другие приведенные примеры отлично подходят для безопасности ... Но если вы просто хотитекод вместо электронной почты, шестнадцатеричный маршрут является самым простым ...

0 голосов
/ 16 марта 2011

Сначала вам нужно будет создать новый столбец и установить для него уникальный ключ. Это означает, что никакие две строки не могут иметь одинаковое значение для этого столбца. Если вы попытаетесь вставить значение в строку Unique, которая уже есть в другой строке, mysql этого не сделает. При этом у вас есть два варианта:

Установите эту строку на уникальный, сделайте ее индексом и установите для нее автоинкремент. Это сделает так, что для каждой созданной строки будет вставлено число, которое на 1 больше, чем предыдущее (например, 1,2,3,4. Каждая строка в основном получает уникальное число).

Если вам нужно нечто большее, чем просто уникальный номер, вы можете использовать следующий код. Просто создайте строку в таблице базы данных с именем «code» и задайте для нее уникальный ключ.

$email = mysql_real_escape_string($_POST['email']); // Secure input to prevent database injection attacks

// Insert a row into mysql with the e-mail
$mysqli->query("INSERT INTO coming_soon_emails
              SET email='".$mysqli->real_escape_string($email)."'");

// Check if row was created successfully (only successful if e-mail is unique)
if($mysqli->affected_rows != 1){ // If no row was created, try again.
    throw new Exception('This email already exists in the database.');
}

function genkey($length = 7) // Function to generate a random string
{

    // Set possible characters (characters that can be in the generated string)
    $possible = "0123456789abcdefghijklmnopqrstuvwxyz"; 

    // start with a blank string
    $string = "";

    // set up a counter
    $i = 0; 

    // add random characters to $string until $length is reached
    while ($i < $length) 
    { 

        // pick a random character from the possible ones
        $string .= substr($possible, mt_rand(0, strlen($possible)-1), 1);
        $i++;

    }

    // done!
    return $string;

}

function make_code($email) // Function to add unique key to database
{

    // Generate a random 7 character string for the unique key. Change the 7 to however long you want the unique code to be.
    $randString = genkey(7);

    // Try insterting a unique key
    $mysqli->query("UPDATE coming_soon_emails
              SET code='" . $string . "' WHERE email='".$email."'");

    // Ensure that row was updated with a unique code. If not, try again with a different code.
    if($mysqli->affected_rows != 1){ 
        make_code($email); // Row was not updated since code is not unique. Try again.
    }

}

Код поясняется в комментариях. Он в основном создает строку базы данных, как вы делали раньше, а затем пытается установить уникальное значение кода для этой строки. Если mysql возвращает, что ни одна строка не была обновлена ​​запросом, пытающимся установить уникальный код, это означает, что код не был уникальным. Это будет продолжаться до тех пор, пока не будет создан уникальный код.

Если у вас возникли проблемы с заданием уникальности столбца, автоинкремента и т. Д., Посмотрите phpMyAdmin. Это отлично подходит для людей, начинающих с этим материалом.

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