آگهی
article

آموزش ساخت فرم عضویت در سایت با PHP و MySQL

mysql-php-user-sign-up

استفاده از برنامه نویسی PHP و سیستم مدیریت پایگاه داده MySQL شیوه ای پرکاربرد برای ایجاد صفحات داینامیک و سیستم های تحت وب بوده و معمولا یکی از امکانات متداول مورد نیاز در این زمینه لزوم وجود فرم عضویت جهت ثبت نام کاربران است، بسیاری تمایل یا نیاز دارند برای سایت و برنامه تحت وب خود فرم ثبت نام کاربران داشته باشند، به طور مثال برای ارسال خبرنامه و اطلاع رسانی در خصوص به روزرسانی های سایت یا فراتر از آن برای ایجاد محیط کاربری و امکان ورود و خروج کاربران به پنل مدیریت و خیلی ایده های مشابه دیگر، اما قبل از دست یافتن به این هدف ها نیاز به ساخت فرم ثبت نام و عضویت کاربران است تا اطلاعات لازم جهت کنترل ورود و خروج ایمن را در پایگاه داده ثبت شده داشته باشیم، از این رو برای آشنایی بیشتر در این آموزش قصد داریم روش ساخت ساز و کاری ساده و در عین حال کاربردی و حرفه ای جهت ثبت نام و عضویت در سایت را با PHP و MySQL آموزش دهیم.

ایجاد دیتابیس اطلاعات عضویت کاربران


اولین گامی که برای ساخت فرم عضویت کاربران در سایت مورد نیاز است وجود یا ایجاد دیتابیس در سیستم مدیریت پایگاه داده MySQL جهت نگهداری اطلاعات عضویت به فرض شامل نام، نام کاربری، کلمه عبور، شماره تماس و... است که بدین منظور دو حالت متصور می باشد:
اگر از قبل دیتابیسی در سایت خود به طور مثال برای نگهداری مطالب ساخته باشیم معمولا نیازی به ساخت دیتابیس جدید نیست و می توانیم وارد گام بعدی یعنی ساخت جدول و ستون ها شویم.
اما اگر از قبل چنین دیتابیسی در سیستم مدیریت پایگاه داده نساخته باشیم قاعدتا باید یک دیتابیس جدید ایجاد کنیم، بدین منظور در سرور مجازی (Localhost) با استفاده از برنامه phpMyAdmin در آدرس:
http://localhost/phpmyadmin
و منوی Databases یک دیتابیس با نام دلخواه و Collation مناسب زبان فارسی (ترجیحا utf8_persian_ci) می سازیم، در سرور آنلاین ممکن است مجوز انجام این کار در برنامه phpMyAdmin فراهم نباشد و باید از امکانات سیستم مدیریت هاست به فرض برنامه cPanel، DirectAdmin و... استفاده کنیم، به طور مثال در برنامه cPanle می توانیم از منوی Databases وارد قسمت MySQL Databases شویم و از امکانات آن برای ایجاد کاربر و پایگاه داده جدید استفاده کنیم.
نکته: برای برقراری ارتباط با دیتابیس لازم است که یک نام کاربری و کلمه عبور در اختیار داشته باشیم، در لوکال هاست به صورت پیش فرض معمولا نام کاربری root بدون کلمه عبور کاربرد دارد اما در سرور آنلاین باید از قسمت ساخت دیتابیس یک نام کاربری و کلمه عبور نیز ایجاد و به دیتابیس مورد نظرمان مرتبط کنیم.

تنظیم اطلاعات اتصال به دیتابیس در فایل config.php


در آموزش های مقدماتی MySQL دیدیم که برای اتصال به دیتابیس نیاز به تنظیم چند پارامتر در تابع mysqli_connect است که شامل نام سرور، نام کاربری دیتابیس، کلمه عبور دیتابیس و در نهایت عنوان دیتابیس است، برای تجمیع این موارد و استفاده چندباره از تنظیمات پیکربندی در صفحات مختلف معمولا از فایل Configoration استفاده می شود که در این آموزش نیز بر همین اساس اطلاعات را در فایلی با نام دلخواه config.php به صورت نمونه زیر قرار داده ایم:
<?php
//تنظیمات اتصال به دیتابیس
$config = array(
    'host' => 'localhost',
    'db_user' => 'نام کاربری دیتابیس',
    'db_pass' => 'کلمه عبور دیتابیس',
    'db_name' => 'نام دیتابیس'
);
?>
این فایل جهت نمونه است و باید مطابق با اطلاعات دیتابیسمان تکمیل شود.

ایجاد جدول و ستون ها با دستور CREATE


در گام سوم و بعد از ساخت دیتابیس و تنظیم اطلاعات اتصال باید جدولی در پایگاه داده خود با نامی دلخواه بسازیم و ستون هایی را در آن برای نگهداری نام کاربری، کلمه عبور و سایر اطلاعات مورد نیاز ایجاد کنیم، بدین منظور از دستور CREATE TABLE در MySQL استفاده می کنیم، در نمونه کد زیر سه ستون id، username و password را در جدول فرضی users ساخته ایم:
<?php
//فایل تنظیمات اتصال به دیتابیس
include_once('config.php');

//اتصال به دیتابیس
$conn = mysqli_connect($config['host'], $config['db_user'], $config['db_pass'], $config['db_name']);

if(!$conn) {
    echo "PHP & MySQL Connection: Error! " . mysqli_connect_errno() . ' - ' . mysqli_connect_error();
    exit;
} else {
    echo "PHP & MySQL Connection: Ok!<br>";

    //نام جدول
    $tbl_name = "users";

    //ساخت جدول و ستون ها
    $sql = "CREATE TABLE $tbl_name(
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(255),
    password VARCHAR(255))
    ENGINE=MyISAM DEFAULT CHARACTER SET=utf8 COLLATE=utf8_persian_ci"
;
    $query = mysqli_query($conn, $sql);
    if(!$query) {
        echo "Creating Table $tbl_name: Error! " . mysqli_error($conn);
    } else {
        echo "Creating Table $tbl_name: OK!";
    }
}

//پایان اتصال
mysqli_close($conn);
?>
توضیح:
- ابتدا در تابع mysqli_connect اطلاعات لازم جهت اتصال به پایگاه داده را تعریف می کنیم، نام کاربری و کلمه عبور اتصال به پایگاه داده در این تابع مورد نیاز است که در لوکال معمولا با نام کاربری root بدون کلمه عبور می توانیم ارتباط با دیتابیس را برقرار کنیم اما در سرور باید از محیط پنل مدیریت هاست یک کاربر برای دیتابیس خود تعریف کنیم.
- در پارامتر چهارم تابع mysqli_connect عنوان دیتابیس خود را درج می کنیم، گفتیم که این دیتابیس را باید در گام اول ایجاد کرده باشیم.
- در متغیر tbl_name عنوان جدول مد نظرمان را درج می کنیم که در اینجا از عبارت users استفاده کرده ایم.
- دستور CREATE TABLE سه ستون id با خاصیت افزایش خودکار (AUTO_INCREMENT)، ستون username و password از نوع VARCHAR می سازد و در نهایت موتور پیش فرض جدول را بر روی MyISAM تنظیم می کند.
- برای سازگاری با زبان فارسی از COLLATE utf8_persian_ci استفاده کرده ایم.
- در نهایت هم اتصال PHP و پایگاه داده با تابع mysqli_close به پایان می رسد.
نکته 1: با درج این نمونه کد در یک فایل PHP با نام فرضی create.php و اجرای آن در مرورگر ستون های مد نظر در دیتابیس ایجاد می شوند.
نکته 2: در این آموزش از اکستنشن MySQLi در حالت رویه ای (Procedural) استفاده شده است، در صورت تمایل می توانیم کدها را به حالت شی گرا (Object-oriente) یا با اکستشن PDO نیز بنویسیم.

