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 بدون کلمه عبور کاربرد دارد اما در سرور آنلاین باید از قسمت ساخت دیتابیس یک نام کاربری و کلمه عبور نیز ایجاد و به دیتابیس متصل کنیم.

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


در گام دوم و بعد از ساخت دیتابیس باید جدولی در پایگاه داده خود با نامی دلخواه بسازیم و ستون هایی را در آن برای نگهداری نام کاربری، کلمه عبور و سایر اطلاعات مورد نیاز ایجاد کنیم، بدین منظور از دستور CREATE TABLE در MySQL استفاده می کنیم، در نمونه کد زیر سه ستون id، username و password را در جدول فرضی users ساخته ایم.
<?php
//اتصال به دیتابیس
$conn = mysqli_connect("localhost", "username", "password", "dbname");
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>
<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;
}
</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">
<input type="submit" value="عضویت">
</form>
<hr>
قبل از اجرای این فایل ابتدا باید اطلاعات اتصال به دیتابیس را در دو فایل create.php و users.php در تابع mysqli_connect تعریف کرده باشیم، همچنین فایل create.php یک بار باید اجرا گردد تا جدول و ستون ها در دیتابیس ایجاد شوند.
</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'];
?>
توضیح:
- با روش بالا نام کاربری از فیلد username دریافت و در متغیر username ذخیره می شود، همچنین کلمه عبور از فیلد password دریافت و در متغیر password ذخیره می شود، با این کار اطلاعات کاربر در هنگام اجرای برنامه PHP در دسترس است و می توانیم پردازش های مورد نظر را روی آن اعمال کنیم.
- دقت کنیم معمولا آنچه برای PHP در کار با فرم HTML اهمیت دارد متد استفاده شده (POST یا GET) و پارامتر name فیلدها است، سایر موارد مانند ID صرفا جنبه سمت کاربر دارند و به سرور ارسال نمی شوند.

بررسی معتبر بودن اطلاعات


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

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

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

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


اگر همه چیز درست باشد و کاربر فیلدها را به طور کامل تکمیل و ارسال نماید نوبت به مرحله ذخیره اطلاعات در دیتابیس است، اما قبل از اینکه به این گام بپردازیم یک امر مهم را نباید فراموش کنیم:
حفظ امنیت اطلاعات و پایگاه داده!
در برنامه نویسی PHP و هنگام ارتباط با MySQL رعایت مسائل امنیتی کار با پایگاه داده ضروری است، اگرچه عمده کاربران هیچ سوء نیتی نداشته و صرفا به دنبال محتوای مدنظرشان هستند اما ممکن است هکرهایی پیدا شوند که مترصد کوچکترین فرصتی برای نفوذ و آسیب زدن به برنامه ما باشند، از طرفی ذخیره اطلاعات حساس و به فرض کلمه عبور کاربران باید به صورت رمزی شده باشد تا امکان هر نوع سوء استفاده احتمالی را از بین ببرد و ضریب امنیت را افزایش دهد، باید همواره زمانی را فرض کنیم که بخشی از اطلاعات پایگاه داده به هر دلیل در اختیار هکرها قرار گرفته است، در این حالت اگر اطلاعات رمزی شده باشد قاعدتا استفاده چندانی برای مهاجم نخواهد داشت و حداقل اگر نگوئیم ناممکن ولی احتمال بازیابی بسیار بعید خواهد بود، به هر صورت در برنامه نویسی رویه ای PHP با اکستنشن MySQLi بدین منظور از توابع mysqli_real_escape_string و crypt استفاده کرده ایم:
<?php
//دریافت و تعریف متغیر ها
$username = $_POST['username'];
$password = $_POST['password'];

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

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

