سه شنبه ۰۲ بهمن ۱۴۰۳

Tuesday, January 21, 2025 GMT +3:30

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

ایجاد فولدری با نام php-mysql-signup


برای تجمیع و مدیریت ساده تر فایل های سیستم ثبت نام و عضویت کاربران در سایت بهتر است یک دایرکتوری مجزا در نظر بگیریم، در این آموزش فولدری با نام دلخواه php-mysql-signup ساخته ایم که در مجموع چند فایل و فولدر زیر را شامل می شود:
- فایل config.php، حاوی اطاعات اتصال به دیتابیس.
- فایل create.php، جهت ایجاد جدول و ستون ها.
- فایل index.html، فرم HTML ثبت نام و عضویت.
- فایل users.php، بررسی و ذخیره اطلاعات ارسالی کاربران.
- فولدر lib، شامل فایلی با نام password_compat.php جهت استفاده از قابلیت های توابع جدید کلمه عبور در نسخه 5.5 و قدیمی تر PHP.
در ادامه با جزئیات این فایل ها را بررسی می کنیم.

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


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

ایجاد جدول و ستون ها با دستور CREATE در فایل create.php


در گام سوم و بعد از ساخت دیتابیس و تنظیم اطلاعات اتصال باید جدولی در پایگاه داده خود با نامی دلخواه بسازیم و ستون هایی را در آن برای نگهداری نام کاربری، کلمه عبور و سایر اطلاعات مورد نیاز ایجاد کنیم، بدین منظور از دستور 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 جهت عضویت و ثبت نام کاربر در فایل index.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;
}
?>
کدنویسی این فایل برای استفاده ناقص است و در گام های بعدی در ادامه آموزش حاضر کامل می شود.
توضیح:
- علامت @ استفاده شده در ابتدای متغیرها برای جلوگیری از چاپ خطای Notice: Undefined index در صورت فراخوانی فایل users.php بدون تنظیم شدن پارامترهای فرم است.
- در دستور شرطی if تنظیم شدن و خالی نبودن نام کاربری را با توابع isset و empty بررسی می کنیم، اگر نام کاربری خالی باشد پیامی به کاربر نشان داده و متغیری به نام error (نام دلخواه است) را برابر 1 قرار می دهیم تا در ادامه وضعیت آن را بررسی کنیم.
- در دستور elseif اول بررسی های بالا را روی کلمه عبور انجام می دهیم تا از خالی نبودن آن یا ارسال اشتباه فرم توسط کاربر اطمینان حاصل کنیم، در elseif دوم نیز کلمه عبور را با تکرار آن تطبیق می دهیم، با توجه به اهمیت کلمه عبور و لزوم به خاطر داشتن آن توسط کاربر معمولا این تطبیق جهت اطمینان از درج صحیح کاراکترهای مد نظر انجام می شود.
- در قسمت elseif آخر نیز با تابع preg_match بررسی می کنیم تا ببینیم آیا کاراکترهای وارد شده توسط کاربر صرفا شامل حروف و اعداد انگلیسی می شود یا خیر، همچنین دو کاراکتر- و _ را هم جزء کاراکترهای مجاز قرار داده ایم، اگر کاراکتری خارج از این موارد ارسال شود بررسی preg_match نادرست یا false شده (وضعیت با عدد 0 برگردانده می شود) و پیام خطا برای کاربر نمایش داده خواهد شد.
نکته: بررسی اعتبار اطلاعات فرم بسته به اینکه هدف و خواسته ما چه چیزی باشد متفاوت و سلیقه ای است، لذا مثال های عنوان شده صرفا جهت نمونه است و هیچ محدودیتی در این خصوص وجود ندارد.
در ادامه کدنویسی فایل users.php را با موارد دیگری تکمیل می کنیم.

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