فرم HTML جهت عضویت و ثبت نام کاربر


پس از ساختن دیتابیس، جدول و ستون ها نوبت به ساختن فرم HTML برای ایجاد امکان دریافت اطلاعات از کاربران و ثبت نام آنها است، در این گام با طراحی یک صفحه HTML و قرار دادن چند فیلد input یا textarea در آن به فرض برای درج نام کاربری و کلمه عبور می توانیم اطلاعات کاربران را به سرور ارسال و در جدول و ستون های تعیین شده ذخیره کنیم که در نمونه فرم ساده زیر این کار صورت گرفته است:
<!DOCTYPE html>
<html lang="fa">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>وبگو | فرم HTML ثبت نام کاربر در سایت</title>
<!-- Webgoo.ir -->
<style>
body{
font-family:Tahoma, Geneva, sans-serif;
direction:rtl;
font-size:12px;
line-height: 22px;
}
</style>
</head>
<body>
<form action="users.php" method="post">
<label for="user">نام کاربری:</label>
<input name="username" id="user" type="text" maxlength="255" dir="ltr">
<label for="pass">کلمه عبور:</label>
<input name="password" id="pass" type="password" maxlength="255" dir="ltr">
<label for="rep">تکرار کلمه عبور:</label>
<input name="repeat" id="rep" type="password" maxlength="255" dir="ltr">
<input type="submit" value="عضویت">
</form>
<hr>
- قبل از عضویت کاربر جدید ابتدا باید اطلاعات اتصال به دیتابیس را در فایل config.php در آرایه config تعریف کرده باشیم، نام کاربری در لوکال هاست معمولا root و بدون کلمه عبور است.<br>
- در گام دوم باید جدول و ستون ها در دیتابیس ایجاد شوند، برای این کار آدرس فعلی مرورگر را کپی کرده و با افزودن عبارت create.php در انتهای آدرس، در پنجره جدید این فایل را یک بار فراخوانی می کنیم، به طور مثال:<br> http://localhost/php-mysql-signup/create.php<br>
- دقت کنیم برای رمزنگاری کلمه عبور از تابع password_hash استفاده کرده ایم، این تابع از نسخه PHP 5.5 در دسترس است، برای سازگاری نسخه های قدیمی تر کتابخه password_compat به کدها اضافه شده است.<br>
</body>
</html>
توضیح:
- کدهای بالا را می توانیم در فایلی با نام فرضی index.html در دایرکتوری مربوط به ثبت نام کاربر درج کنیم.
- این فرم HTML سه فیلد input جهت درج نام کاربری، کلمه عبور و تکرار کلمه عبور ایجاد می کند.
- در قسمت action آدرس فایل users.php را قرار می دهیم (اطلاعات فرم به این فایل ارسال می شود).
- برای ارسال اطلاعات از متد POST استفاده کرده ایم، به همین دلیل در سمت سرور و فایل users.php نیز باید از متد POST برای دریافت اطلاعات استفاده کنیم.
- آنچه به عنوان مقدار یا value به فایل users.php ارسال می شود از قسمت مربوط به name در تگ input قابل شناسایی و دریافت است (در ادامه خواهیم دید).
- با قرار دادن خاصیت maxlength حداکثر تعداد کاراکترهای مجاز و قابل درج در فیلد متنی را تعیین می کنیم.
- قسمت مربوط به label جهت تعریف عناوین متنی (برچسب) برای تگ های فرم استفاده می شود.
- در نهایت اطلاعات با دکمه submit به فایل users.php ارسال می شود.
نکته: برای جلوگیری از پیچیده شدن مبحث و تمرکز بر روی کدنویسی سمت سرور ظاهر کار به صورت ساده ارائه شده است، با کمی آشنایی با CSS می توانیم جلوه ظاهری فرم را به نحو دلخواه سفارشی سازی کنیم.

بررسی و ذخیره اطلاعات با فایل users.php


پس از اینکه کاربر اطلاعات خود را در فیلدهای input فرم بالا وارد می کند با زدن دکمه submit مقادیر با متد POST به فایل users.php ارسال و پارامترها در سرور قابل دریافت هستند، مثال زیر روشن است:
<?php
//دریافت و تعریف متغیرها
$username = $_POST['username'];
$password = $_POST['password'];
$repeat = $_POST['repeat'];
?>
توضیح:
- با روش بالا نام کاربری از فیلد username دریافت و در متغیر username ذخیره می شود، همچنین کلمه عبور از فیلد password دریافت و در متغیر password ذخیره می شود، تکرار کلمه عبور نیز از فیلد repeat دریافت و در متغیری با همین نام نگهداری می شود، به این صورت اطلاعات ارسالی کاربر در هنگام اجرای برنامه PHP در دسترس است و می توانیم پردازش های مورد نظرمان را روی آن اعمال کنیم.
- دقت کنیم معمولا آنچه برای PHP در کار با فرم HTML اهمیت دارد متد استفاده شده (POST یا GET) و پارامتر name فیلدها است، سایر موارد مانند ID صرفا جنبه سمت کاربر دارند و به سرور ارسال نمی شوند.

بررسی معتبر بودن اطلاعات ارسال شده از فرم HTML


در ادامه و پس از اینکه اطلاعات فیلدها را از فرم HTML در متغیرهای PHP دریافت کردیم باید معتبر بودن مقادیر ارسال شده را بررسی کنیم، به طور مثال مقادیر فیلد نباید خالی باشد یا ممکن است کلمه عبور را محدود به کاراکترهای خاصی کنیم، برای اعتبارسنجی این موارد به کدنویسی فایل users.php دستورات زیر را اضافه می کنیم:
<?php
//دریافت و تعریف متغیرها
$username = $_POST['username'];
$password = $_POST['password'];
$repeat = $_POST['repeat'];

//پیش فرض
$error = 0;

