来自develophp.com的注册表格和电子邮件激活教程


Sign Up Form and Email Activation tutorial from developPHP.com

我目前正在学习develophp.com上的教程,我在一堆视频中一直到第6集,我遇到了问题,我只是不知道该怎么办。这是我目前正在播放的视频,http://www.developphp.com/view.php?tid=1294.我已经看了5次视频了,我只是不知道我做错了什么,我想是因为我当时在数据库中又添加了几个字段,我认为是"小心地"修改了代码。

如果你没有看过视频,基本上它是一个使用js&ajax和im一直到输入数据时,确保它是该特定字段的适当数据。应该发生的是,当有人输入用户名时,它不能以数字开头,也不能与另一个人相同,但由于数据库中没有其他人,这有点难做到,但如果你做错了什么,输入字段的旁边会出现一个错误,如果你输入了用户名,但它没有,首先会显示一个检查符号,然后一个成功的消息说用户名是上帝使用。在处理了代码之后,包括尝试准备语句,我得到了检查消息,但从未成功,如果我放了一些不允许的东西,我再次得到了检查信息,但没有警告/失败的消息,作为我真正使用js和ajax的新手,我真的不知道从哪里开始,我似乎陷入了困境:''。。。

在教程中,那个家伙把所有的代码都放在一页上,他把代码交给你,让你可以复制,所以我试着把代码放在不同的页面上,尽可能地减少代码在页面上的数量,这样对我来说可读性和整洁性就更好了。。

