如何在本教程中添加一些 php,包括 mysql 查询?

Posted

技术标签:

【中文标题】如何在本教程中添加一些 php,包括 mysql 查询?【英文标题】:how to add some php to this tutorial, mysql query included? 【发布时间】:2011-07-16 08:29:26 【问题描述】:

教程在这里: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

附加编辑coming-soon.php 上的隐藏 div

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

但是,else $("#form").hide(); $("#invite").fadeIn('slow'); 不再起作用!想法?

【问题讨论】:

您是如何生成字母数字代码的?为什么不只使用自动增量索引? - 如果你真的想要一个“代码”,你可以将索引转换为十六进制......让我知道你使用代码的方式,我可以给你一个例子...... @CarpeNoctumDC:目前还没有生成。我正在尝试找出自动生成它的最佳方法,无论是通过在脚本示例中还是在数据库中添加。我希望数据库创建代码并自动插入。如果这是有道理的。例子会很棒,谢谢!只需要知道我必须在教程 php/mysql 和我现在包含在问题中的 table.sql 文件中修改什么。 您想要一个“安全”的代码还是只是一个短代码? 一个随机的 7 位左右的字母数字代码 :) 更新了 PHP 和 JS 代码以修复 AJAX if/else 子句的“else”部分... 【参考方案1】:

关于你的第二个问题,修复 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 请求则显示消息

---


coming-soon.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"   >
            <img src="img/slides/slide2.jpg"   >
            <img src="img/slides/slide3.jpg"   >
        </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>

【讨论】:

确保您获得了编辑/更新的版本(忘记让 add_code 在成功时返回代码...只需确保您使用的版本在 add_code 中有“返回”并且它具有唯一性表的索引) @CarpeNoctumDC:使用更新后的文本框显示:此电子邮件已存在于数据库中。 @CarpeNoctumDC:还检查了 DB - 它已插入 id、电子邮件、时间戳,但代码为 NULL @J_C 如果它告诉您,那么它没有插入新行...(我的代码不应该影响新记录的插入)您是否删除了数据库表并重新开始?如果不是,那么电子邮件可能实际上存在于表中......如果它不能插入记录,它应该只抛出那个捕获/错误...... @CarpeNoctumDC:我删除了表格并导入了您保存的副本。然后相应地更新了代码。让我再试一次:)【参考方案2】:

您首先必须创建一个新列并将其设置为唯一键。这意味着该列的两行不能具有相同的值。如果您尝试将一个值插入到另一行已有的唯一行中,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.
    


代码在 cmets 中有解释。它基本上像您以前一样创建数据库行,然后尝试为该行设置唯一的代码值。如果 mysql 返回尝试设置唯一代码的查询未更新任何行,则意味着该代码不是唯一的。它将继续尝试,直到生成唯一代码。

如果您在将列设置为唯一、自动递增等时遇到问题。请查看 phpMyAdmin。非常适合刚开始使用这些东西的人。

【讨论】:

如果你想让mysql自动完成,你必须创建一个用户定义函数(UDF)。但是,该 UDF 最终将与我刚刚在上面给您的代码非常相似。唯一的额外好处是 mysql UDF 在 CPU 方面会更高效。然而,对于这么小的东西,这种性能提升是可以忽略不计的,除非你正在构建一个非常大规模的东西(数百万用户)。据我所知,mysql 只能自动生成整数的唯一值,而不是字符串。 @user396404:我已经编辑并将我的代码放在另一个答案中。请相应调整,因为它目前甚至没有提交:(【参考方案3】:

更新: 更好的代码随机化:将其插入用户*代码并试一试

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;

然后,在示例代码中(comming-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)...

这仅取决于您希望代码的“安全性”程度...给出的其他示例非常适合安全性。但是如果您只是想要代码而不是电子邮件,则十六进制路由是最简单的...

【讨论】:

谢谢!您的代码正在生成一个 ID,例如:第一条记录、$email_code = 1、第二条记录、$email_code = 2 等。如果可能的话,我希望它是随机的和字母数字的? 那么 dechex 应该将电子邮件 ID 转换为十六进制代码...(因此返回的代码应该是十六进制值)...如果您希望它随机化,您需要实现类似 user396404 建议的东西... 是的,随机和字母数字。对不起【参考方案4】:
<?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();        
    

?>

【讨论】:

@user396404 @CarpeNoctumDC:这就是我现在拥有的,它没有提交表单。我还在 PhpMyAdmin 中将“代码”列设为唯一键。不然有没有更高效的方法? 当您插入电子邮件行时,“code”的值为空,这将导致该列的重复值。从“代码”列中删除唯一键标签,使其只是一个常规列。然后,尝试上面更新的代码。我这样做是为了让 php 检查“code”值是否是唯一的,而不是 mysql。 @user396404:谢谢。仍然没有提交表单:(它只是不想提交。'code'列现在只是一个常规列。 随机字符串由于某种原因停止运行 知道为什么吗?这么近!! :)

以上是关于如何在本教程中添加一些 php,包括 mysql 查询?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL PHP 语法;MySQL 连接

如何启用 PHP 会话?

SQL[连载1]简介

请推荐一本SQL教程

docker安装mysql

SQL 1