اگر همه چیز درست باشد و کاربر فیلدها را به طور کامل تکمیل و ارسال نماید نوبت به مرحله ذخیره اطلاعات در دیتابیس است، اما قبل از اینکه به این گام بپردازیم یک امر مهم را نباید فراموش کنیم:
حفظ امنیت اطلاعات و پایگاه داده!
در برنامه نویسی PHP و هنگام ارتباط با MySQL رعایت مسائل امنیتی کار با پایگاه داده ضروری است، اگرچه عمده کاربران هیچ سوء نیتی نداشته و صرفا به دنبال استفاده های متداول هستند اما ممکن است هکرهایی پیدا شوند که مترصد کوچکترین فرصتی برای نفوذ و آسیب زدن به برنامه ما باشند، از طرفی ذخیره اطلاعات حساس و به فرض کلمه عبور کاربران باید به صورت رمزنگاری شده باشد تا امکان هر نوع سوء استفاده احتمالی را از بین ببرد و ضریب امنیت را افزایش دهد، در مقوله امنیت باید همواره زمانی را فرض کنیم که بخشی از اطلاعات پایگاه داده به هر دلیل در اختیار هکرها قرار گرفته است، در این حالت اگر اطلاعات به صورت یک طرفه و بدون امکان بازگشت رمزی شده باشد قاعدتا استفاده چندانی برای مهاجم نخواهد داشت و حداقل اگر نگوئیم ناممکن ولی احتمال بازیابی بسیار بعید خواهد بود، در این چارچوب در برنامه نویسی رویه ای PHP با اکستنشن MySQLi بدین منظور از توابع mysqli_real_escape_string و password_hash استفاده کرده ایم که روش توصیه شده و جایگزین روش های قدیمی مانند تابع md5 است، در ادامه کدنویسی فایل users.php را به شکل زیر توسعه می دهیم:
<?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 = @$_POST['password'];
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 و password_verify توصیه می شوند).

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


علاوه بر اعتبارسنجی مقادیری که برای ثبت نام کاربر در سایت به سرور ارسال می شوند باید از قابل ثبت و آزاد بودن نام کاربری انتخاب شده نیز اطمینان حاصل کنیم، منظور از قابل ثبت و آزاد بودن این است که بررسی کنیم نام کاربری درخواستی از قبل در دیتابیس وجود نداشته و توسط کاربر دیگری ثبت نشده باشد، دلیل این کار روشن است و مشخص است که دو یا چند نام کاربری مشابه در یک سیستم باعث ایجاد مشکل در شناسایی کاربران مختلف از هم خواهد شد، بدین منظور فایل users.php را توسعه داده و پرس و جوی 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 را برگرداند یعنی چنین نام کاربری قبلا در سیستم ثبت نشده و به عبارتی آزاد است در نتیجه ادامه کدها اجرا می شود.
نکته: برای اینکه مطمئن شویم تابع mysqli_num_rows واقعا مقدار 0 برمی گرداند و به فرض با false اشتباه نشود از عملگر === به جای == استفاده می کنیم (در PHP اگر از عملگر == استفاده کنیم 0 و false برابر هستند!).

