如何在本教程中添加一些 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 & 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 查询?的主要内容,如果未能解决你的问题,请参考以下文章