从develophp.com教程注册表格和电子邮件激活
我正在学习Adam Khoury的“如何构建社交网站””教程,我正在学习第6课“注册表单和电子邮件激活PHP MySQL JavaScript编程教程” 课程和代码如下: 完成本课程后,我有了一个新的用户注册表单,但我遇到了两个问题 1。表单上说注册成功,它会显示正确的确认消息“好的TestUser,请检查您的电子邮件收件箱和垃圾邮件框whatever@gmail.com稍后,通过激活您的帐户完成注册过程。在成功激活您的帐户之前,您将无法在该网站上执行任何操作。“,但是,用户的详细信息不会输入到用户数据库表中,用户数据库表应该放在哪里 2.确认电子邮件不会发送到用户的收件箱(或垃圾邮件) 我使用bluehost.com作为我的服务器,我已经在bluehost上创建了正确的电子邮件地址(电子邮件地址已更改为“自动”)_responder@myserver.com“出于隐私原因,在下面的代码中) 这是我的signup.php文件:从develophp.com教程注册表格和电子邮件激活,php,bluehost,email-verification,auto-responder,Php,Bluehost,Email Verification,Auto Responder,我正在学习Adam Khoury的“如何构建社交网站””教程,我正在学习第6课“注册表单和电子邮件激活PHP MySQL JavaScript编程教程” 课程和代码如下: 完成本课程后,我有了一个新的用户注册表单,但我遇到了两个问题 1。表单上说注册成功,它会显示正确的确认消息“好的TestUser,请检查您的电子邮件收件箱和垃圾邮件框whatever@gmail.com稍后,通过激活您的帐户完成注册过程。在成功激活您的帐户之前,您将无法在该网站上执行任何操作。“,但是,用户的详细信息不会输入
<?php session_start();
// If user is logged in, header them away
if(isset($_SESSION["username"])){
header("location: message.php?msg=NO to that weenis");
exit();
}
?><?php if(isset($_POST["usernamecheck"])){
include_once("php_includes/db_conx.php");
$username = preg_replace('#[^a-z0-9]#i', '', $_POST['usernamecheck']);
$sql = "SELECT id FROM users WHERE username='$username' LIMIT 1";
$query = mysqli_query($db_conx, $sql);
$uname_check = mysqli_num_rows($query);
if (strlen($username) < 3 || strlen($username) > 16) {
echo '<strong style="color:#F00;">3 - 16 characters please</strong>';
exit();
}
if (is_numeric($username[0])) {
echo '<strong style="color:#F00;">Usernames must begin with a letter</strong>';
exit();
}
if ($uname_check < 1) {
echo '<strong style="color:#009900;">' . $username . ' is OK</strong>';
exit();
} else {
echo '<strong style="color:#F00;">' . $username . ' is taken</strong>';
exit();
}
}
?><?php if(isset($_POST["u"])){
// CONNECT TO THE DATABASE
include_once("php_includes/db_conx.php");
// GATHER THE POSTED DATA INTO LOCAL VARIABLES
$u = preg_replace('#[^a-z0-9]#i', '', $_POST['u']);
$e = mysqli_real_escape_string($db_conx, $_POST['e']);
$p = $_POST['p'];
$g = preg_replace('#[^a-z]#', '', $_POST['g']);
$c = preg_replace('#[^a-z ]#i', '', $_POST['c']);
// GET USER IP ADDRESS
$ip = preg_replace('#[^0-9.]#', '', getenv('REMOTE_ADDR'));
// DUPLICATE DATA CHECKS FOR USERNAME AND EMAIL
$sql = "SELECT id FROM users WHERE username='$u' LIMIT 1";
$query = mysqli_query($db_conx, $sql);
$u_check = mysqli_num_rows($query);
// -------------------------------------------
$sql = "SELECT id FROM users WHERE email='$e' LIMIT 1";
$query = mysqli_query($db_conx, $sql);
$e_check = mysqli_num_rows($query);
// FORM DATA ERROR HANDLING
if($u == "" || $e == "" || $p == "" || $g == "" || $c == ""){
echo "The form submission is missing values.";
exit();
} else if ($u_check > 0){
echo "The username you entered is alreay taken";
exit();
} else if ($e_check > 0){
echo "That email address is already in use in the system";
exit();
} else if (strlen($u) < 3 || strlen($u) > 16) {
echo "Username must be between 3 and 16 characters";
exit();
} else if (is_numeric($u[0])) {
echo 'Username cannot begin with a number';
exit();
} else {
// END FORM DATA ERROR HANDLING
// Begin Insertion of data into the database
// Hash the password and apply your own mysterious unique salt
/*$cryptpass = crypt($p);
include_once ("php_includes/randStrGen.php");
$p_hash = randStrGen(20)."$cryptpass".randStrGen(20);*/
$p_hash = md5($p);//CHANGE THIS!!!!!
// Add user info into the database table for the main site table
$sql = "INSERT INTO users (username, email, password, gender, country, ip, signup, lastlogin, notescheck)
VALUES('$u','$e','$p_hash','$g','$c','$ip',now(),now(),now())";
$query = mysqli_query($db_conx, $sql);
$uid = mysqli_insert_id($db_conx);
// Establish their row in the useroptions table
$sql = "INSERT INTO useroptions (id, username, background) VALUES ('$uid','$u','original')";
$query = mysqli_query($db_conx, $sql);
// Create directory(folder) to hold each user's files(pics, MP3s, etc.)
if (!file_exists("user/$u")) {
mkdir("user/$u", 0755);
}
// Email the user their activation link
$to = "$e";
$from = "auto_responder@myserver.com";
$subject = 'yoursitename Account Activation';
$message = '<!DOCTYPE html><html><head><meta charset="UTF-8"><title>yoursitename Message</title></head><body style="margin:0px; font-family:Tahoma, Geneva, sans-serif;"><div style="padding:10px; background:#333; font-size:24px; color:#CCC;"><a href="http://www.yoursitename.com"><img src="http://www.yoursitename.com/images/logo.png" width="36" height="30" alt="yoursitename" style="border:none; float:left;"></a>yoursitename Account Activation</div><div style="padding:24px; font-size:17px;">Hello '.$u.',<br /><br />Click the link below to activate your account when ready:<br /><br /><a href="http://www.yoursitename.com/activation.php?id='.$uid.'&u='.$u.'&e='.$e.'&p='.$p_hash.'">Click here to activate your account now</a><br /><br />Login after successful activation using your:<br />* E-mail Address: <b>'.$e.'</b></div></body></html>';
$headers = "From: $from\n";
$headers .= "MIME-Version: 1.0\n";
$headers .= "Content-type: text/html; charset=iso-8859-1\n";
mail($to, $subject, $message, $headers);
echo "signup_success";
exit();
}
exit();
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Sign Up</title>
<link rel="icon" href="favicon.ico" type="image/x-icon">
<link rel="stylesheet" href="style/style.css">
<style type="text/css">
#signupform{
margin-top:24px;
}
#signupform > div {
margin-top: 12px;
}
#signupform > input,select {
width: 200px;
padding: 3px;
background: #F3F9DD;
}
#signupbtn {
font-size:18px;
padding: 12px;
}
#terms {
border:#CCC 1px solid;
background: #F5F5F5;
padding: 12px;
}
</style>
<script src="js/main.js"></script>
<script src="js/ajax.js"></script>
<script>
function restrict(elem){
var tf = _(elem);
var rx = new RegExp;
if(elem == "email"){
rx = /[' "]/gi;
} else if(elem == "username"){
rx = /[^a-z0-9]/gi;
}
tf.value = tf.value.replace(rx, "");
}
function emptyElement(x){
_(x).innerHTML = "";
}
function checkusername(){
var u = _("username").value;
if(u != ""){
_("unamestatus").innerHTML = 'checking ...';
var ajax = ajaxObj("POST", "signup.php");
ajax.onreadystatechange = function() {
if(ajaxReturn(ajax) == true) {
_("unamestatus").innerHTML = ajax.responseText;
}
}
ajax.send("usernamecheck="+u);
}
}
function signup(){
var u = _("username").value;
var e = _("email").value;
var p1 = _("pass1").value;
var p2 = _("pass2").value;
var c = _("country").value;
var g = _("gender").value;
var status = _("status");
if(u == "" || e == "" || p1 == "" || p2 == "" || c == "" || g == ""){
status.innerHTML = "Fill out all of the form data";
} else if(p1 != p2){
status.innerHTML = "Your password fields do not match";
} else if( _("terms").style.display == "none"){
status.innerHTML = "Please view the terms of use";
} else {
_("signupbtn").style.display = "none";
status.innerHTML = 'please wait ...';
var ajax = ajaxObj("POST", "signup.php");
ajax.onreadystatechange = function() {
if(ajaxReturn(ajax) == true) {
if(ajax.responseText.replace(/^\s+|\s+$/g, "") == "signup_success"){
status.innerHTML = ajax.responseText;
_("signupbtn").style.display = "block";
} else {
window.scrollTo(0,0);
_("signupform").innerHTML = "OK "+u+", check your email inbox and junk mail box at <u>"+e+"</u> in a moment to complete the sign up process by activating your account. You will not be able to do anything on the site until you successfully activate your account.";
}
}
}
ajax.send("u="+u+"&e="+e+"&p="+p1+"&c="+c+"&g="+g);
}
}
function openTerms(){
_("terms").style.display = "block";
emptyElement("status");
}
/* function addEvents(){
_("elemID").addEventListener("click", func, false);
}
window.onload = addEvents; */
</script>
</head>
<body>
<?php include_once("template_pageTop.php"); ?>
<div id="pageMiddle">
<h3>Sign Up Here</h3>
<form name="signupform" id="signupform" onSubmit="return false;">
<div>Username: </div>
<input id="username" type="text" onBlur="checkusername()" onKeyUp="restrict('username')" maxlength="16">
<span id="unamestatus"></span>
<div>Email Address:</div>
<input id="email" type="text" onFocus="emptyElement('status')" onKeyUp="restrict('email')" maxlength="88">
<div>Create Password:</div>
<input id="pass1" type="password" onFocus="emptyElement('status')" maxlength="16">
<div>Confirm Password:</div>
<input id="pass2" type="password" onFocus="emptyElement('status')" maxlength="16">
<div>Gender:</div>
<select id="gender" onFocus="emptyElement('status')">
<option value=""></option>
<option value="m">Male</option>
<option value="f">Female</option>
</select>
<div>Country:</div>
<select id="country" onFocus="emptyElement('status')">
<?php include_once("template_country_list.php"); ?>
</select>
<div>
<a href="#" onClick="return false" onMouseDown="openTerms()">
View the Terms Of Use
</a>
</div>
<div id="terms" style="display:none;">
<h3>Web Intersect Terms Of Use</h3>
<p>1. Play nice here.</p>
<p>2. Take a bath before you visit.</p>
<p>3. Brush your teeth before bed.</p>
</div>
<br /><br />
<button id="signupbtn" onClick="signup()">Create Account</button>
<span id="status"></span>
</form>
</div>
<?php include_once("template_pageBottom.php"); ?>
</body>
</html>
我不确定您是否找到了答案,但我也遇到了这个问题
1) 确保电子邮件发件人地址正确无误,否则您将不会向他们发送电子邮件。现在,实际名称不需要正确,但@Yourdomain.com会正确无误。许多公司通常会输入错误的电子邮件地址noreply@yourdomain.com这实际上没有一个收件箱,或者它确实存在,但是没有人检查它。我个人做了一个广告I don’我不想用我的方法来澄清我从来没有遇到过垃圾邮件问题,所有的电子邮件都会进入收件箱
2) 我的用户表没有被编写(但是useroptions被编写了),我把它归结为这样一个事实:在这段代码中
// Add user info into the database table for the main site table
$sql = "INSERT INTO users (username, email, password, gender, country, ip, signup, lastlogin, notescheck)
VALUES('$u','$e','$p_hash','$g','$c','$ip',now(),now(),now())";
最后它说now(),这需要改成now(),并确保将所有now()改成now()。当我完成这些表的写入后,只需再次检查以确保数据库中的表名和行与代码中的匹配。如果不匹配,则只需更改数据库中的名称。我已将以下名称添加到数据库名称中:
用户(表名)、用户名(用户表中行名)、电子邮件(用户表中行名)、密码(用户表中行名)、性别(用户表中行名)、国家(用户表中行名)、ip(用户表中行名)、注册(用户表中行名)、lastlogin(用户表中行名)、notescheck(users表中的行名称)。您将在该表中找到更多尚未列出的行,但请不要担心,因为这些行将在以后的视频中添加
我知道这个问题是一年前提出的,但我现在发布的是,如果你仍然想要答案,那么你就可以得到答案,最重要的是,任何有同样问题的人,在我写下这个答案后,你也可以找到他们需要的解决方法。如果这不能解决你的问题,那么就发布一个回复,让我知道,我会看看是否可以帮助你。你不应该依赖Adam Khoury的“如何构建社交网络”“教程。
一半的代码已经过时,而且不可靠。从该源代码可以进行太多的SQL注入。但是Ajax教程也很好,也很可靠。这是一个很好的开始方式,但不应该依赖它。
mysql\uu
太过时了。我建议使用PDO
但是,这又是一个老问题。您没有做任何检查来查看您的SQL语句是否正常工作-我会添加一些调用到mysqli\u error
来查看。另外,您确定您的SQL字符串生成正确吗?回显它,看看是否可以直接在数据库中运行它。此外,您应该查看o看看你是否可以使用预先准备好的语句,而不是直接将变量添加到SQL字符串中,因为这会使你的代码更安全。麻烦你举一些你所描述的例子。我对PHP和mysqli不熟悉。这就是我学习本教程的原因。mysqli的手册页非常全面:。你可以得到最后一个来自数据库的带有mysqli\u error($db\u conx)
的错误消息;准备好的语句稍微复杂一些,但是如果您查看prepare()上的页面
function,它将显示您想要做的事情。您正在清理用户的输入;但是准备好的语句为您做了很多工作。我尝试将它添加到各个地方……但它没有显示在站点的任何地方。printf(“错误消息:%s\n”,mysqli\u Error($db\u conx))
你在哪里尝试过添加它?最有用的地方是在每次查询之后:mysqli\u query()或die(mysqli\u error($db\u conx))
-当它发现错误时,将停止代码的执行,并打印出错误内容。