ذخیره اطلاعات با دستور 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
دسته بندی: آموزش کاربردی » MySQL
related مطالب بیشتر:
نحوه رسم چارت و نمودار آماری با PHP و MySQL
آموزش ساخت پنل ورود و خروج سایت با PHP و MySQL
صفحه بندی مطالب و محتوا با PHP و MySQL
آموزش ساخت فرم تماس با PHP و MySQL
جستجو در مطالب سایت با استفاده از MySQL Full-Text
دیدگاه
more ۱۹۱ دیدگاه برای این مطلب ارسال شده است.
more چینش دیدگاه ها به ترتیب از جدیدترین به قدیمی ترین است.
حمید
۱۱:۳۳ ۱۳۹۴/۰۷/۱۵
ممنون از شما! اما چیزی که هست خیلی از سایت ها این مشکل رو ندارن! مثلا فرم php که تو سایت w3schools خودش درست کرده این مشکل رو نداره ولی همون فرم رو من که درست میکنم این مشکل رو داره! به جز این راهکار شما برای کسی که فرم رو ارسال کرده خوبه! ولی برای کسی که همینجور الکی یک حرفی توی فرم نوشته و رفرش میکنه تا محتوای فرم خالی شه چی؟
برای سوال دومم ایناها رو میدونستم! یعنی سایت با وردپرس داشتم! یعنی منظور شما اینه اگه از یک سیستم مدیریت محتوا هم استفاده نکنیم تنها با تنظیم dns توی هاستمون public_html هست؟ اگه باشه که مشکل حله تقریبا!
- سایت مورد نظر از جاوا اسکریپت برای مدیریت فرم استفاده می کند که یک بحث جداگانه است!
- دایرکتوری www یا public_html در واقع ریشه سایت شما است و هر محتوایی در آن قرار دهید، از طریق آدرس دامنه سایت قابل فراخوانی است!
حمید
۱۱:۵۴ ۱۳۹۴/۰۷/۱۴
سلام و خسته نباشید!
یک مشکلی هست تو فایرفاکس که وقتی تو صفحه فرم عضویت صفحه رو رفرش میکنم یک Alert box میاد که میگه میخوای اطلاعات رو resend کنی یا نه! چکار کنم این alert box نیاد؟ تو نت هر چی گشتم چیزی پیدا نکردم! کلا به یک prg pattern رسیدم که اصلا نفهمیدم چی میگه! یک سوال دیگه! وقتی ما یک سایت با php میسازیم! چجوری باید تو نت قرارش بدیم و بهش دامنه ی سایت رو اتصال بدیم؟
ممنون!
- این حالت عادی است! زمانی که یک فرم در مرورگر ارسال (submit) می شود، اگر مجدد همان صفحه را رفرش کنید، از دید مرورگر یعنی تمایل به ارسال مجدد اطلاعات دارید! هیچ راه حل خاصی برای تغییر این حالت وجود ندارد، جزء اینکه به فرض پس از ارسال اطلاعات، به صورت خودکار کاربر را به یک صفحه دیگر منتقل کنید (به طور مثال با کدهای PHP یا متاتگ HTML و...).
- برای سایت های PHP کافی است فضایی اشتراکی یا اختصاصی در یک سرور لینوکس (یا ویندوز) از شرکت های هاستینگ خریداری کنید، سپس این شرکت ها یک آدرس DNS در اختیار شما قرار می دهند که باید در پنل مدیریت دامنه آن را تنظیم کنید، در نهایت وارد محیط مدیریت هاست سایت خود شوید و فایل های PHP و... را در ریشه سایت (فولدر www یا public_html) آپلود نمائید، سایت شما آماده استفاده است!
فرید
۱۸:۵۷ ۱۳۹۴/۰۶/۰۹
با سلام و عرض ادب
ممنون از مطالب آموزندتون
تو این قسمت چندتا مشکل دارم ، فرم رو کامل ساختم و پروسش تا ثبت در دیتابیس مشکلی نداره اما یکی از مشکلاتم اینه که نمیخوام بره صفحه register.php بعد ارور بده ، میخوام کنار فیلد ارور مربوطه بیاد ، مثلا این فیلد نباید خالی باشد ، دیگه تو صفحه register.php نره و بعد ارور بده یه دونه دیگه از مشکلاتمم اینه که میخوام کاربر وقتی وارد میشه تو صفحه login بعضی از اطلاعاتش که هنگام ثبت نام وارد کرده رو مثل اسمش نمایش بدم ، یعنی یکی از فیلد های توی دیتابیس رو فراخوانی کنم ، دستورش وارد کنم اما چاپ نشد و چیزی نشون نداد
- آموزش و نمونه کدها صرفا جهت راهنمایی بیشتر است و الزامی به طراحی ساختار کدها به همین شکل نیست، منتها برای طراحی ساختار دلخواه باید مباحث و آموزش های مقدماتی PHP را سپری کرده باشید تا بتوانید کدها را در یک فایل مدیریت کنید، یا به طور مثال از خطایابی Ajax استفاده نمائید، در غیر اینصورت توضیح مطلب به دلیل وابسته و گسترده بودن مباحث عملا ممکن نیست!
- برای چاپ اطلاعات دلخواه می توانید از دستور SELECT در MySQL استفاده کنید، قاعدتا این موضوع هم به میزان آشنایی شما با نحوه کار دیتابیس در PHP برمی گردد!
۱۲:۲۷ ۱۳۹۴/۰۶/۰۴
سلام خسته نباشید بدون مقدمه میرم سر اصل مطلب ببینید من یک سایت دارم طراحی میکنم و توش یه صفحه ی عضویت میخوام بزارم که وقتی طرف عضویت رو کلیک کرد یه ایمیل حاوی کد تایید براش فرستاده بشه لطفا کمک کنید
هر جا رو گشتم پیدا نکردم
ممنون
ساخت یک قابلیت کاربردی مانند سیستم عضویت گیری با ارسال ایمیل تایید، شامل مباحث زیادی است که باید مورد به مورد به دنبال آموزش ها باشید، به فرض بخش عضویت نیاز به یک آموزش مجزا دارد، بخش ارسال ایمیل مبحث دیگری است و... مهم تر از اینها باید تا حدودی با برنامه نویسی وب آشنا باشید تا بتوانید این آموزش ها را به هم مرتبط کنید، در غیر اینصورت صرف کپی کدها و درج آنها در فایل های مختلف کمک چندانی نمی کند!
آرش
۰۷:۵۴ ۱۳۹۴/۰۶/۰۱
سلام
ممنون از مطالب بسیار مفیدتان
میخواستم بدونم با کدهای داخل کادر اول باید چیکار کرد و اینکه من به صورت دستی جدول و ردیف ها را ساختم و کدها را اپلود کردم اما بعد از فشردن دکمه ی عضویت با صفحه سفید و عدم دریافت اطلاعات در دیتابیس مواجه میشوم.
کدهای کادر اول برای ساخت جدول به صورت خودکار است، یعنی با درج این کدها در یک فایل PHP و تنظیم اطلاعات قسمت اتصال به پایگاه داده، پس از اجرای فایل، جدول شما در دیتابیس ساخته می شود (البته اگر همه چیز درست باشد!)، اگر خطا دریافت کنید یا با مشکلی روبرو شوید نیاز به بررسی و پی بردن به علت مشکل دارد، توصیه می کنیم ابتدا حتما آموزش های مقدماتی مربوط به کار با MySQL در PHP را فرا بگیرید!
amir
۰۲:۰۰ ۱۳۹۴/۰۵/۲۰
سلام این کد ها رو اپدیت نمیکنید mysqli یا pdo چون دیگه جواب نمیده mysql
متاسفانه در کوتاه مدت مقدور نیست، اما در آینده انجام خواهد شد، البته در صورت آشنایی با MySQLi یا PDO به راحتی می توانید همین کدها را تبدیل کنید!
Mohsen Tahanian
۲۱:۰۳ ۱۳۹۴/۰۴/۲۱
سلام خسته نباشید
من یه سوال دارم و اون اینه که ایا من میتونم برای یک وبسایت استاتیک از کدهای بالا استفاده کنم بدون اینکه خواسته باشم وبسایتم رو به داینامیک تبدیل کنم، من میخوام فرم عضویت و ثبت نام در سایت رو داشته باشم اما نمیدونم چطوری؟؟؟؟
اگه براتون ممکنه جواب بدید
باتشکر
اگر منظورتان از وبسایت استاتیک، عدم استفاده از پایگاه داده است، قاعدتا پاسخ منفی است، برای نگهداری اطلاعات اعضا معمولا نیاز به وجود پایگاه داده است، اما اگر منظورتان عدم استفاده از CMS و... است، در صورت آشنایی با PHP و MySQL می توانید محیطی برای ثبت نام کاربران ایجاد کنید، البته صرف الگو قراردادن این آموزش برای این کار کفایت نخواهد کرد و باید قسمت های دیگری را کدنویسی کنید.
Ali
۱۴:۵۹ ۱۳۹۴/۰۳/۰۷
سلام. تشکر از مطالب مفیدی که گذاشتید.
من واسه کلمه عبور کد زیر را نوشتم:
<label for="pass"> ramz:</label>
<input name="password" id="pass" type="password" maxlength="255" />
حالا می خواهم تکرار کلمه عبور هم بزارم. همین کد را کپی کردم فقط اسمش رو تغییر دادم ولی حاصل دو تا کلمه عبور را ثبت می کند. یا اگر هر دوتاش رو مثلا 4444 گذاشتم ، صفر وارد می کند. و اینکه اگر هر دو تا کلمه عبور را متفاوت وارد کردم ارور نمیدهد.
باید چیکارش کنم ؟؟؟؟
دوست گرامی PHP هیچ کاری را خود به خود انجام نمی دهد، یاید ببینیم چه دستوراتی در سمت سرور برای هدفتان تعریف کرده اید، در صورت تمایل فایلتان را از طریق ایمیل (موجود در بخش تماس) ارسال و نتیجه را از همان طریق پیگیر باشید.
M
۱۱:۵۰ ۱۳۹۴/۰۳/۰۷
سلام.
می خواستم ازتون تشکر کنم. یک دنیا ممنونم.
بالاخره تونستم، خیییلییی خوشحالم. خیییلی از شما استاد محترم متشکرم. ایشاله همین جور که کار ما رو راه می اندازید بدون هیچ چشم داشتی خدا توی تمام زندگیتون حامی و نگهدارتون باشه.
M
۱۰:۲۵ ۱۳۹۴/۰۳/۰۶
سلام.
واقعا ممنونم بابت راهنمایی که کردید. توضیحات شما برای حذف و اضافه هست که خیلی به دردم خورد و بسیار سپاسگزارم.
من یه مشکل دیگه دارم برای اینکه کاربران که عضو می شوند علاوه بر اینکه در پایگاه داده اضافه می شوند، در صفحه سایت نیز نشان بدهد از چه کدی باید استفاده کنم ؟؟؟
(اگه میشه لطف کنید راهنمایی کنید چون مشکل اصلی من همین هست) تشکر فراوان ...
این موارد در جای خود (آموزش مقدماتی MySQL) گفته شده، می توانید از دستور SELECT در MySQL استفاده و ردیف های مورد نظرتان را از دیتابیس استخراج و در حلقه while با PHP در خروجی سایت چاپ کنید، اگر با این مباحث آشنا نیستید، لطفا به بخش های مقدماتی مراجعه کنید، نگاهی گذرا نیز می تواند در حل مسئله کمک کند!
M
۱۰:۱۷ ۱۳۹۴/۰۳/۰۵
با سلام و تشکر از این که جواب من رو دادید.
یه خواهش داشتم اگر امکانش هست مشکلی که من دارم (یعنی هنگامی کاربر که ثبت نام می کند و در صفحه اینترنت نشان دهد و قابل حذف و اضافه باشد)
کد مربوط به این قسمت رو آموزش بدهید. یا به ایمیلم بفرستید. چون واقعا احتیاج دارم و برای پروژه پایانی دانشگاه می خوام.
ممنونم از زحمات شما.
مشابه این آموزش در مطالب سایت وجود دارد، لطفا در وب عبارت "آموزش حذف گروهی اطلاعات از MySQL با استفاده از چک باکس" را جستجو کنید!
نکته: برای اضافه کردن و... قاعدتا باید برنامه نویس وب و به طور خاص کار با فرم ها + دیتابیس را تا حدودی بلد باشید، این مباحث پیوسته هستند و به دانش مقدماتی شما بستگی دارند.
M
۱۷:۳۶ ۱۳۹۴/۰۳/۰۴
با سلام و تشکر فراوان.
من همه کارهای بالا را انجام دادم چندین بار. و از برنامه XAMPP به عنوان پایگاه داده استفاده کردم. اول ارور مثل بقیه می داد که گفتید باید root رو بنویسیم چون به صورت لوکال هاست است.
حالا مشکل اینجاست که وقتی کاربر ثبت نام می کند در صفحه اینترنت (rgister.php) هیچ چیزی نشون نمیده فقط مینویسه ثبت نام شما انجام شد.
ولی توی PHPMYADMIN ثبت شده. سوالم این هست که چه کار کنم که در صفحه اینترنت هم هر کاربر جدید که عضو می شود نشان دهد و بتوانم حذف و اضافه کنم؟؟؟؟
متشکرم
آموزش در مورد ساخت فرم عضویت است و قاعدتا محدود به این قسمت می شود، برای توسعه برنامه باید ادامه مراحل را با کدنویسی تعریف کنید (SELECT اطلاعات از دیتابیس، چاپ خروجی با PHP، ایجاد توابع و دستورات شرطی برای مدیریت درخواست کاربر و...) که مستلزم آشنایی قبلی شما با برنامه نویسی PHP است و راه حل کوتاهی ندارد!
پریسا
۱۰:۰۲ ۱۳۹۴/۰۱/۲۰
سلام
میخواستم بدونم اگه بخواهیم یک فایل عکس به دیتابیس بفرستیم چه باید کنیم؟
ممنون
ذخیره تصاویر در دیتابیس در وب چندان توصیه نمی شود، چون برای نمایش آن (در برخی مرورگرها) ممکن است با مشکلاتی روبرو شوید و از طرفی حجم کلی پایگاه داده به میزان زیادی افزایش می یابد، بهتر است تصاویر را به صورت معمول در هارددیسک سرور ذخیره و تنها آدرس یا نام آنها را در دیتابیس ثبت کنید.
اما جهت اطلاعات بیشتر، نوع داده برای ذخیره تصاویر در MySQL نوع BLOB به معنی Binary Large OBject است که برای نمایش تصویر باید یک دستور header تنظیم کنید:
header("Content-type: image/jpeg");
echo $row['image_column'];
توجه کنید که قبل از این دستورات هیچ خروجی نباید به مرورگر ارسال شود (شامل کاراکترهای نامرئی BOM نیز می شود)، روش دیگر نمایش، استفاده از data:image و base64_encode است:
<?php echo '<img src="data:image/jpeg;base64,' . base64_encode($row['image_column']) . '">'; ?>
مرتضی
۲۲:۱۵ ۱۳۹۳/۱۲/۱۸
سلام
من یک دیتابیس برای username و password ایجاد کردم ولی اگر username ها تکراری باشند اروری نمیده و دریافت و در دیتابیس ثبت می کند .
من باید چی کار کنم
میتوانید قبل از ذخیره اطلاعات کاربر جدید، ابتدا یک ستون از دیتابیس را انتخاب کنید که نام کاربری برابر نام کاربری وارد شده باشد، اگر نتیجه برابر یک بود (از تابع mysql_num_rows استفاده کنید)، یعنی چنین نامی قبلا ثبت شده و در غیر این صورت (مقدار صفر یود)، کاربر مجاز به ثبت نام است (نمونه کدها در صفحه اول یادداشت هایی که برای این مطلب ارسال شده وجود دارد).
سروش
۱۶:۵۷ ۱۳۹۳/۱۰/۲۳
با سلام و خسته نباشید به شما واقعا سایت خوبی دارید و من بهتون خسته نباشید میگم
امیدوارم که همیشه موفق باشید
more لطفا پیش از ارسال دیدگاه نکات زیر را مد نظر داشته باشید:
- به سوالات کلی، زمانبر، مبهم و مشکلاتی که تلاشی برای رفع آنها نکرده باشید پاسخ مختصر داده شده یا به بخش برنامه نویسی اختصاصی ارجاع داده می شوند.
- کدها و اسکریپت های طولانی را ترجیحا در یک صفحه وب آنلاین یا به صورت حساب موقت و آزمایشی قرار دهید تا امکان بررسی دقیق مشکل و خطایابی میسر باشد.
- تمام دیدگاه های ارسالی خوانده شده و برای هر کاربر مدت زمان لازم جهت پاسخگویی در نظر گرفته می شود، لطفا از طرح سوالات متعدد در بازه زمانی کوتاه خودداری کنید.



 refresh