//بررسی خطا
if($check_error === 0){
    //اتصال به دیتابیس
    $conn = mysqli_connect("localhost", "username", "password", "dbname");
    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 = crypt($password);
    }
    //پایان اتصال
    mysqli_close($conn);
}
?>
توضیح:
- تابع mysqli_real_escape_string نیاز به آبجکت اتصال به پایگاه داده (متغیر conn) دارد در غیر اینصورت با خطا مواجه خواهیم شد، از این تابع برای جلوگیری از حملات موسوم به MySQL Injection یا نفوذ به دیتابیس استفاده می کنیم.
- از تابع crypt برای رمزی کردن یک طرفه رشته ها استفاده می کنیم، اگرچه هیچ سیستمی به طور کامل ایمن نیست اما با استفاده از تابع crypt تا حدود زیادی امنیت کلمه های عبور کاربران حفظ می شود.
نکته 1: کلمه های عبور رمزنگاری شده با تابع crypt به هیچ وجه قابل بازیابی به حالت اولیه نیستند و برای کاربرانی که کلمه عبور خود را فراموش کرده اند باید سیستم بازیابی کلمه عبور جدید در نظر گرفته شود.
نکته 2: برای تطبیق کلمه عبور به طور مثال در هنگام ورود کاربر به سایت باید اطلاعات ارسالی مجدد از فیلتر تابع crypt به صورت نمونه زیر عبور کند:
//روش تطبیق برای ورود کاربران
$password = crypt($password, $db_hashed_password);
if(hash_equals($db_hashed_password, $password)) {
    //کاربر مجاز به ورود است!
}
در این شیوه متغیر password مقادیر ارسال شده از فرم HTML و متغیر db_hashed_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 نیز در تئوری روش رمزنگاری بدون بازگشت است، در واقع برگردان پسوردهای قوی رمزنگاری شده با این تابع در سیستم های متداول بسیار زمانبر و دشوار است، با این حال با توجه به قدرت سخت افزاری سیستم های جدید و امکان وقوع حملات Brute-force استفاده از این تابع برای رمزنگاری کلمه عبور دیگر توصیه نمی شود و بهتر است از روش های جایگزین مانند تابع crypt استفاده شود.

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


علاوه بر اعتبارسنجی اولیه مقادیری که برای ثبت نام در سایت ارسال می شوند باید از قابل ثبت و آزاد بودن نام کاربری نیز مطمئن شویم، منظور از قابل ثبت و آزاد بودن این است که بررسی کنیم نام کاربری درخواستی از قبل در دیتابیس وجود نداشته باشد، دلیل این کار روشن است و مشخص است که دو یا چند نام کاربری مشابه در یک سیستم باعث ایجاد مشکل در شناسایی کاربران از هم خواهد شد، بدین منظور پرس و جوی SELECT زیر را به کدهای برنامه اضافه می کنیم:
$sql = "SELECT username FROM $tbl_name WHERE `username` = '$username' LIMIT 1";
$query = mysqli_query($conn, $sql);
$count = mysqli_num_rows($query);

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

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

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

