2013-06-20 4 views
0

Я следую за Адамом Хури «Как создать сайт социальной сети« Учебник, и я нахожусь на уроке 6 », Регистрация и активация электронной почты PHP MySQL JavaScript Учебное пособие по программированию ".Регистрация формы и активации электронной почты из учебника developPHP.com

Урок и код здесь: http://www.developphp.com/view.php?tid=1294

После завершения этого урока, я новый пользователь форму регистрации, но я испытываю два вопроса.

1. форма говорит знак вверх успешно, он отображает соответствующее сообщение, подтверждающее «OK TestUser, проверьте свой почтовый ящик и почтовый ящик нежелательной в [email protected] в момент завершения регистрации процесс, активируя свою учетную запись. Вы не сможете ничего делать на сайте, пока не активируете свою учетную запись »., однако данные пользователя не вводятся в таблицу базы данных пользователей, где она должна идти.

2. подтверждение по электронной почте не отправляется в почтовый ящик пользователя (или нежелательной почты по этому вопросу)

Я использую bluehost.com как мой сервер, и я создал правильный адрес электронной почты, на Bluehost (адрес электронной почты был изменен на «[email protected]» в коде ниже для соображений конфиденциальности).

Это мой signup.php файл:

<?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 = "[email protected]"; 
     $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> 
+0

Вы не делаете никаких проверок, чтобы увидеть, работают ли ваши операторы SQL или нет - я бы добавил некоторые вызовы в mysqli_error для просмотра. Кроме того, вы уверены, что ваша строка SQL генерируется правильно? Извлеките его и посмотрите, можете ли вы запустить его непосредственно в базе данных. Кроме того, вы должны посмотреть, можете ли вы использовать подготовленный оператор, а не добавлять свои переменные непосредственно в строку SQL, поскольку это сделает ваш код более безопасным. – andrewsi

+0

Мог ли я беспокоить вас некоторыми примерами того, что вы описали. Я новичок в PHP и mysqli. Именно поэтому я беру учебник. – Livi17

+0

Страница руководства по mysqli довольно обширна: http://php.net/manual/en/book.mysqli.php. Вы можете получить последнее сообщение об ошибке из базы данных с помощью mysqli_error ($ db_conx) '; подготовленный оператор немного сложнее, но если вы посмотрите на страницу в функции 'prepare()', это покажет, что вам нужно делать. Вы дезинфицируете вход пользователя; но подготовленные заявления делают для вас много работы. – andrewsi

ответ

1

Вы не должны полагаться на учебник Адама Хури «Как построить социальную сеть».
Половина кода устарела и не надежна. Из этого источника может быть сделано слишком много SQL-инъекций. Но учебники Ajax довольно хороши и надежны. Это отличный способ начать, но на него нельзя положиться.
mysql_ слишком устарели. Я рекомендую использовать PDO.
Но опять же, это старый вопрос.

0

Я не уверен, если вы нашли ответ, но я также сталкиваются с этой проблемой.

1) убедитесь, что адрес электронной почты указан правильно или вы не отправите им электронное письмо. Теперь фактическое имя не должно быть правильным, но это делает @ Yourdomain.com. многие компании ставят ложный адрес электронной почты, что обычно является [email protected], и на самом деле у него нет почтового ящика или факта его существования, но никто его не проверяет. Я лично добавляю этот адрес электронной почты и не беспокоюсь об этом, так как предпочитаю использовать свои слоты для электронной почты для чего-то другого. Просто уточните, что с помощью моего метода у меня никогда не возникало проблем с нежелательной почтой, и все электронные письма отправляются туда в ящик.

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(). как только я это сделал, таблицы были написаны, чтобы просто дважды проверить, чтобы убедиться, что имя вашей таблицы и строки в базе данных соответствуют тому, что у вас есть в коде. если они не совпадают, то просто изменили имена в вашей базе данных. Я добавил имена ниже, чтобы имена ваших баз данных были следующими:

пользователей (имя таблицы), имя пользователя (имя строки в таблице пользователей), адрес электронной почты (имя строки в таблице пользователей), пароль (имя строки в таблице пользователей), пол (имя строки в таблице пользователей), страна, (имя строки в таблице пользователей), ip (имя строки в таблице пользователей), регистрация (имя строки в таблице users), lastlogin (имя строки в таблице users), notecheck (имя строки в таблице пользователей). ВЫ НАЙДЕТЕ БОЛЬШЕ ROWS В ЭТОМ ТАБЛИЦЕ, КОТОРЫЙ НЕ БЫЛ СПИСОК, НО НЕ СМОТРЕТЬ, КАК ОНИ ДОБАВЛЯЕТСЯ В ПОСЛЕДНИХ ВИДЕО.

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