/* بررسی معتبر بودن اطلاعات ارسالی کاربر */
//نام کاربری
if(!isset($username) || empty($username)) {
    echo "فیلد نام کاربری نباید خالی باشد!";
    $error = 1;
} //کلمه عبور
elseif(!isset($password) || empty($password)) {
    echo "فیلد کلمه عبور نباید خالی باشد!";
    $error = 1;
} elseif($password !== $repeat) {
    echo "کلمه عبور با تکرار آن همخوانی ندارد!";
    $error = 1;
} //مجاز بودن انتخاب حروف انگلیسی به عنوان نام کاربری
elseif(preg_match('/^[a-z0-9_-]+$/i', $username) === 0) {
    echo "نام کاربری دارای کاراکترهای غیر مجاز است!";
    $error = 1;
}
?>
توضیح:
- در دستور شرطی if تنظیم شدن و خالی نبودن نام کاربری را با توابع isset و empty بررسی می کنیم، اگر نام کاربری خالی باشد پیامی به کاربر نشان داده و متغیری به نام error (نام دلخواه است) را برابر 1 قرار می دهیم تا در ادامه وضعیت آن را بررسی کنیم.
- در دستور elseif اول بررسی های بالا را روی کلمه عبور انجام می دهیم تا از خالی نبودن آن یا ارسال اشتباه فرم توسط کاربر اطمینان حاصل کنیم، در elseif دوم نیز کلمه عبور را با تکرار آن تطبیق می دهیم، با توجه به اهمیت کلمه عبور و لزوم به خاطر داشتن آن توسط کاربر معمولا این تطبیق جهت اطمینان از درج صحیح کلمه عبور انجام می شود.
- در قسمت elseif آخر نیز با تابع preg_match بررسی می کنیم تا ببینیم آیا کاراکترهای وارد شده توسط کاربر صرفا شامل حروف و اعداد انگلیسی می شود یا خیر، همچنین دو کاراکتر- و _ را هم جزء کاراکترهای مجاز قرار داده ایم، اگر کاراکتری خارج از این موارد ارسال شود بررسی preg_match نادرست یا false شده (وضعیت با عدد 0 برگردانده می شود) و پیام خطا برای کاربر نمایش داده خواهد شد.
نکته: بررسی اعتبار اطلاعات فرم بسته به اینکه هدف و خواسته ما چه چیزی باشد متفاوت و سلیقه ای است، لذا مثال های عنوان شده صرفا جهت نمونه است و هیچ محدودیتی در این خصوص وجود ندارد.

حفظ امنیت اطلاعات و دیتابیس


اگر همه چیز درست باشد و کاربر فیلدها را به طور کامل تکمیل و ارسال نماید نوبت به مرحله ذخیره اطلاعات در دیتابیس است، اما قبل از اینکه به این گام بپردازیم یک امر مهم را نباید فراموش کنیم:
حفظ امنیت اطلاعات و پایگاه داده!
در برنامه نویسی PHP و هنگام ارتباط با MySQL رعایت مسائل امنیتی کار با پایگاه داده ضروری است، اگرچه عمده کاربران هیچ سوء نیتی نداشته و صرفا به دنبال استفاده های متداول هستند اما ممکن است هکرهایی پیدا شوند که مترصد کوچکترین فرصتی برای نفوذ و آسیب زدن به برنامه ما باشند، از طرفی ذخیره اطلاعات حساس و به فرض کلمه عبور کاربران باید به صورت رمزنگاری شده باشد تا امکان هر نوع سوء استفاده احتمالی را از بین ببرد و ضریب امنیت را افزایش دهد، در مقوله امنیت باید همواره زمانی را فرض کنیم که بخشی از اطلاعات پایگاه داده به هر دلیل در اختیار هکرها قرار گرفته است، در این حالت اگر اطلاعات به صورت یک طرفه و بدون امکان بازگشت رمزی شده باشد قاعدتا استفاده چندانی برای مهاجم نخواهد داشت و حداقل اگر نگوئیم ناممکن ولی احتمال بازیابی بسیار بعید خواهد بود، در این چارچوب در برنامه نویسی رویه ای PHP با اکستنشن MySQLi بدین منظور از توابع mysqli_real_escape_string و password_hash استفاده کرده ایم که روش توصیه شده و جایگزین روش های قدیمی مانند تابع md5 است:
<?php
//فایل تنظیمات اتصال به دیتابیس
include_once('config.php');

//تعریف توابع کلمه عبور در نسخه های پائین تر از PHP 5.5
if(!function_exists('password_hash')){
    include_once('lib/password_compat.php');
}

//دریافت و تعریف متغیرها
$username = $_POST['username'];
$password = $_POST['password'];
$repeat = $_POST['repeat'];

//پیش فرض
$error = 0;

/* بررسی معتبر بودن اطلاعات ارسالی کاربر */
//نام کاربری
if(!isset($username) || empty($username)) {
    echo "فیلد نام کاربری نباید خالی باشد!";
    $error = 1;
} //کلمه عبور
elseif(!isset($password) || empty($password)) {
    echo "فیلد کلمه عبور نباید خالی باشد!";
    $error = 1;
} elseif($password !== $repeat) {
    echo "کلمه عبور با تکرار آن همخوانی ندارد!";
    $error = 1;
} //مجاز بودن انتخاب حروف انگلیسی به عنوان نام کاربری
elseif(preg_match('/^[a-z0-9_-]+$/i', $username) === 0) {
    echo "نام کاربری دارای کاراکترهای غیر مجاز است!";
    $error = 1;
}

//بررسی خطا
if($error === 0) {
    //اتصال به دیتابیس
    $conn = mysqli_connect($config['host'], $config['db_user'], $config['db_pass'], $config['db_name']);

    if(!$conn) {
        echo "PHP & MySQL Connection: Error! " . mysqli_connect_errno() . ' - ' . mysqli_connect_error();
        exit;
    } else {
        echo "PHP & MySQL Connection: Ok!<br>";

        //ایمن سازی پارامترها
        $username = mysqli_real_escape_string($conn, $username);
        $password = password_hash($password, PASSWORD_BCRYPT, ['cost' => 12]);
    }

    //پایان اتصال
    mysqli_close($conn);
}
?>
توضیح:
- تابع mysqli_real_escape_string نیاز به آبجکت اتصال به پایگاه داده (متغیر conn) دارد در غیر اینصورت با خطا مواجه خواهیم شد، از این تابع برای جلوگیری از حملات موسوم به MySQL Injection یا نفوذ به دیتابیس استفاده می کنیم.
- از تابع password_hash برای رمزی کردن یک طرفه رشته ها استفاده می کنیم، اگرچه هیچ الگوریتمی به طور کامل ایمن نیست اما با استفاده از تابع password_hash و الگوریتم استفاده شده در پارامتر PASSWORD_BCRYPT تا حدود بسیار زیادی امنیت کلمه های عبور کاربران حفظ می شود و روش های متداول هکرها (Dictionary attack، Brute force attack و Rainbow table attack) برای بازیابی کلمه عبور عملا خنثی و یا بسیار زمانبر خواهد شد.
نکته 1: کلمه های عبور رمزنگاری شده با تابع password_hash در عمل به هیچ وجه قابل بازیابی به حالت اولیه نیستند و برای کاربرانی که کلمه عبور خود را فراموش کرده اند باید سیستم بازیابی کلمه عبور جدید در نظر گرفته شود.
نکته 2: هرچند الگوریتم های رمزنگاری کلمه عبور از جمله الگوریتمی که در PASSWORD_BCRYPT استفاده می شود به عنوان روش بدون بازگشت شناخته شده و بسیار قوی هستند، با این حال در مقوله امنیت هیچ غیرممکنی وجود ندارد و در صورتی که به هر دلیل اطلاعات دیتابیس در اختیار افراد غیر قرار گیرد باید در اولین فرصت نسبت به تغییر کلمات عبور کاربران اقدام شود و بهتر است چنین سیستمی از قبل در برنامه طراحی شده باشد.
نکته 3: برای تطبیق کلمه عبور به طور مثال در هنگام ورود کاربر به سایت باید اطلاعات ارسالی از فیلتر تابع password_verify به صورت نمونه زیر عبور کند:
//روش تطبیق برای ورود کاربران
$password = password_hash($password, PASSWORD_BCRYPT, ['cost' => 12]);
if(password_verify($password, $db_hashed_password)) {
    //کاربر مجاز به ورود است!
}
در این شیوه متغیر password مقادیر ارسال شده از فرم HTML و متغیر db_hashed_password مقادیر موجود در دیتابیس است.
در بحث امنیت کلمه عبور، شیوه رمزنگاری و تطبیق آن توابع دیگری مانند crypt و hash_equals نیز کاربرد دارند، مثال:
//رمزنگاری کلمه عبور
$password = crypt($password);