//بررسی خطا
if($check_error === 0){
    //اتصال به دیتابیس
    $conn = mysqli_connect("localhost", "username", "password", "dbname");
    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 = crypt($password);

        //نام جدول
        $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 INTO در دیتابیس و جدول users (ستون های username و password) ذخیره می شود تا در برنامه خود از آنها استفاده کنیم، با این هدف کدنویسی فایل users.php به صورت زیر تکمیل می گردد:
<!DOCTYPE html>
<html>
<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
//دریافت و تعریف متغیر ها
$username = $_POST['username'];
$password = $_POST['password'];

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

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

//بررسی خطا
if($check_error === 0){
    //اتصال به دیتابیس
    $conn = mysqli_connect("localhost", "username", "password", "dbname");
    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 = crypt($password);

        //سازگاری با حروف فارسی
        $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 INTO بسیار ساده است، اطلاعات را در ستون های تعیین شده به شیوه آرایه (کلید و مقدار) ذخیره می کند، برای جدا سازی ستون ها و مقادیر آنها از علامت , استفاده می کنیم.
- در کد بالا صرفا جهت مثال و آشنایی بیشتر چند ستون را جهت نمونه استفاده کرده ایم، در برنامه های کاربردی می توانیم با توجه به نیازمان قابلیت های بیشتری برای ثبت نام و عضویت کاربران در نظر بگیریم و از این لحاظ محدودیتی نیست.
- برای استفاده از اطلاعات ذخیره شده ی اعضای سایت نیاز به تعریف و نوشتن کدهای دیگری است که در این مجال فرصت پرداختن به آنها نیست، این امر را به آموزش های بعدی موکول می کنیم.

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


برای جمع بندی کار می توانیم فایل هایی که در این آموزش بررسی کردیم را از لینک زیر دریافت کنیم:
دانلود نمونه فایل های آموزش ساخت فرم عضویت در سایت با PHP و MySQL
sectionدسته بندی: آموزش کاربردی » MySQL
related مطالب بیشتر:
» نحوه رسم چارت و نمودار آماری با PHP و MySQL
» جستجو در مطالب سایت با استفاده از MySQL Full-Text
» صفحه بندی مطالب و محتوا با PHP و MySQL
» آموزش حذف گروهی اطلاعات از MySQL با استفاده از چک باکس
» آموزش ساخت پنل ورود و خروج سایت با PHP و MySQL
commentنظرات (۱۸۷ یادداشت برای این مطلب ارسال شده است)
more یادداشت های جدید بر اساس تاریخ ارسال در انتهای یادداشت های موجود نمایش داده می شوند.
نویسنده: Guest
زمان: ۱۸:۵۷:۱۱ - تاریخ: ۱۳۹۱/۰۹/۱۸
سلام خدمت شما
ببخشید کدی که به دوست عزیز Sajadpm دادین رو مثلا اگه روی همین فرم ثبت نامی که شما که اموزش دادین فراخوانی کنیم ارور میده !
این کد رو عرض میکنم :
$query = 'SELECT ps_username FROM db1_ps_user WHERE ps_username = "' . $ps_username . '" AND ps_userprivilegien != "' . 'guest' .'"';
$result = mysql_query($query, $db) or die(mysql_error());
if (mysql_num_rows($result) > 0) {
$errors[] = 'نام کاربري ' . $ps_username . ' قبلا ثبت شده است';
$ps_username = '';
}
در حالی که خودتون توی صفحه اول یه کد رو قرار دادین به این صورت :
$check_user=mysql_query("SELECT * FROM register WHERE username='$username'")
or die(mysql_error());
if(mysql_num_rows($check_user) > 0){
echo "این نام کاربری قبلا ثبت شده است!";
$check_error = 1;
}
این کد روی همین فرم جواب میده ! اما کد اولی نه !
ممنون میشم کد اولی ( همونی که واسه ی دوست عزیزمون sajadpm گذاشتین ) رو مطابق کدهای همین فرم قرار بدین ! با تشکر
پاسخ: 
سلام
کد مورد نظر مربوط به یک دیتابیس دیگر با ساختاری متفاوت است، برای سازگاری با آموزش فعلی باید نام جداول و ستون ها را به درستی ویرایش کنید، به هر صورت این پارامتر را به راحتی می توان به پرس و جو اضافه کرد، به طور مثال:
<?php
$check_user=mysql_query("SELECT * FROM register WHERE username='$username' AND username != 'guest'")
or die(mysql_error());
if(mysql_num_rows($check_user) > 0){
echo "این نام کاربری قبلا ثبت شده است!";
$check_error = 1;
}
?>
نویسنده: محمد
زمان: ۱۰:۵۹:۳۵ - تاریخ: ۱۳۹۱/۰۹/۲۸
اگر امکان دارد طریقه فرستادن یک کد فعالسازی به ایمیل کاربر و یا یک لینک که با کلیک روی آن کاربر به سایت برگردد و ثبت نامش تکمیل شود را هم توضیح دهید. ممنون.
پاسخ: 
اگرچه توضیح کامل مطلب در این قسمت نمی گنجد، ولی به طور خلاصه و تئوری کار سختی نیست، لازمه اول آشنایی با نحوه ارسال ایمیل در php است که آموزش های آن چه در وب و چه در سایت وجود دارد، سپس وقتی کاربر ثبت نام می کند یک کد اختصاصی برای او در دیتابیس ذخیره کنید (این کد اختصاصی بستگی به خود شما دارد، می تواند آی دی کاربر، hash نام کاربری او یا یک رمز رندوم و... باشد)، یک ستون (در دیتابیس) هم به عنوان به فرض حالت فعال یا غیر فعال (پیش فرض) در نظر بگیرید، سپس در ایمیل ارسالی رمز اختصاصی کاربر را در یک لینک به عنوان پارامتر قرار دهید، به طور مثال:
http://www.yoursite.com/register.php?do=active&hash=3kdi8s65ysha0eptic9463hdh
این لینک می تواند به مقصد یک فایل در سرور شما باشد که رمز کاربر را چک می کند و اگر درست بود وضعیت او را به حالت فعال تغییر می دهد.
نویسنده: پوریا
زمان: ۲۱:۴۷:۵۱ - تاریخ: ۱۳۹۱/۱۱/۰۴
سلام .
من بخاطر این که تازه واردم میشه به من بگید دیتابیس چیست؟
پاسخ: 
سلام
دیتابیس در اصطلاح به معنی محل ذخیره، دسته بندی و بازیابی اطلاعات است که بدین منظور معمولا در زبان های برنامه نویسی مختلف برنامه های مدیریت دیتابیس (DBMS یا DataBase Management System) مختلفی نیز وجود دارد، به طور مثال برای PHP سیستم مدیریت دیتابیس MySQL جزء معروف ترین ها است، به وسیله این برنامه می توانید بین کدهای php و پایگاه داده خود ارتباط برقرار کنید، به فرض اسامی خاصی را در پایگاه داده و در ردیف های دلخواه (نام، نام خانوادگی و...) ذخیره کنید (شبیه یک جدول در اکسل).
نویسنده: iman
زمان: ۱۳:۲۶:۳۸ - تاریخ: ۱۳۹۱/۱۱/۰۵
سلام مرسی از آموزش خوبتون، من یه فیلد تکرار رمز عبور اضافه کردم بعد دنبال یه دستوری میگردم که این دو تا فیلد رو چک کنه اگه یکسان بود کاربر رو ثبت نام کنه ... لطفآ راهنمایی کنید، تشکر
پاسخ: 
سلام
برای این کار کافی است رمز عبور و تکرار آن را با هم با استفاده از یک دستور شرطی if و با علامت === مقایسه کنید، اگر برابر بودند ثبت نام انجام شود و در غیر این صورت قسمت دیگری از کد اجرا شود، مثال:
if($password === $password_r){
//ثبت نام
}
else{
//خطا
}
نویسنده: ady
زمان: ۱۱:۰۳:۱۰ - تاریخ: ۱۳۹۱/۱۱/۰۸
با سلام و خسته نباشید و تشکر فراوان از سایت عالی شما. بنده نیاز به یک فرم کامل ثبت نام دارم که در آن آدرس ایمیل کاربر، تکرار پسورد و کلا فیلدهای استاندارد را داشته باشه و همچنین صفحه لاگین که کوکی هم ارسال کنه برای به یاد داشتن پسورد و قسمت فراموش کردن پسورد و راهنمایی کاربر از طریق ایمیل را نیز داشته باشه.
میخواستم بدونم آیا آموزشهای شما این سطوح را هم یاد میده و آیا امکانش هست که شما این سورس را در اختیار بنده قرار بدید؟
بی نهایت از محبت های شما سپاسگزارم
پاسخ: 
سلام
سورس آماده ای برای مواردی که گفتید در اختیار نداریم، باید کدها را به صورت سفارشی بنویسید، اما تقریبا آموزش تمام قسمت های فرم مورد نظر در سایت گفته شده و وجود دارد.
نویسنده: شهاب
زمان: ۲۱:۲۹:۴۷ - تاریخ: ۱۳۹۱/۱۱/۰۹
سلام استاد من میخوام وقتی رو دکمه سابمیت میزنیم بره تو یه صفحه داینامیک از این صفحه ها که نمیشه بک زد توش :دی لظفآ راهنماییم کنیم. صفحه های داینامیک رو چطوری باید بسازیم ؟ اگه صلاح دونستین یه آموزش واسه ایجاد صفحه های داینامیک بذارید خیلی لازم دارم، واقعآ سایت خوبی دارید ممنون
پاسخ: 
سلام
منظورتان از صفحه داینامیک مشخص نیست، اگر ممکن است یک نمونه آنلاین معرفی کنید.
در وب تنها صفحاتی که با جاوا اسکریپت و به صورت pop up باز می شوند دکمه بازگشت ندارند، سایر روش ها در مرورگرهای جدید کاربرد ندارد.
نویسنده: شهاب
زمان: ۲۳:۵۲:۴۱ - تاریخ: ۱۳۹۱/۱۱/۰۹
منظورم صفحه هایی هست که وجود ندارند به درخواست کاربر به وجود میان، علامت ؟ داره تو ادرسش
پاسخ: 
علامت ? برای متد get در وب کاربرد دارد، هنگامی که یک فرم را با متد get ارسال کنید یا آدرس شما به صورت داینامیک باشد از این علامت برای مشخص کردن متغیرها و مقادیر آنها استفاده می شود، در رابطه با سوال شما به نظر باید به جای متد post در فرم از متد get استفاده کنید یا اینکه در قسمت action آدرس را به صورت داینامیک وارد کنید.
نویسنده: ansherli
زمان: ۱۴:۱۸:۳۸ - تاریخ: ۱۳۹۱/۱۱/۱۵
سلام
ببخشید من مطلبی در مورد تغییر نام کاربری و پسورد پیدا نکردم برای همین اینجا سوالم رو مطرح میکنم
من می خوام یه صفحه برای تغییر نام کاربری داشته باشم ولی نمی دونم چرا از کدم ایراد میگیره! در واقع به همین صورتی که شما در بالا توضیح دادید نام کاربریم رو ایجاد کردم ولی برای تغییرش نمیدونم چرا با خطا مواجه می شم و دیگه چیزی داخل دیتابیسم درج نمیشه
تیکه کد تغییر نام کاربریم اینه:
صفحه u-modir.php
توی این صفحه نام کاربری رو از دیتابیس میگیرم و به عنوان پیش فرض فیلد قرار میگیره .
<tr>
<td> نام کاربری:</td>
<td><input type="text" name="username" size="20" value="<?php echo $row['7'];?>"></td>
</tr>
------------------------------------------------------------------
صفحه u1-modir.php
توی این صفحه نام کاربری رو از u-modir.php میگیرم و داخل دیتابیس آپدیت میکنم.
 $username = $_POST['username'];
$username = mysql_real_escape_string($username);
include("config.php");
//Connect to database...
connect();
$sql="update modir set name='$name', facebook='$facebook', email='$email' , website='$website' , tel='$tel' , address='$address' , username='$username' where id='$id'";
خطایی که میده :
Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: Access denied for user 'SYSTEM'@'localhost' (using password: NO) in C:\wamp\www\form\admin\u1-modir.php on line 54
Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: A link to the server could not be established in C:\wamp\www\form\admin\u1-modir.php on line 54
خط 54 هم اینه :
$username = mysql_real_escape_string($username);
ممنون میشم راهنماییم کنید و بگید دقیقا کاربرد تابع
mysql_real_escape_string چیه و چیکار میکنه؟
پاسخ: 
سلام
تابع mysql_real_escape_string برای حفاظت از دیتابیس در مقابل حملات موسوم به SQL Injection یا نفوذ کاربرد دارد، در واقع این تابع وچود چند کاراکتر خاص:
\x00, \n, \r, \, ', " و \x1a
را بررسی کرده و آنها را با افزودن علامت \ ایمن سازی می کند.
این تابع قبل از استفاده نیاز به یک ارتباط با mysql دارد، یعنی قبل از به کار بردن آن باید به mysql متصل شده باشید، در غیر این صورت خطا دریافت خواهید کرد، لذا برای حل مشکل، ابتدا کدهای مربوط به ارتباط با دیتابیس را قرار دهید و سپس از تابع استفاده کنید.
نویسنده: ansherli
زمان: ۲۲:۰۱:۳۵ - تاریخ: ۱۳۹۱/۱۱/۱۵
خیلی ممنونم از راهنماییتون
نویسنده: web developer
زمان: ۱۷:۵۹:۱۰ - تاریخ: ۱۳۹۱/۱۲/۱۵
با تشکر از آموزش شما.
1 نکته انتقادی: قبل هر کد نوشته نام فایل را بنویسید.
سوالی داشتم در مورد یوزر های تکراری. چگونه می توان جلوگیری کرد ؟
پاسخ: 
سلام
این سوال قبلا مطرح شده، برای این کار کافی است نام فعلی را که کاربر در فیلد وارد کرده است به عنوان پرس و جو از دیتابیس قرار دهید، اگر نتیجه پرس و جو بزرگتر از صفر بود، پس چنین کاربری از قبل ثبت شده است، به طور مثال:
$result = mysql_query ("SELECT * FROM register WHERE username = '$username'");
// تعداد ردیف های موجود
$count = mysql_num_rows($result);
if($count > 0){
// این نام کاربری قبلا ثبت شده است
echo "این نام کاربری قبلا ثبت شده است!<br />";
}
نویسنده: مصطفی
زمان: ۲۰:۵۶:۱۲ - تاریخ: ۱۳۹۲/۰۱/۱۷
سلام
لطفا فایل های این مطلب را برای دانلود قرار دهید.
پاسخ: 
سلام
در حال حاضر و در کوتاه مدت این کار مقدور نیست، در آموزش توضیحات لازم داده شد است، اما در آینده فایل ها نیز به مطالب افزوده خواهند شد.
نویسنده: محمد مهدی احمدی
زمان: ۱۳:۰۹:۱۶ - تاریخ: ۱۳۹۲/۰۱/۲۱
یکم راجع if های تو در تو توضح بدین
من یه if برای چک تکرار کلمه عبور گذاشتم
اما نوبت به گذاشتن if برای بررسی تکرار یوزر که میزارم درست عمل نمیکنه
لطفا توضیح دهید
پاسخ: 
برای بررسی این گونه موارد باید از elseif در کنار if استفاده کنید، یعنی اگر نیاز است که تنها یک شرط اجرا شود، if و سپس elseif و در نهایت else، مثال:
<?php
$user = 'test';
$user_r = 'test';
$pass = '******';
$pass_r = '******';
if($user != $user_r){
//خطا
}
elseif($pass != $pass_r){
//خطا
}
else{
//اجرای کد
}
?>
نویسنده: محمد مهدی
زمان: ۲۳:۱۲:۳۶ - تاریخ: ۱۳۹۲/۰۱/۲۱
سلام مجدد کجای این دستور اشتباهه که هی خطا میده؟
<?php
$result = mysql_query ("SELECT * FROM db_users WHERE u_user = '$username'");

$count = mysql_num_rows($result);


$user=$_POST['username'];
$pass=$_POST['password'];
$pass2=$_POST['password2'];
$mail=$_POST['email'];
$name=$_POST['name'];
$mob=$_POST['mob'];


if($count > 0){

die('اخطار : یوزر تکراری !');
}
elseif{
if($pass != $pass2){
die('اخطار : کلمه عبور با تکرار کلمه عبور یکسان نیست !!!');
}
}
elseif{
if(!$user)
{

die('اخطار : یک نام کاربری وارد کنید !');

}
if(!$pass)
{

die('اخطار : یک کلمه عبور وارد کنید !');

}
if(!$mail)
{

die('اخطار : یک ایمیل وارد کنید !');
}
if(!preg_match("/[a-zA-Z0-9._-]+@[a-zA-Z0-9\.-]+\.[a-zA-Z\.]+/",$mail))
{

die('اخطار : ایمیل معتبر نیست !');

}


$query= mysql_query ("insert into users (u_username,u_password,u_email,u_name,u_mob)
values('$user','$pass','$mail','$name','$mob');
");

if(mysql_affected_rows()>0)
{

die ('.:: عضویت شما با موفقیت انجام شد ، موفق باشید ::.');

}
else
{

die('اخطار : به علت نا معلومی ثبت نام انجام نشد ، لطفا مجدد تلاش کنید !!!');

}

?>
پاسخ: 
سلام
برای elseif و if حتما باید یک شرط منطقی بنویسید، مثال:
elseif($count < 1){
if($pass != $pass2){
die('اخطار : کلمه عبور با تکرار کلمه عبور یکسان نیست !!!');
}
}
تنها else است که نیاز به مقایسه پارامتری ندارد.
نویسنده: keramatfar
زمان: ۱۵:۰۱:۵۱ - تاریخ: ۱۳۹۲/۰۲/۱۷
بچه ها من این کد ثبت نام نوشتم ولی درج نمیکنه همش میگه این نام کاربری موحود است.
<?php
require_once('config/config.php');
$msg='Your Message';

$user = $_POST['txt_user'];
$pass = $_POST['txt_pass'];
$r_pass = $_POST['txt_r'];
if(!empty($user))
{
if($pass!=$r_pass)
{
echo "Password is not set";
}

elseif(isset($_POST['txt_user']))
{
$user=$_POST['txt_user'];

$query2="select username from user where username='$user'";
$chk=mysql_query($query2);

if($chk)
echo 'Username exist,please set Username again';
}

if(!$chk)

{
$query = "insert into user (username,pass) values('$user','$pass')";
$r=mysql_query($query);
}

}

//if (mysql_query($query)){
// header("Location: login.php");
// }

else
echo "please full username";

?>
پاسخ: 
برای بررسی اینکه نام کاربری در دیتابیس موجود است نباید از روش زیر استفاده کنید:
if($chk)
بلکه باید ابتدا تعداد ردیف های یک پرس و جو را حساب کنید:
$num = mysql_num_rows($chk);
if($num > 0){
echo 'Username exist,please set Username again';
}
نویسنده: بهنام
زمان: ۲۳:۲۴:۱۵ - تاریخ: ۱۳۹۲/۰۲/۲۲
سلام میخواستم بگم اگه میشه توابع دیگری برای رمز دار کردن اطلاعات برای ثبت در دیتابیس معرفی کنید. (به غیر md5 و mysql_real_escape_string) .
و میخواستم بدونم رمز دار کردن ایمیل در فرم ثبت نام ایا لازم هست اگه لازم هست از کدام تابع استفاده کنم. با تشکر
پاسخ: 
سلام
در PHP توابع تقریبا زیادی برای رمزی کردن (hash) وجود دارد که با اجرای کد زیر لیست کاملی از آنها را ملاحظه خواهید کرد:
<?php
print_r(hash_algos());
?>
که نتیجه برابر خواهد بود با:
Array
(
[0] => md2
[1] => md4
[2] => md5
[3] => sha1
[4] => sha224
[5] => sha256
[6] => sha384
[7] => sha512
[8] => ripemd128
[9] => ripemd160
[10] => ripemd256
[11] => ripemd320
[12] => whirlpool
[13] => tiger128,3
[14] => tiger160,3
[15] => tiger192,3
[16] => tiger128,4
[17] => tiger160,4
[18] => tiger192,4
[19] => snefru
[20] => snefru256
[21] => gost
[22] => adler32
[23] => crc32
[24] => crc32b
[25] => fnv132
[26] => fnv164
[27] => joaat
[28] => haval128,3
[29] => haval160,3
[30] => haval192,3
[31] => haval224,3
[32] => haval256,3
[33] => haval128,4
[34] => haval160,4
[35] => haval192,4
[36] => haval224,4
[37] => haval256,4
[38] => haval128,5
[39] => haval160,5
[40] => haval192,5
[41] => haval224,5
[42] => haval256,5
)
یعنی حدود 42 تابع از پیش تغریف شده.
در این بین برخی توابع مانند ms5 یا sha1 شناخته شده تر هستند، اما برای امنیت بیشتر می توانید کلمه عبور را با توابعی دیگر مانند crypt رمزی کنید، این تابع این امکان را به شما می دهد که از عبارت سفارشی برای رمزی کردن استفاده کنید (به این عبارت سفارشی در اصطلاح نمک یا salt می گویند) تا حدس زدن آن توسط هکرهایی که از جداول رمزهای از پیش تعریف شده (موسوم به جدول رنگین کمان یا rainbow table) استفاده می کنند نا ممکن شود، مثال:
<?php
$password = '12345678';
$salt = 'ydhepw04ppow';
$hash = crypt($password, $salt);
echo $hash.'<br>';
?>
مشخص است که برای تولید نمک به صورت داینامیک باید یک تابع دلخواه دیگر نیز تعریف کنید!
یا برای داشتن انتخاب های بیشتر می توانید از تابع hash استفاده کنید، آرگومان اول این تابع، الگوریتم مورد نظر را دریافت و مقادیر را با آن الگوریتم رمزی می کند، مثال:
<?php
$password = '12345678';
$hash = hash('sha512', $password);
echo $hash.'<br>';
?>
برای ایمیل معمولا نیازی به رمزی کردن نیست، چون علاوه بر اینکه نیاز به استفاده مجدد از آن است، اطلاعات در دیتابیس ذخیره شده و به نمایش در نمی آیند، هر چند برای امنیت بیشتر می توان از رمزنگاری دو طرفه (قابل بازیابی) استفاده کرد که این بستگی به میزان حساسیت کار و سلیقه شما دارد.
more لطفا پیش از ارسال یادداشت نکات زیر را مد نظر داشته باشید:
- مواردی که به کلی خارج از موضوع این مطلب هستند را در فرم منوی "تماس با ما" مطرح و پاسخ را از طریق ایمیل دریافت کنید.
- به سوالات کلی، مبهم، غیرضروری و مشکلاتی که تلاشی برای رفع آن نکرده باشید پاسخ خاصی داده نخواهد شد.
- کدها و اسکریپت های طولانی را ترجیحا در یک صفحه وب آنلاین قرار دهید تا امکان تست و بررسی وجود داشته باشد.
- تمام یادداشت ها بررسی و برای هر کاربر زمان مشخصی جهت پاسخگویی در نظر گرفته می شود، لذا از طرح سوالات متعدد در بازه زمانی کوتاه خودداری کنید.




4 × 7
 refresh
نکته:
با توجه به تاریخ نگارش آموزش های سایت و پیشرفت تکنولوژی های مرتبط با وب در سالیان اخیر، محتوای برخی از مطالب قدیمی ممکن است نیاز به ویرایش و به روزرسانی داشته باشد که این کار هم زمان با تهیه نسخه جدید «وبگو» به مرور در حال انجام است، لطفا در استفاده از مطالب سایت به این نکته دقت داشته و حتی المقدور از چند منبع مختلف استفاده نمائید.
آخرین دیدگاه ها
form adel
در:
سلام با تشکر از سایت خوب شما. یه سوال داشتم چگونه تمام این کدها را در جاوا اسکریپت همزمان قرار دهیم. من مثلا دستور این...
۲۱:۲۵:۴۰ ۱۳۹۸/۰۸/۲۴

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

form پرتو
در:
با عرض سلام و خسته نباشید امیدوارم حالتون خوب باشه من دو سه سال پیش وبلاگم رو حذف کردم ایا امکانش هست برگرده؟ ادرس...
۱۴:۵۵:۵۲ ۱۳۹۸/۰۸/۲۰

form علی
در:
سلام من نمی تونم html tag رو چطور در وبلاگم قرار بدم وبلاگم اینه
tagtak.blog.ir
۱۰:۲۳:۳۴ ۱۳۹۸/۰۸/۲۰

form حمید
در:
سلام. خسته نباشید. من میخاستم استایل فیلدهای فرمم رو تغییر بدم منتهی نمیدونم از چه کدهایی باید استفاده کنم. برای اینکه فرمی به شکل...
۱۰:۳۶:۱۹ ۱۳۹۸/۰۸/۱۹

form سمیه
در:
سلام ممنون بابت آموزش مفیدتون توی تگ ها هرچیزی که در تگ head قرار بگیره نمایش داده نمیشه، اما ممنون میشم...
۲۰:۴۹:۲۳ ۱۳۹۸/۰۸/۱۷

form استادمجازی
در:
سلام. از ادمین عزیز و همگی دعوت می کنم آموزش های خوبتون را بصورت آموزش ویدیویی یا صوتی و... در سایت ostadmajazi.com استادمجازی ...
۲۲:۱۲:۲۳ ۱۳۹۸/۰۸/۱۳

form mohamad
در:
سلام و خسته نباشید ، توی فرمی که ساختم چند تا drop down دارم که میخوام با php براشون شرط بذارم به طوری...
۱۳:۵۱:۳۴ ۱۳۹۸/۰۸/۱۰

form رضا
در:
خسته نباشید این جلسه آخر html بود؟؟؟؟
۰۱:۱۵:۰۷ ۱۳۹۸/۰۸/۱۰

form امیرمحمد
در:
سلام و خسته نباشید استاد بنده میخوام بین دو کد زیر که مشخص کردم رو به دست بیارم
// ---------------------set سلام...
۱۹:۳۰:۵۳ ۱۳۹۸/۰۸/۰۸

form حجت
در:
خیلی ممنونم از لطف شما. اوکی شد.
۱۰:۲۸:۳۵ ۱۳۹۸/۰۸/۰۶

form میلاد
در:
آشنایی نسبی با css, php و ajax دارم و نمیخام از library های موجود در نت استفاده کنم. خواستم با همین متد که انصافا روان...
۲۳:۲۲:۵۵ ۱۳۹۸/۰۸/۰۵

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

form raha
در:
سلام وقتتون بخیر ببخشید علامت @ در کل به چه معناست ممنون میشم پاسخ دهید
۲۰:۱۲:۵۹ ۱۳۹۸/۰۸/۰۵

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