Site Builder
Editing:
register-nubmerissue.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']]); if($t==='business'){ $uid=$db->lastInsertId(); $db->exec("INSERT INTO user_pages (user_id,page_id) SELECT $uid,id FROM pages WHERE slug IN ('boundary','edit-business','coupon','links','prompts')"); }else{ $uid=$db->lastInsertId(); $db->exec("INSERT INTO user_pages (user_id,page_id) SELECT $uid,id FROM pages WHERE slug IN ('boundary','edit-social','coupon','links','prompts')"); } 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 autocomplete=off value="<?=htmlspecialchars($_POST['slug_raw']??'')?>"> <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'); function maskPhone(v){ const d=v.replace(/\D/g,'').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 ui(){ 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=maskPhone(vis.value); } } vis.addEventListener('input',()=>{ if(typeSel.value==='business'){ const pos=vis.selectionStart; vis.value=maskPhone(vis.value); vis.setSelectionRange(pos,pos); } }); document.querySelector('form').addEventListener('submit',()=>{ raw.value = (typeSel.value==='business') ? vis.value.replace(/\D/g,'') : vis.value.trim(); }); typeSel.addEventListener('change',ui); ui(); /* initial */ </script> </body> </html>
Save changes
Create folder
writable 0777
Create
Cancel