10 × 10
6 × 7
20 × 20
=
آخرین دیدگاه ها
more برای دسترسی سریع به یادداشت مربوطه می توانید از لینک مطلب در کادر زیر استفاده کنید.
امیرحسین
سلام وقت بخیر بنده میخوام با کمک curl دیتابیس پنل رو دانلود کنم و در یک فایل ذخیره کنم با دستور file_get_contents و ارسال...
۱۴۰۳/۱۰/۲۹

عباسی
با سلام و خسته نباشید چطوری می تونم با یک الگو متن داخل کد زیر رو پیدا کنم: با تشکر
۱۴۰۳/۱۰/۲۸

شریفی
اینجا هم یه سری توضیحات داده خیلی سر در نیاوردم
۱۴۰۳/۱۰/۲۴

شریفی
سلام وقت بخیر این نمونه هست که البته فقط توضیحاتش رو خوندم و خودم اسکریپت رو تست نکردم. فقط برام جالبه که...
۱۴۰۳/۱۰/۲۴

شریفی
سلام وقت بخیر خوب هستین انشالله؟ من به تازگی با کتابخانه سدیم آشنا شدم مثل اینکه میشه برای کدگذاری روی فایل php ازش...
۱۴۰۳/۱۰/۲۲

پرتو
سلام ممنونم از جوابتون اوکی مرسی از جواب ایمیل بله درسته جواب دادید و دیگ اینکه یه ایمیل دیگه هم تازگیا فرستادم ممنون میشم چک...
۱۴۰۳/۱۰/۰۸