首先,我会给出我所有的数据库字段,然后给出我的代码,对于实际的页面,js和ajax调用的函数(如果是这样的话(。。

id | email | password | fname | lname | username | gender | city | country | website | userlevel | avatar | ip | signup| lastlogin | notescheck | activated

我的注册表php.

<h3>Sign Up Here</h3>
<form name="signupform" id="signupform" onsubmit="return false;">
<!-- First Name -->
<div>First Name:</div>
<input id="first" type="text" onfocus="emptyElement('status')" maxlength="88">
<!-- Last Name -->
<div>Last Name:</div>
<input id="last" type="text" onfocus="emptyElement('status')" maxlength="88">
<!-- Email -->
<div>Email Address:</div>
<input id="email" type="text" onfocus="emptyElement('status')" onkeyup="restrict('email')" maxlength="88">
<!-- Username -->
<div>Username: </div>
<input id="username" type="text" onblur="checkusername()" onkeyup="restrict('username')" maxlength="16">
<span id="unamestatus"></span>
<!-- Password -->
<div>Create Password:</div>
<input id="pass1" type="password" onfocus="emptyElement('status')" maxlength="16">
<!-- Confirm Paassword -->
<div>Confirm Password:</div>
<input id="pass2" type="password" onfocus="emptyElement('status')" maxlength="16">
<!-- Gender -->
<div>Gender:</div>
<select id="gender" onfocus="emptyElement('status')">
  <option value=""></option>
  <option value="m">Male</option>
  <option value="f">Female</option>
</select>
<!-- City -->
<div>City:</div>
<input id="city" type="text" onfocus="emptyElement('status')">
<!-- Country -->
<div>Country:</div>
<select id="country" onfocus="emptyElement('status')">
  <?php include "page_includes/reg/country_list.php"; ?>
</select>
<!-- Terms and Conditions -->
<div>
  <a href="#" onclick="return false" onmousedown="openTerms()">
    View the Terms Of Use
  </a>
</div>
<div id="terms" style="display:none;">
  <h3>Socio Terms Of Use</h3>
  <p>1. bla bla bla.</p>
  <p>2. bla bla bla.</p>
  <p>3. bla bla bla.</p>
</div>
<!-- Register Button -->
<br /><br />
<button id="signupbtn" onclick="signup()" class="btn btn-md btn-success">Create Account</button>
<span id="status"></span>
</form> 

这是register.js 的代码

//Register JavaScript
//Restrict
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, "");
}
//Empty Element
function emptyElement(x){
_(x).innerHTML = "";
}
//Check Username
function checkusername(){
var u = _("username").value;
if(u != ""){
 _("unamestatus").innerHTML = '<strong class="alert alert-info" style="width:50%;display:inline;">checking ...</strong>';//@ the ... can insert a image or a loading .gif to give some animation...
 var ajax = ajaxObj("POST", "./page_includes/reg/signupajax.php");
    ajax.onreadystatechange = function() {
      if(ajaxReturn(ajax) == true) {
          _("unamestatus").innerHTML = ajax.responseText;
      }
    }
    ajax.send("usernamecheck="+u);
  }
}
//Sign Up
function signup(){
var f = _("first").value;
var l = _("last").value;
var u = _("username").value;
var e = _("email").value;
var p1 = _("pass1").value;
var p2 = _("pass2").value;
var ci = _("city").value;
var co = _("country").value;
var g = _("gender").value;
var status = _("status");
if(f =="" || l == "" || u == "" || e == "" || p1 == "" || p2 == "" || ci == "" || co == "" || g == ""){
status.innerHTML = '<strong class="alert alert-danger" style="width:50%;display:inline;">Fill out all of the form data</strong>';
} else if(p1 != p2){
status.innerHTML = '<strong class="alert alert-danger"  style="width:50%;display:inline;">Your password fields do not match</strong>';
} else if( _("terms").style.display == "none"){
status.innerHTML = '<strong class="alert alert-danger" style="width:50%;display:inline;">Please view the terms of use</strong>';
} else {
 _("signupbtn").style.display = "none";
status.innerHTML = '<strong class="alert alert-info" style="width:50%;display:inline;">please wait ...</strong>';
var ajax = ajaxObj("POST", "./page_includes/reg/signupajax.php");
    ajax.onreadystatechange = function() {
      if(ajaxReturn(ajax) == true) {
          if(ajax.responseText != "signup_success"){
      status.innerHTML = ajax.responseText;
      _("signupbtn").style.display = "block";
    } else {
      window.scrollTo(0,0);
      _("signupform").innerHTML = "OK "+f+" "+l+", 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("f="+f+"&l="+l+"&u="+u+"&e="+e+"&p="+p1+"&ci="+ci+"&co="+co+"&g="+g);
  }
}
//Open the Terms Div
function openTerms(){
_("terms").style.display = "block";
emptyElement("status");
}
/* function addEvents(){
_("elemID").addEventListener("click", func, false);
}
window.onload = addEvents; */

这是一个带有ajax/函数的页面。.im只提供了2个函数中的第一个,因为到目前为止,整个处理情况还没有到代码的这一部分,只有用户名检查点。。。

<?php
$db = $GLOBALS['db'];
// Ajax calls this NAME CHECK code to execute
if(isset($_POST["usernamecheck"])){
$errors = array();
$username - $_POST['username'];
$sql = "SELECT id FROM users WHERE username= ? LIMIT 1";
$stmt = $mysqli->prepare($sql);
    $stmt->bind_param('s', $username);
    $stmt->execute();
    $stmt->store_result();
    $stmt->bind_result($userid);
    $stmt->num_rows;
$stmt->close();
if (strlen($username) < 3 || strlen($username) > 16) {
  $errors[] = '<strong style="color:#F00;">3 - 16 characters please</strong>';
  exit();
}
if (is_numeric($username[0])) {
   $errors[] = '<strong style="color:#F00;">Usernames must begin with a letter</strong>';
  exit();
}
if ($uname_check < 1) {
   echo '<strong class="alert alert-success">' . $username . ' is OK</strong>';
  exit();
} else {
   $errors[] = '<strong style="color:#F00;">' . $username . ' is taken</strong>';
  exit();
}
}
// Ajax calls this REGISTRATION code to execute
... code can be provided if really needed...

在js的其他页面上,做torial的人提供了与该sitation一起使用的代码,它们的代码是。。。

function _(x) {
return document.getElementById(x);
}

function ajaxObj ( meth, url ) {
var x = new XMLHttpRequest();
x.open(meth, url, true);
x.setRequestHeader("Content-type", "x-www-form-urlencoded");
return x;
}
function ajaxReturn(x) {
if (x.readyState == 4 && x.status == 200) {
    return true;
};
}

我知道这里有很多代码,但我知道有人偶尔会使用这个,他建议尽可能多地获取信息供他人使用是有人可以帮助的最好机会。。。

所以基本上我的问题是,有人能弄清楚为什么它不起作用吗?看看发生了什么的最好方法是去我的网站看看会发生什么。。http://howardmarstongroup.org/Socio/register.php

$sql = "SELECT id FROM users WHERE username='$username' LIMIT 1";
$stmt = $mysqli->prepare($sql);
$stmt->bind_param('s', $username);

问题是,你没有使用占位符,但你绑定了一个变量

将$sql更改为

$sql = "SELECT id FROM users WHERE username=? LIMIT 1";