Site Builder
Editing:
register.php
writable 0666
<?php /***************************************************************** * Public registration (local account) with slug‑helper + referral *****************************************************************/ require_once __DIR__.'/lib/db.php'; require_once __DIR__.'/lib/mail.php'; session_start(); /* -------------------------------------------------------------- 0. Referral detection (URL param → cookie for 30 days) ----------------------------------------------------------------*/ $ref=''; if(isset($_GET['ref']) && preg_match('/^[A-Za-z0-9_-]{3,32}$/',$_GET['ref'])){ $ref=$_GET['ref']; setcookie('bdo_ref',$ref,time()+30*24*3600,'/','',true,true); }elseif(isset($_COOKIE['bdo_ref'])&&preg_match('/^[A-Za-z0-9_-]{3,32}$/',$_COOKIE['bdo_ref'])){ $ref=$_COOKIE['bdo_ref']; } /* -------------------------------------------------------------- 1. Handle POST ----------------------------------------------------------------*/ $err=''; if($_SERVER['REQUEST_METHOD']==='POST'){ $u = trim($_POST['username']??''); $e = trim($_POST['email']??''); $p = $_POST['pass']??''; $t = $_POST['acct_type']??''; $raw= trim($_POST['slug_raw']??''); // unmasked value $r = trim($_POST['referrer']??''); /* ---- slug normalise + validate ---- */ if($t==='business'){ $s = preg_replace('/\D/','',$raw); if(strlen($s)!==10) $err='Enter a 10‑digit US phone'; }elseif($t==='social'){ $s=strtolower($raw); if(!preg_match('/^[a-z0-9_-]{3,32}$/',$s)) $err='Handle: 3‑32 letters, digits, _ or -'; }else{ $err='Choose account type'; } /* ---- other validation ---- */ if(!$err && !preg_match('/^[A-Za-z0-9_]{3,32}$/',$u)) $err='Bad username'; elseif(!$err && !filter_var($e,FILTER_VALIDATE_EMAIL))$err='Bad e‑mail'; elseif(!$err && strlen($p)<8) $err='Password ≥ 8'; elseif(!$err && $r && !preg_match('/^[A-Za-z0-9_-]{3,32}$/',$r)) $err='Bad referral code'; /* ---- uniqueness checks ---- */ if(!$err){ $dup=$db->prepare( 'SELECT 1 FROM users WHERE username=? OR email=? OR site_slug=? LIMIT 1'); $dup->execute([$u,$e,$s]); if($dup->fetch()) $err='Username, email or slug already in use'; } /* ---- persist ---- */ if(!$err){ $db->prepare('INSERT INTO users (username,email,password_hash,acct_type,site_slug,referred_by,signup_ip) VALUES (?,?,?,?,?,?,inet6_aton(?))') ->execute([$u,$e,password_hash($p,PASSWORD_DEFAULT), $t,$s,$r?:null,$_SERVER['REMOTE_ADDR']]); $uid=$db->lastInsertId(); $db->exec("INSERT INTO user_pages (user_id,page_id) SELECT $uid,id FROM pages WHERE slug IN ('boundary','edit-".($t==='business'?'business':'social')."','coupon','links','prompts','hours','cta','faq')"); send_mail($e,'Welcome to BestDealOn!', "Hi $u,\n\nYour account is ready – log in and build your page."); $_SESSION['uid']=$uid; header('Location: /members/dashboard.php');exit; } } ?> <!doctype html> <title>Create your BestDealOn account</title> <meta name=viewport content="width=device-width,initial-scale=1"> <style> :root{--brand:#0066ff;--bg:#f9fbff;--fg:#111;--err:#d91c31} *{box-sizing:border-box;font-family:-apple-system,BlinkMacSystemFont,Segoe UI, Roboto,Helvetica,Arial,sans-serif} body{margin:0;display:flex;min-height:100vh;align-items:center;justify-content:center;background:var(--bg);color:var(--fg)} .card{width:clamp(320px,92vw,460px);background:#fff;padding:2.3rem;border-radius:12px;box-shadow:0 6px 24px rgba(0,0,0,.07)} h1{text-align:center;font-size:1.7rem;margin:.2rem 0 1.2rem} label{display:block;margin:.9rem 0 .25rem;font-weight:600} input,select,button{width:100%;padding:.65rem .78rem;border:1px solid #ccd2e2;border-radius:8px;font:inherit} input:focus,select:focus{border-color:var(--brand);outline:none;box-shadow:0 0 0 2px #e5eeff} button{margin-top:1.3rem;background:var(--brand);color:#fff;font-weight:600;border:none;cursor:pointer} button:hover{filter:brightness(1.08)} .err{background:#ffe1e1;color:var(--err);padding:.8rem 1rem;border-radius:8px;text-align:center;margin-bottom:1rem} .small{font-size:.85rem;text-align:center;margin-top:1rem} @media(prefers-color-scheme:dark){ :root{--bg:#0d1117;--fg:#e6edf3;--brand:#2f81f7} .card{background:#161b22;box-shadow:0 4px 14px rgba(0,0,0,.6)} input,select{background:#0d1117;color:var(--fg);border-color:#30363d} } </style> <body> <main class=card> <h1>Join <span style="color:var(--brand)">BestDealOn</span></h1> <?php if($err): ?><div class=err><?=htmlspecialchars($err)?></div><?php endif ?> <form method=post novalidate> <label for=u>Username</label> <input id=u name=username required value="<?=htmlspecialchars($_POST['username']??'')?>" pattern="[A-Za-z0-9_]{3,32}"> <label for=e>E‑mail</label> <input id=e type=email name=email required value="<?=htmlspecialchars($_POST['email']??'')?>"> <label for=p>Password <span style="font-weight:normal">(≥ 8 chars)</span></label> <input id=p type=password name=pass minlength=8 required autocomplete="new-password"> <label for=t>Account type</label> <select id=t name=acct_type required> <option value="">— choose —</option> <option value=business <?=($_POST['acct_type']??'')==='business'?'selected':''?>>Business</option> <option value=social <?=($_POST['acct_type']??'')==='social'?'selected':''?>>Influencer / Social</option> </select> <!-- Slug: visible + hidden raw --> <label id=lbl for=visInput>Business phone (10 digits)</label> <input id=visInput type=tel autocomplete=off value="<?=htmlspecialchars($_POST['slug_raw']??'')?>" inputmode="numeric" pattern="\d{0,3}-?\d{0,3}-?\d{0,4}"> <small id=help class=small style="display:block;margin-top:.3rem;color:#555"></small> <input type=hidden id=rawInput name=slug_raw> <label for=r>Referral code</label> <input id=r name=referrer value="<?=htmlspecialchars($ref)?>" <?= $ref?'readonly':'' ?> placeholder="optional"> <button>Sign up</button> </form> <p class=small> Already have an account? <a href="/members/login.php">Log in</a> </p> </main> <script> /* ========= dynamic slug helper ========= */ const typeSel = document.getElementById('t'); const vis = document.getElementById('visInput'); const raw = document.getElementById('rawInput'); const lbl = document.getElementById('lbl'); const helpTxt = document.getElementById('help'); /* returns 727‑610‑1188 as you type */ function formatPhone(digits){ const d = digits.slice(0,10); if(d.length <= 3) return d; if(d.length <= 6) return d.slice(0,3)+'-'+d.slice(3); return d.slice(0,3)+'-'+d.slice(3,6)+'-'+d.slice(6); } function syncUI(){ if(typeSel.value==='social'){ lbl.textContent='Public handle (3–32 letters, numbers, _ or -)'; vis.placeholder='mybrand'; helpTxt.textContent='3–32 characters • letters, numbers, _ or -'; vis.value = vis.value.replace(/\s+/g,''); }else{ lbl.textContent='Business phone (10 digits)'; vis.placeholder='727‑610‑1188'; helpTxt.textContent='Enter 10 Digit Phone Number'; vis.value = formatPhone(vis.value.replace(/\D/g,'')); } } /* live masking WITHOUT cursor jump */ vis.addEventListener('input', e=>{ if(typeSel.value!=='business') return; const start = vis.selectionStart; const digitsBefore = vis.value.replace(/\D/g,''); // raw before change const formatted = formatPhone(digitsBefore); // difference in length between old & new => caret compensation const diff = formatted.length - vis.value.length; vis.value = formatted; const newPos = Math.max(0, start + diff); vis.setSelectionRange(newPos, newPos); }); /* on account‑type change */ typeSel.addEventListener('change', syncUI); /* on form submit – write the raw slug we really store */ document.querySelector('form').addEventListener('submit', ()=>{ raw.value = (typeSel.value==='business') ? vis.value.replace(/\D/g,'') : vis.value.trim(); }); syncUI(); // initial run </script> </body> </html>
Save changes
Create folder
writable 0777
Create
Cancel