//روش تطبیق برای ورود کاربران
$password = crypt($password, $db_hashed_password);
if(hash_equals($db_hashed_password, $password)) {
    //کاربر مجاز به ورود است!
}
در صورت استفاده از این روش مهم است که مشابه نمونه بالا مقدار رمزی شده کلمه عبور موجود در دیتابیس به عنوان Salt در آرگیومنت دوم تابع crypt تنظیم شود در غیر اینصورت قاعدتا نتیجه تطبیق اطلاعات همواره false خواهد بود، همچنین از تابع hash_equals برای جلوگیری از حملات Timing استفاده کرده ایم، این تابع از نسخه 5.6 PHP در دسترس است اما در نسخه های قدیمی می توانیم از تابع جایگزین زیر استفاده کنیم:
<?php
if(!function_exists('hash_equals')) {
    function hash_equals($str1, $str2) {
        if(strlen($str1) != strlen($str2)) {
            return false;
        } else {
            $res = $str1 ^ $str2;
            $ret = 0;
            for($i = strlen($res) - 1; $i >= 0; $i--) {
                $ret |= ord($res[$i]);
            }
            return !$ret;
        }
    }
}
?>
نکته 3: توجه داشته باشیم تابع md5 نیز در تئوری روش رمزنگاری بدون بازگشت است، در واقع برگردان پسوردهای قوی رمزنگاری شده با این تابع در سیستم های متداول بسیار زمانبر و دشوار است، با این حال با توجه به قدرت سخت افزاری سیستم های جدید و امکان وقوع حملات Dictionary، Brute force و Rainbow table استفاده از این تابع برای رمزنگاری کلمه عبور دیگر توصیه نمی شود و بهتر است از روش های جایگزین مانند تابع password_hash و crypt استفاده شود (password_hash توصیه می شود).

بررسی عدم ثبت نام کاربری فعلی در دیتابیس


علاوه بر اعتبارسنجی مقادیری که برای ثبت نام کاربر در سایت به سرور ارسال می شوند باید از قابل ثبت و آزاد بودن نام کاربری انتخاب شده نیز اطمینان حاصل کنیم، منظور از قابل ثبت و آزاد بودن این است که بررسی کنیم نام کاربری درخواستی از قبل در دیتابیس وجود نداشته و توسط کاربر دیگری ثبت نشده باشد، دلیل این کار روشن است و مشخص است که دو یا چند نام کاربری مشابه در یک سیستم باعث ایجاد مشکل در شناسایی کاربران مختلف از هم خواهد شد، بدین منظور پرس و جوی SELECT را به صورت نمونه زیر به کدهای برنامه اضافه می کنیم:
<?php
//فایل تنظیمات اتصال به دیتابیس
include_once('config.php');

//تعریف توابع کلمه عبور در نسخه های پائین تر از PHP 5.5
if(!function_exists('password_hash')){
    include_once('lib/password_compat.php');
}

//دریافت و تعریف متغیرها
$username = $_POST['username'];
$password = $_POST['password'];
$repeat = $_POST['repeat'];

//پیش فرض
$error = 0;

/* بررسی معتبر بودن اطلاعات ارسالی کاربر */
//نام کاربری
if(!isset($username) || empty($username)) {
    echo "فیلد نام کاربری نباید خالی باشد!";
    $error = 1;
} //کلمه عبور
elseif(!isset($password) || empty($password)) {
    echo "فیلد کلمه عبور نباید خالی باشد!";
    $error = 1;
} elseif($password !== $repeat) {
    echo "کلمه عبور با تکرار آن همخوانی ندارد!";
    $error = 1;
} //مجاز بودن انتخاب حروف انگلیسی به عنوان نام کاربری
elseif(preg_match('/^[a-z0-9_-]+$/i', $username) === 0) {
    echo "نام کاربری دارای کاراکترهای غیر مجاز است!";
    $error = 1;
}

//بررسی خطا
if($error === 0) {
    //اتصال به دیتابیس
    $conn = mysqli_connect($config['host'], $config['db_user'], $config['db_pass'], $config['db_name']);

    if(!$conn) {
        echo "PHP & MySQL Connection: Error! " . mysqli_connect_errno() . ' - ' . mysqli_connect_error();
        exit;
    } else {
        echo "PHP & MySQL Connection: Ok!<br>";

        //ایمن سازی پارامترها
        $username = mysqli_real_escape_string($conn, $username);
        $password = password_hash($password, PASSWORD_BCRYPT, ['cost' => 12]);

        //نام جدول
        $tbl_name = "users";

        //اانتخاب اطلاعات از جدول و ستون
        $sql = "SELECT username FROM $tbl_name WHERE `username` = '$username' LIMIT 1";
        $query = mysqli_query($conn, $sql);

        if(!$query) {
            echo "Selecting From Table $tbl_name: Error! " . mysqli_error($conn) . '<br>';
        } else {
            //تعداد ردیف های انتخاب شده
            $count = mysqli_num_rows($query);

            if($count === 0) {

            } else {
                echo "این نام کاربری قبلا ثبت نام کرده است!";
            }
        }
    }

    //پایان اتصال
    mysqli_close($conn);
}
?>
منطق این روش ساده است، با اجرای پرس و جوی SELECT وجود نام کاربری درخواستی را در دیتابیس بررسی می کنیم، اگر این نام کاربری از قبل وجود داشته باشد تابع mysqli_num_rows مقادیر 1 را برمی گرداند و در نتیجه امکان ثبت کاربر جدید با نام مشابه میسر نیست، اما اگر تابع mysqli_num_rows مقادیر 0 را برگرداند یعنی چنین نام کاربری قبلا در سیستم ثبت نشده و به عبارتی آزاد است در نتیجه ادامه کدها اجرا می شود.

ذخیره اطلاعات با دستور INSERT در MySQL


در نهایت نوبت به گام آخر است، در این مرحله اطلاعات کاربر با دستور INSERT در دیتابیس و جدول users (ستون های username و password) ذخیره می شود تا بعدا بتوانیم در برنامه خود از این اطلاعات استفاده کنیم، با این هدف کدنویسی فایل users.php به صورت زیر تکمیل می گردد:
<!DOCTYPE html>
<html lang="fa">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>وبگو | بررسی و ثبت اطلاعات کاربر در سایت</title>
<!-- Webgoo.ir -->
<style>
body {
font-family: Tahoma, Geneva, sans-serif;
direction: rtl;
font-size: 12px;
}
</style>
</head>
<body>
<?php
//فایل تنظیمات اتصال به دیتابیس
include_once('config.php');