پرتو
سلام خوبید خسته نباشید ببخشید یه سوال داشتم اولا بهتون ایمیل دادم جواب ندادین دوما میگن قالب هام ساده هستند چیکار می تونم بکنم بنظرتون...
۱۴۰۳/۱۰/۰۴

رضا
ممنونم از شما بابت وقتی که گذاشتید و پاسخ دادین. راستی یه سوال خدمت شما داشتم. بهترین راه برای اینکه بفهمیم که کاربر از...
۱۴۰۳/۰۹/۲۷

رضا
اصلاح می کنم دیکودر ایرانی یون ۱۲ هم گویا پیدا شده امان از دست ...
۱۴۰۳/۰۹/۲۱

رضا
سلام ممنون برای پاسخ خوبتون. فرمودین <نکته 1: با مبهم سازی، سورس ها همچنان قابل کپی هستند منتها برای انسان گیج کننده، نامفهوم و...
۱۴۰۳/۰۹/۲۱

رضا
سلام من چند ماهی هست که کلی روی یه پروژه سیستم مدیریت محتوا با زبان php کار کردم و پروژه کامل شده. قصد...
۱۴۰۳/۰۹/۲۰

ناشناس
سلام خسته نباشید وقتتون بخیر چطور می تونم با استفاده از حلقه وایل بزرگ ترین و کوچک ترین عدد را از بین چند عدد پیدا...
۱۴۰۳/۰۹/۱۸