//تعریف توابع کلمه عبور در نسخه های پائین تر از PHP 5.5
if(!function_exists('password_hash')){
    include_once('lib/password_compat.php');
}

//دریافت و تعریف متغیرها
$username = $_POST['username'];
$password = $_POST['password'];
$repeat = $_POST['repeat'];

//پیش فرض
$error = 0;

/* بررسی معتبر بودن اطلاعات ارسالی کاربر */
//نام کاربری
if(!isset($username) || empty($username)) {
    echo "فیلد نام کاربری نباید خالی باشد!";
    $error = 1;
} //کلمه عبور
elseif(!isset($password) || empty($password)) {
    echo "فیلد کلمه عبور نباید خالی باشد!";
    $error = 1;
} elseif($password !== $repeat) {
    echo "کلمه عبور با تکرار آن همخوانی ندارد!";
    $error = 1;
} //مجاز بودن انتخاب حروف انگلیسی به عنوان نام کاربری
elseif(preg_match('/^[a-z0-9_-]+$/i', $username) === 0) {
    echo "نام کاربری دارای کاراکترهای غیر مجاز است!";
    $error = 1;
}

//بررسی خطا
if($error === 0) {
    //اتصال به دیتابیس
    $conn = mysqli_connect($config['host'], $config['db_user'], $config['db_pass'], $config['db_name']);

    if(!$conn) {
        echo "PHP & MySQL Connection: Error! " . mysqli_connect_errno() . ' - ' . mysqli_connect_error();
        exit;
    } else {
        echo "PHP & MySQL Connection: Ok!<br>";

        //ایمن سازی پارامترها
        $username = mysqli_real_escape_string($conn, $username);
        $password = password_hash($password, PASSWORD_BCRYPT, ['cost' => 12]);

        //سازگاری با حروف فارسی
        $sql = "SET NAMES 'utf8'";
        $query = mysqli_query($conn, $sql);

        //نام جدول
        $tbl_name = "users";

        //اانتخاب اطلاعات از جدول و ستون
        $sql = "SELECT username FROM $tbl_name WHERE `username` = '$username' LIMIT 1";
        $query = mysqli_query($conn, $sql);

        if(!$query) {
            echo "Selecting From Table $tbl_name: Error! " . mysqli_error($conn) . '<br>';
        } else {
            //تعداد ردیف های انتخاب شده
            $count = mysqli_num_rows($query);

            if($count === 0) {
                //ذخیره اطلاعات کاربر در دیتابیس
                $sql = "INSERT INTO $tbl_name(`username`, `password`) VALUES('$username', '$password')";
                $query = mysqli_query($conn, $sql);

                if(!$query) {
                    echo "Inserting Into Table $tbl_name: Error! " . mysqli_error($conn);
                } else {
                    echo "Inserting Into Table $tbl_name: OK!";
                }
            } else {
                echo "این نام کاربری قبلا ثبت نام کرده است!";
            }
        }
    }

    //پایان اتصال
    mysqli_close($conn);
}
?>
</body>
</html>
توضیح:
- ساختار دستور INSERT بسیار ساده است و اطلاعات را در ستون های تعیین شده به شیوه آرایه (کلید و مقدار) ذخیره می کند.
- برای جدا سازی ستون ها و مقادیر آنها از علامت , (Comma) و برای عدم بروز خطا به جهت وجود احتمالی کلمات محفوظ در پرس و جو از علامت ` (Backtick) استفاده می کنیم.
- در کد بالا جهت مثال و آشنایی بیشتر صرفا چند ستون را جهت نمونه استفاده کرده ایم، در برنامه های کاربردی می توانیم با توجه به نیاز و یساختار برنامه قابلیت های بیشتری برای ثبت نام و عضویت کاربران در نظر بگیریم و از این لحاظ محدودیتی نیست.
- برای استفاده از اطلاعات ذخیره شده ی اعضای سایت نیاز به تعریف و نوشتن کدهای دیگری است که در این مجال فرصت پرداختن به آنها نیست، این امر را به آموزش های بعدی موکول می کنیم.

دانلود نمونه فایل های آموزش


برای جمع بندی کار می توانیم فایل هایی که در این آموزش بررسی کردیم را از لینک زیر دریافت کنیم:
دانلود نمونه فایل های آموزش ساخت فرم عضویت در سایت با PHP و MySQL
sectionدسته بندی: آموزش کاربردی » MySQL
related مطالب بیشتر:
» نحوه رسم چارت و نمودار آماری با PHP و MySQL
» هوشمند سازی پنل ورود و خروج سایت با PHP و MySQL
» تعویض کد امنیتی Captcha با Ajax و MySQL
» آموزش حذف گروهی اطلاعات از MySQL با استفاده از چک باکس
» آموزش ساخت فرم تماس با PHP و MySQL
commentنظرات (۱۸۸ یادداشت برای این مطلب ارسال شده است)
more یادداشت های جدید بر اساس تاریخ ارسال در انتهای یادداشت های موجود نمایش داده می شوند.
نویسنده: عرفان
زمان: ۰۲:۲۶:۴۹ - تاریخ: ۱۳۹۶/۰۱/۱۷
سلام من کد هایی که شما گفتید را وارد کردم ولی وقتی می خواهم اجرا کنم خطای پایین رو میده
( ! ) Fatal error: Uncaught Error: Call to undefined function mysql_connect() in C:\wamp\www\Register_Form\db.php on line 3
( ! ) Error: Call to undefined function mysql_connect() in C:\wamp\www\Register_Form\db.php on line 3
پاسخ: 
PHP در نسخه های جدید دیگر از اکستنشن قدیمی mysql پشتیبانی نمی کند و احتمالا نسخه PHP شما به روز است، این پست در زمانی تهیه شده که هنوز اکستنشن mysql منسوخ نشده بود و در حال حاضر آموزش نیاز به بروزرسانی دارد، لذا با توجه به این موضوع خطای عدم وجود تابع اتصال به دیتابیس دریافت می کنید، راه حل این مشکل استفاده از اکستنشن mysqli است که شباهت زیادی با mysql دارد، کافی است در این رابطه کمی جستجو نمائید.
نویسنده: najme
زمان: ۲۳:۱۱:۰۴ - تاریخ: ۱۳۹۶/۰۱/۳۰
سلام ممنون بابت اموزش خوبتون
قطعه کد اولی با عنوان (ایجاد جدول و ردیف با دستور CREATE) باید کجا نوشته بشه ، من با ومپ سرور کار میکنم.
چطوری کانکت با mysql برقرار می شه ، من اون قطعه کد رو توی دریم ویور نوشتم ولی دیتابیسی ساخته نشده، خیلی گیج شدم، ممنون میشم راهنمایی کنید.
پاسخ: 
استفاده از آموزش های کاربردی مستلزم این است که پیشتر با آموزش های مقدماتی آشنا باشید، در هر صورت برای اتصال با دیتابیس قبل از هر چیز باید از طریق برنامه phpMyAdmin یک دیتابیس ایجاد کرده و یک کاربر داشته باشید (این کاربر در سرور مجازی معمولا با عنوان root و بدون پسورد است)، سپس اطلاعات کاربر و دیتابیس را در کدهای PHP و تابع اتصال به دیتابیس جایگزین نمائید، کدها را در یک فایل با پسوند php ذخیره و در پوشه www سرور مجازی قرار دهید، به این ترتیب با فراخوانی فایل از مرورگر (با localhost) می توانید آن فایل PHP را اجرا نمائید، به طور مثال اگر نام فایلتان example.php باشد، این آدرس باید در مرورگر وارد شود:
localhost/example.php
نویسنده: setare
زمان: ۱۹:۳۴:۰۳ - تاریخ: ۱۳۹۶/۰۷/۱۲
سلام من کدای بالا رو نوشتم اول درست کار میکرد ولی دفعه های بعد که ثبت رو میزنم خط آخر کد یعنی
<html/>
رو خطا میده، چند دفعه کد رو چک کردم ولی نفهمیدم اشکال کجاست. باید چکار کنم؟
پاسخ: 
در صورتی که کدها در سایت آنلاین استفاده شده اند، لطفا آدرس یک نمونه صفحه را جهت بررسی درج کنید، در غیر این صورت نمونه فایل ها را از طریق ایمیل سایت (موجود در فرم تماس) برای ما ارسال نمائید تا بررسی شود.
نویسنده: سارا
زمان: ۱۹:۲۶:۲۳ - تاریخ: ۱۳۹۶/۰۷/۱۶
سلام
من دارم یه سایت مدرسه طراحی میکنم در قسمت منو ورود سه تا ورود دارم برای مدیر و معلم و دانش آموز چند تا سوال دارم میدونم زیاد به این بخشتون ربط نداره ولی واقعا به کمکتون نیاز دارم خیلی ممنون میشم اگه راهنماییم کنین. یکی اینکه چه جوری مشخص کنم که این مشخصاتی که وارد کردن درسته و وارد سایت بشن دوم اینکه چه جوری دانش آموز نمرش رو ببینه یا معلم نمره ی دانش آموز رو وارد کنه ... منتظر جوابتونم
پاسخ: 
سوالتان کلی است و پاسخ کوتاهی ندارد، سوالات مطرح شده به بخش های مختلف برنامه نویسی PHP مرتبط می شوند، به طور مثال برای بررسی مشخصات و ورود به سایت باید با مبحث نشست (Session) در PHP آشنا باشید همچنین آشنایی با نحوه کار پایگاه داده MySQL جزء ملزومات اولیه است، در کل باید دانش برنامه نویسی وب را تا حدودی فرا گرفته باشید.
نویسنده: سارا
زمان: ۱۳:۳۹:۲۹ - تاریخ: ۱۳۹۶/۰۷/۱۷
اگر یک منبعی برای مطالعه در این مورد بهم پیشنهاد بدین خیلی ممنونتون میشم
پاسخ: 
برای کدنویسی این موارد باید برنامه نویسی PHP را از پایه فرا بگیرید، منابع مختلف و خوبی در وب و همچنین به صورت مکتوب وجود دارد که با یک جستجوی ساده می توانید به آنها دسترسی داشته باشید.
نویسنده: صدرا
زمان: ۱۵:۵۲:۳۵ - تاریخ: ۱۳۹۶/۱۱/۱۰
سلام من میخوام برای فرم عضویت و ورودم که از نام و نام خانوادگی افراد هم استفاده میشه یک چک برای کامل تر بنویسم که اجازه بده از حروف فارسی هم استفاده بشه درون فیلد نام و نام خانوادگی ولی نمیدونم چجوری باید اون رو توی تابع preg_match بنویسم. اگه راهنمایی کنید ممنون میشم. تشکر از مطلب خوبتون.
پاسخ: 
برای پشتیبانی تابع preg_match از زبان فارسی می توانید از مودیفایر u استفاده کنید، مثال:
if (preg_match('/^[a-z0-9 _-آ-ی]+$/iu', $username) === 0){
echo "نام کاربری دارای کاراکترهای غیر مجاز است!";
$check_error = 1;
} else{
//ok
}
نویسنده: محمد
زمان: ۱۱:۴۴:۴۳ - تاریخ: ۱۳۹۸/۰۳/۰۱
سلام ممنون بابت آموزش رایگان که در اختیار ما گذاشتید
جسارتا چطور میشه افزودن فیلد عکس ر به این فرم اضافه کرد؟
پاسخ: 
برای افرودن فیلد تصویر به فرم، در کدهای HTML از input با نوع file استفاده کنید، در سمت سرور و کدهای PHP نیز باید با نحوه دریافت و مدیریت فایل آپلود شده آشنا باشید، آموزش جداگانه ای در این خصوص در سایت وجود دارد، لطفا عبارت "آپلود فایل در PHP + وبگو" را در گوگل جستجو کنید.
نویسنده: Edward ASharp
زمان: ۰۰:۰۲:۲۱ - تاریخ: ۱۳۹۹/۰۲/۳۰
سلام میشه همين فایلای کاملشو به من بدید؟
پاسخ: 
در انتهای همین آموزش می توانید فایل ها را دانلود کنید.
more لطفا پیش از ارسال یادداشت نکات زیر را مد نظر داشته باشید:
- مواردی که به کلی خارج از موضوع این مطلب هستند را در فرم منوی "تماس با ما" مطرح و پاسخ را از طریق ایمیل دریافت کنید.
- به سوالات کلی، مبهم، غیرضروری و مشکلاتی که تلاشی برای رفع آن نکرده باشید پاسخ کوتاه و مختصر داده خواهد شد!
- کدها و اسکریپت های طولانی را ترجیحا در یک صفحه وب آنلاین قرار دهید تا امکان تست و بررسی وجود داشته باشد.
- تمام یادداشت ها بررسی و برای هر کاربر زمان مشخصی جهت پاسخگویی در نظر گرفته می شود، لطفا از طرح سوالات متعدد در بازه زمانی کوتاه خودداری کنید.





9 × 7
 refresh
آخرین دیدگاه ها
more برای دسترسی سریع به یادداشت مربوطه می توانید از لینک مطلب در کادر زیر استفاده کنید.
form سحر
در:
سلام من وقتی میخوام توی قسمت صفحات جداگانه وبلاگم گزینه ادامه مطلب رو بیارم باید چیکار کنم چون فقط قسمت نوشته جدید همچین قابلیتی...
۱۵:۰۸:۱۹ ۱۳۹۹/۰۳/۰۸

form علی
در:
با سلام و درود فراوان یه کد جاوا دارم می خوام هر ثانیه نام یه فایل یا پوشه ای رو بگیرم برای مقایسه تا...
۱۱:۰۶:۲۲ ۱۳۹۹/۰۳/۰۸

form علیرضا
در:
با سلام مجدد در پاسخ یکی از کامنت هایم فرمودین که جهت فراخوانی (اجرای) یک فایل در سرور راس ساعت مشخص و صرف...
۱۱:۲۸:۲۴ ۱۳۹۹/۰۳/۰۵

form علیرضا
در:
سلام اگر بخواهیم صفحات سایت رأس ساعت مشخصی مثلا ساعت 12 ظهر رفرش بشه چه کدی رو باید استفاده کنیم. ممنون
۰۴:۴۳:۴۷ ۱۳۹۹/۰۳/۰۵

form علی
در:
با سلام من یه فانکشن نوشتم چطور میشه از توی جاوااسکریپت اون رو صدا بزنم در حقیقت می خوام از توی جاوا یه فانکشنی...
۲۰:۵۹:۰۹ ۱۳۹۹/۰۳/۰۴

form رویا
در:
سلام. خسته نباشید من جدیدا در بلاگفا وبلاگی راه اندازی کردم اما مشکلی دارم. وقتی قسمتی از متن رو انتخاب میکنم و لینک میکنم،...
۱۹:۵۴:۰۰ ۱۳۹۹/۰۳/۰۴

form علی
در:
چطور میشه همزمان با کلیک بر روی «تعویض کد» یعنی کد زیر: پوشه ساخته بشه. با سپاس
۰۹:۵۰:۲۷ ۱۳۹۹/۰۳/۰۳

form علی
در:
با سلام... من یه متغیر تعریف کردم مثلا رو بهش متصل کنیم ممنون از پاسختون.
۰۶:۱۶:۲۷ ۱۳۹۹/۰۳/۰۳

form یاسمن
در:
سلام یه برنامه ای که رشته رو به عنوان password دریافت کنه و کاراکتر فاصله نباشد طول رشته هم از 8 تا 50 باشه عدد...
۱۸:۵۲:۴۴ ۱۳۹۹/۰۳/۰۲

form مرتضی ق
در:
سلام خسته نباشید. یک سایت اصلی و مادر دارم مثلا www.m.com حالا سه سایت دیگر زیر مجموعه مثلا m1 و m2 و m3 من...
۱۸:۲۵:۱۱ ۱۳۹۹/۰۳/۰۲

form میترا
در:
با سلام ببخشید مطلبتون خیلی خوب بود یه سوال من با فتوشاپ انلاین کار می کنم نمی دونم چرا نمی تونم باهاش...
۱۸:۱۵:۱۰ ۱۳۹۹/۰۳/۰۲

form fatemeh
در:
پاراگراف زیر را داریم. چه تنظیماتی در CSS و HTML نیاز است تا در صفحه وببدرستی نمایش داده شود؟ میشه برا جواب این سوال...
۱۶:۳۲:۲۳ ۱۳۹۹/۰۳/۰۱

form علی
در:
با سلام و عرض ادب من یه فانکشن تعریف کردم و کدهای فایل ajax-loading-message.php رو درونش گذاشتم
۰۸:۴۲:۲۱ ۱۳۹۹/۰۳/۰۱

form Maryam
در:
سلام .. من میخاستم کدی بنویسم که خروجی آن دکمه on .. of باشه که با زدن دکمه رنگ پس زمینه تغییر کند ممنون میشم...
۰۲:۲۱:۳۴ ۱۳۹۹/۰۲/۳۱

form amir
در:
سلام ممنون از سایت خوبتون چطور میشه با جاوااسکریپت ایجکس و پی اچ پی بتونم تمامی جدول های دیتابیس رو هر کدوم با یه...
۲۰:۴۵:۵۲ ۱۳۹۹/۰۲/۳۰
form علی
در:
با سلام و عرض ادب بسیار سایت پر محتوایی دارید تبریک... می خواستم بپرسم اگر بخواهیم مثلا کاربر روی یک لینکی در سایت...
۰۷:۲۲:۰۱ ۱۳۹۹/۰۲/۳۰
form Edward ASharp
در:
سلام میشه همين فایلای کاملشو به من بدید؟
۰۰:۰۲:۲۱ ۱۳۹۹/۰۲/۳۰
form میکاییل
در:
سلام من پروزه ای دارم با mvc نوشته شده و در روت سایت فایل htacsess دارم که کد های زیر توشه ...
۰۲:۳۰:۰۲ ۱۳۹۹/۰۲/۲۹
form mahdi
در:
سلام استاد عزیز ، این درسته که با node.js دیگه نیازی به یادگیری php نخواهیم داشت؟
۲۲:۳۹:۳۶ ۱۳۹۹/۰۲/۲۸
form امیر مهدی
در:
سلام ممنونم از اینکه کمکم کردید ولی من منو رو با زیر منوها می خواستم کد شما زیر منوها رو از بین برد. منظور من...
۲۲:۳۰:۱۵ ۱۳۹۹/۰۲/۲۸
form امیر مهدی
در:
سلام. من در طراحی منو سایت با مشکل برخوردم. من منو خودم رو ساختم و متوجه شدم که منو من مقداری فضا از سمت چپ...
۱۹:۲۴:۰۱ ۱۳۹۹/۰۲/۲۸
form امین
در:
خیلی خیلی ممنون از اینکه جواب دادید اما الان که امتحان کردم مجموع همه ی سفارشات رو میزنه یعنی اگر 3 نفر سفارش دادن...
۱۳:۴۶:۵۵ ۱۳۹۹/۰۲/۲۸
form امین
در:
درود به شما خسته نباشید یک سوال داشتم خیلی گشتم اما پیدا نکردم من دیتابیسی برای مثال invert دارم میخوام یک صفحه...
۰۱:۰۰:۴۵ ۱۳۹۹/۰۲/۲۸
form امیر
در:
عالی بود. سپاس گذارم
۱۰:۱۹:۴۴ ۱۳۹۹/۰۲/۲۷
form فرامرز اسماعیلی
در:
سلام خسته نباشید. من داخل ویرایشگرهای notepad++ یا Braket دستور html رو می نویسم یعنی فایل متنی به صورت index.html رو می خواهم اجرا کنم...
۲۲:۴۱:۴۳ ۱۳۹۹/۰۲/۲۶
form پری
در:
سلام بعضی از سایت ها وقتی اهنگ بعدی رو پلی میگنیم اهنگ قبلی که در حال پخش است به طور خودگار قطع میشود میشه این...
۱۴:۲۲:۲۵ ۱۳۹۹/۰۲/۲۶
form ilia Delbar
در:
خیلییییییییییی خوبه! فقط دلم می خواد یه برنامه درست کنم رنگ ها رو نشون بده (رنگ تگ ها)
۱۳:۱۵:۱۹ ۱۳۹۹/۰۲/۲۶
form زهیر صفری
در:
با سلام چطور میتونم تاریخ تولد فرد ایرانی رو بگیره مثلا از input و سن فرد رو در input بعدی نمایش بده میتونید...
۱۲:۳۸:۵۷ ۱۳۹۹/۰۲/۲۶
form حبیب
در:
با سلام بنده از طریق مودم خانه به اینترنت وصل شدم هم با کامپیوتر و هم با موبایل. اما ای پی در هر...
۰۳:۱۲:۵۴ ۱۳۹۹/۰۲/۲۶
form امین
در:
سلام خسته نباشید امیدوارم جوابمو بدید من داخل یک صفحه این کد جاوا رو دارم میخوام خروجی که میده رو داخل...
۱۳:۴۴:۳۳ ۱۳۹۹/۰۲/۲۵
form امیر هادی نجاتی
در:
ممنون از شما. این قسمت (استفاده از جاوا اسکریپت برای غیر فعال کردن کلیک راست) واقعا به دردم خورد .
۲۱:۰۳:۵۰ ۱۳۹۹/۰۲/۲۴
form لیلا
در:
سلام ، ببخشید من میخوام یک مدرک رو در سایت آپلود کنم ولی ارور زیر رو میده . میشه راهنماییم کنید. ممنون
۱۴:۵۲:۴۷ ۱۳۹۹/۰۲/۲۴
form زهرا جعفری
در:
با سلام بنده میخواهم در جاوااسکریپت یک textbox داشته باشم که در آن یک دکمه چشمک زن بذارم وسط متن و وقتی روی...
۱۰:۰۱:۵۱ ۱۳۹۹/۰۲/۲۴
form جواد
در:
سلام. مقادیر و اطلاعاتی از یک سایت دیگه با همین متد file get contents میگیرم که روی لوکال هاست سرعتش خوبه، روی سرور هم بد...
۲۲:۰۳:۲۲ ۱۳۹۹/۰۲/۲۳
form علی رضایی
در:
در خط آخر خطای نحوه ارسال آرگومان می دهد. خطای syntax است یا دستور مورد دارد؟
۱۳:۲۹:۴۹ ۱۳۹۹/۰۲/۲۳
form علی
در:
سلام میخوام مطالب مرتبط با موضوعات سایتم رو در پایین اونها نمایش بدم چجوری میتونم این کار رو بکنم
۰۱:۲۸:۰۰ ۱۳۹۹/۰۲/۲۳
form امیرحسین
در:
با سلام. من تو css میخوام از اتریبیوت border-radius استفاده کنم ولی وقتی مقدارشو مثلا توی div زیاد میذارم متن داخل div بیرون میاد میخواستم...
۱۹:۵۲:۳۰ ۱۳۹۹/۰۲/۲۲
form امیرعلی
در:
با سلام بنده میخواستم بدانم که میشود تگ div را با این روش ها پنهان کرد من میخواهم افزونه ی وردپرسی را...
۱۲:۳۹:۲۶ ۱۳۹۹/۰۲/۲۲
form یوسف رضایی
در:
با سلام و خسته نباشید خواستم بپرسم خروجی یک فرم (با چند گزینه) بر روی برووزر که اماده برای ارسال برای سرور هست را توی...
۱۱:۱۴:۰۳ ۱۳۹۹/۰۲/۲۲
form سعیده
در:
سلام من یه اهنگ که تو وبلاگم میزارم صفحه پخش اهنگ میاد و بلندگوش ولی اون مثلث پلی کنندش نمیاد یعنی عملا واسم...
۱۵:۴۱:۰۵ ۱۳۹۹/۰۲/۲۱
form مجید اسکندری فر
در:
سلام حدود 700 تصویر رو در وبلاگم بارگذاری کردم و حدود 6000 بازدید داشته علت عدم نمایش تصاویر بارگذاری شده در وبلاگم چیست؟ خیلی زحمت...
۱۰:۳۲:۴۵ ۱۳۹۹/۰۲/۲۱
form علیرضا
در:
سلام، ممنون از مطلب کاملتون یه نکته رو هم من اضافه کنم برای کاملتر شدن مقاله، هر آدرس آی پی از یک شناسه هاست...
۰۹:۳۷:۵۰ ۱۳۹۹/۰۲/۲۱
form mahdi
در:
سلام استاد عزیز ، خیلی ممنون از راهنمایی ، انجامشون میدم، فکر میکنم همه این کارارو بلد باشم فقط WYSIWYG رو اصلا نشنیده بودم که...
۰۷:۱۸:۳۷ ۱۳۹۹/۰۲/۲۱
form معصومه
در:
سلام، امروز دیدم که عکس های وبلاگم حذف شده چرا؟ چطور میتونم برشون گردونم؟ عکس ها رو از سایت پیکو فایل آپلود میکردم، هرچقدرم سعی...
۱۴:۵۳:۵۱ ۱۳۹۹/۰۲/۲۰
form mahdi
در:
سلام استاد عزیز و گرامی ، یه درخواستی داشتم ازتون میخوام اگه براتون ممکنه من رو در جاوا اسکریپت بسنجی که بدونم چیا بلدم...
۱۴:۱۸:۵۸ ۱۳۹۹/۰۲/۱۹
form امیر
در:
با سلام، خدمت دوستان عزیز دو جدول به نام‌های Messages و Comments موجود هستند. در جدول Comments فیلدی به نام IDElement وجود دارد که...
۰۵:۲۹:۳۸ ۱۳۹۹/۰۲/۱۹
form ehsan hoseini sianaki
در:
سلام خیلی عالی و کاربردی بود. خسته نباشید.
۲۳:۰۰:۵۱ ۱۳۹۹/۰۲/۱۷
form امید
در:
با سلام و عرض ادب فیلتری میخوام که تعداد جوابهای فیلترهای سایت tse بورس که با جاوا نوشته شده رو بگه مثلا قرار...
۰۰:۱۰:۵۱ ۱۳۹۹/۰۲/۱۷
form احسان
در:
سلام ببخشید من هر کار میکنم تو گوشی اندروید با Html یه عکس رو در سایت خودم بزارم هیچی نمیشه فقط یه علامت عکس میاد...
۲۲:۲۸:۳۷ ۱۳۹۹/۰۲/۱۶
form hasti
در:
سلام . وقت بخیر . میشه مثالی بزنید که right over join برابر با inner join (داخلی) بشه . /با order و customer/ ...
۲۰:۰۵:۱۷ ۱۳۹۹/۰۲/۱۶
form میثم
در:
سلام مجدد من دیگه اینقدر با این کدها ور رفتم دیوونه شدم. این کل تابع منه. شما می تونید برای حل مشکلی که...
۱۷:۳۰:۳۱ ۱۳۹۹/۰۲/۱۶
form میثم
در:
سلام در تکمیل سوالی که خدمت شما عرض شد: ببینید ما دو تا فیلد فایل داریم توی اولی عکس اپ میشه و توی...
۱۶:۲۶:۲۶ ۱۳۹۹/۰۲/۱۶
form ماردین
در:
سلام من میخواستم ببینم چکار کنم که اولین query رو بدون حذف بقیه query ها حذف کنم
۱۵:۵۲:۵۴ ۱۳۹۹/۰۲/۱۶
form میثم
در:
سلام یه سوال خدمت شما داشتم. من با جاوا اسکریپت میخوام بخش فایل توی فرمم رو چک کنم. توی فرم 2 تا فیلد...
۱۱:۴۷:۵۲ ۱۳۹۹/۰۲/۱۶
form amir mtf
در:
سلام ببخشید من میخواستم در تگ این‌پوت برخی از کلمات و علامت ها رو حذف کنم. یک درخواست دیگر هم دارم اگه میشه کد...
۱۲:۳۷:۰۵ ۱۳۹۹/۰۲/۱۵
form کیوان
در:
سلام ممنون از سایت خوبتون، من یه فرم دارم که اطلاعاتش رو از دیتابیس میگیره، چطور میتونم با نوشتن حلقه بعد از چاپ سه...
۱۸:۲۲:۲۴ ۱۳۹۹/۰۲/۱۳
form mohammad
در:
آموزشتون خیلی فهما و دقیق بود ممنون
۲۱:۵۵:۳۸ ۱۳۹۹/۰۲/۱۲
form محمودی
در:
سلام چطوری میتونم برای سایت ثبت نام کدبورسی و ثبت نام ارز دیجیتال بک لینک بگیرم
۱۵:۲۶:۰۷ ۱۳۹۹/۰۲/۱۲
در انتظار بررسی: ۰