علایی
با سلام و درود بی پایان و خوشحالم که با این سایت آشنا شدم بنده وردپرس کار هستم اگه لطف بکنید و نحوه شمسی سازی...
۱۴۰۳/۰۹/۱۲

روزمرگی های یک مهندس عمران
در جستجوی یک مطلب در مورد مهندسی عمران داشتم میگشتم که رسیدم به این سایت وبگو که یک سایت تخصصی آموزش برنامه نویسی وب و...
۱۴۰۳/۰۹/۱۱

روزمرگی های یک مهندس عمران
من یک وبلاگ در بلاگ اسپات دارم و میخوام موتور جستجوی گوگل در وبلاگ استفاده کنم، پرسشم اینه که آیا خود بلاگر این ابزار را...
۱۴۰۳/۰۹/۰۹

سیدعباسی
با تشکر از شما استاد بزرگوار تست کردم واسه اعداد بزرگتر بالا و پایین می کنه و صحیح نیست مثلا از یک تا ۹...
۱۴۰۳/۰۹/۰۴

هیوا
سلام ببخشید من کد زنی رو بصورت آموزش شروع کردم اما اینکه چطور صفحه رو رفرش کنم که همزمان ببینم کدهایی که میزنم تاچه حد...
۱۴۰۳/۰۹/۰۳

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