parsgreen.com
article

آموزش ساخت فرم تماس با php و mysql

mysql-php-contact-form

فرم تماس از جمله امکاناتی است که تقریبا هر سایتی برای داشتن یک ارتباط دوسویه با مخاطبان خود، به آن نیاز دارد و بدین منظور معمولا برنامه نویسان وب و مدیران سایت ها از دو شیوه ی ارسال پیام به ایمیل یا ارسال پیام به سرور و ذخیره کردن آن در دیتابیس  یا حتی ترکیبی از این دو روش استفاده می کنند، از طرفی محافظت بخش تماس از ارسال اسپم و هرزنامه نیز مبحثی است که در این مورد باید به آن توجه جدی نمود، چرا که عدم استفاده یا ضعف این سیستم می تواند باعث هجوم خزنده های ارسال هرزنامه به بخش تماس سایتتان شود؛ از این رو در این آموزش قصد داریم تا شما را با نحوه ساخت یک فرم تماس نسبتا پیشرفته با php و mysql آشنا کنیم.

ساخت فرم تماس به صورت html


طبق معمول آموزش های قبلی، نخستین گامی که برای رسیدن به هدفمان به آن نیاز داریم، ساختن یک فرم تماس در قالب کدهای html است تا اطلاعات آن پس از ارسال، به سرور منتقل و در آنجا (در دیتابیس) ذخیره شده یا توسط سیستم ایمیل (که در آموزش های کاربردی php و در مطلب ارسال ایمیل با php و کلاس phpmailer در مورد آن صحبت کرده ایم)، به آدرس مدیر سایت ارسال گردد، البته در اینجا هدف ما صرفا ذخیره یادداشت کاربر در دیتابیس است و مجددا به بحث ایمیل نمی پردازیم؛ لذا بدین منظور ابتدا فرم زیر را نوشته و آن را در یک فایل با نام فرضی index.php ذخیره می کنیم (البته این فرم در ادامه تکمیل خواهد شد و نمونه زیر تنها به عنوان مقدمه کار است).
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>وبگو | فرم تماس با ما</title>
<!-- http://webgoo.ir -->
<style type="text/css">
body{
    font-family:Tahoma, Geneva, sans-serif;
    font-size:12px;
    direction:rtl;
}
label{
    display:inline-block;
    width:100px;
    height:25px;
    vertical-align:top;
}
.code{
    width:50px;
    margin-top:2px;
}
</style>
</head>
<body>
<form action="contact.php" method="post">
<label for="name">نام:</label>
<input name="name" id="name" type="text" maxlength="255" /><br />
<label for="mail">ایمیل:</label>
<input name="mail" id="mail" type="text" maxlength="255" dir="ltr" /><br />
<label for="message">یادداشت:</label>
<textarea name="message" id="message" cols="35" rows="8">
</textarea><br />
<label for="code">کد امنیتی:</label>
<input name="code" id="code" type="text" class="code" /><br />
<input type="hidden" name="check" value="1" />
<input type="submit" value="ارسال" />
</form>
</body>
</html>
توضیح:
- همان طور که ملاحظه می کنید، اطلاعات این فرم جهت پردازش به فایل فرضی contact.php ارسال می شوند.
- فرم تماس در نمونه بالا دارای سه فیلد از نوع text جهت درج نام، ایمیل و کد امنیتی، یک فیلد از نوع textarea برای درج یادداشت کاربر و یک فیلد hidden یا مخفی برای بررسی و اطمینان از ارسال فرم در سرور است.
- برای تنظیمات ظاهری فرم تماس، می توانید از css یا از خاصیت های استاندارد html استفاده کنید.
نکته: این فایل را باید با پسوند php ذخیره کنید، چون در ادامه به دستورات و کدهای php درون آن نیاز خواهیم داشت.

پردازش و ذخیره اطلاعات در سرور با php و mysql


بعد از ارسال فرم، نوبت به مرحله پردازش، اعتبار سنجی و سپس ذخیره اطلاعات است، البته قبل از ارسال فرم هم به روش های متفاوت (با جاوا اسکریپت یا آژاکس) می توان از معتبر بودن اطلاعات پیش از ارسال، اطمینان حاصل کرد که در مطالب قبلی به آن پرداخته ایم و در اینجا از تکرار مباحث خودداری می کنیم، اما برای مواردی که اشاره شد، یعنی پردازش و ذخیره اطلاعات، ابتدا لازم است که یک دیتابیس، جدول و چند ستون بسازیم و سپس با کدهای php، اطلاعات را در آن ذخیره کنیم.

ساخت دیتابیس، جدول و ستون برای فرم تماس


برای ساختن دیتابیس، در لوکال هاست یا در سرور از برنامه phpMyAdmin استفاده کرده و یک دیتابیس به صورت دستی با نام فرضی contact بسازید (دقت کنید که یونیکد یا collation پیش فرض دیتابیس بر روی utf8_general_ci باشد)؛ سپس در یک فایل php با نام فرضی install، کد زیر را ذخیره و اجرا کنید تا جدول و ستون ها در دیتابیس contact ایجاد شوند:
<?php
//اطلاعات اتصال به دیتابیس
$con = mysql_connect("localhost","root","")
or die(mysql_error());
//نام پایگاه داده
mysql_select_db("contact", $con)
or die(mysql_error());
//پرس و جوی ساخت جدول
mysql_query("CREATE TABLE form(
id INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY(id),
name VARCHAR(255),
mail VARCHAR(255),
message TEXT,
code VARCHAR(255),
date VARCHAR(255),
time VARCHAR(255),
userip VARCHAR(255),
useragent VARCHAR(255),
status VARCHAR(255)) ENGINE=MyISAM ")
or die(mysql_error());
echo "CREATE TABLE form = ok<br />";
//سازگاری با زبان فارسی
mysql_query("ALTER TABLE form
DEFAULT CHARACTER SET utf8
COLLATE utf8_general_ci;")
or die(mysql_error());
echo "ALTER TABLE form = ok<br />";
//پایان ارتباط    
mysql_close($con);
?>
اکنون دیتابیس برای ذخیره اطلاعات آماده است، ضمن اینکه با استفاده از دستور ALTER TABLE و تنظیم یونیکد utf8 برای ستون ها، برای کار با حروف و زبان فارسی نیز مشکلی نخواهیم داشت.
نکته: برای ستون message از data type یا نوع TEXT به جای VARCHAR استفاده کرده ایم؛ این کار به دلیل محدودیت VARCHAR نسبت به TEXT در حداکثر میزان ظرفیت کلمات و کاراکترها است (حداکثر تعداد بایت کاراکتر در نوع VARCHAR در نسخه های ماقبل 5.0.3 از 0 تا 255 و از نسخه های مابعد آن 0 تا 65,535 است، اما برای نوع TEXT در تمام نسخه ها 65,535 بایت معادل 64kb کاراکتر است، البته از مقادیر دیگر مثلTINYTEXT با حداکثر 256 بایت کاراکتر، MEDIUMTEXT با حداکثر 16,777,215 بایت کاراکتر (16MB) و LONGTEXT با حداکثر 4,294,967,295 بایت کاراکتر (4GB) هم می توانید بسته به هدفتان استفاده کنید).

کد php برای پردازش اطلاعات فرم تماس


همان طور که در بالا و در قسمت کد html گفتیم، اطلاعات ارسال شده از فایل index.php به یک فایل دیگر به نام contact.php فرستاده می شود (البته می توانید برنامه خود را طوری بنویسید که اطلاعات به همان فایل ارسال شوند و نیازی به یک فایل دیگر نباشد)، در این فایل کدهای زیر را قرار می دهیم.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>وبگو | فرم تماس با ما</title>
<!-- http://webgoo.ir -->
<style type="text/css">
body{
    font-family:Tahoma, Geneva, sans-serif;
    font-size:12px;
    direction:rtl;
}
.error{
    display:block;
    padding:10px;
    background-color:#C00;
    border:4px #EAEAEA solid;
    color:#FFF;
}
.sent{
    display:block;
    padding:10px;
    background-color:#090;
    border:4px #EAEAEA solid;
    color:#FFF;
}
</style>
</head>
<body>
<?php
//اطلاعات اتصال به دیتابیس
$con = mysql_connect("localhost","root","")
or die(mysql_error());
//نام پایگاه داده
mysql_select_db("contact", $con)
or die(mysql_error());
//تابعی برای ایمن سازی مقادیر
function clean($str) {
    $str = trim($str);
    if (get_magic_quotes_gpc()){
        $str = stripslashes($str);
    }    
    $str = htmlspecialchars($str);
return mysql_real_escape_string($str);
}
//دریافت و ایمن سازی متغیرها
$check = $_POST['check'];
$name = clean($_POST['name']);
$mail = clean($_POST['mail']);
$message = clean($_POST['message']);
$code = clean($_POST['code']);
//تنظیم تاریخ ، زمان و اختلاف زمانی سرور
$time_zone = 12600;
$date = date("Y-m-d", time()+$time_zone);
$time = date("H:i:s", time()+$time_zone);
//دریافت آی پی کاربر
$ip = $_SERVER['REMOTE_ADDR'];
//دریافت مشخصات مرورگر و سیستم
if (isset($_SERVER['HTTP_USER_AGENT'])){
    $agent = $_SERVER['HTTP_USER_AGENT'];
}
else{
    $agent = 'unknown';
}
//مقادیر پیش فرض برای خطا
$error = 0;
//بررسی معتبر بودن اطلاعات
if ($check == 1 && $name == ''){
    echo "<div class=\"error\">لطفا نام خود را وارد کنید!</div>";
    $error = 1;
}
elseif ($check == 1 && $message == ''){
    echo "<div class=\"error\">لطفا پیام خود را وارد کنید!</div>";
    $error = 1;    
}
elseif ($check == 1 && $code == ''){
    echo "<div class=\"error\">لطفا کد امنیتی را وارد کنید!</div>";
    $error = 1;    
}
//بررسی و ذخیره اطلاعات در دیتابیس
if ($check == 1 && $error != 1){
    //بررسی کد امنیتی
    $result = mysql_query("SELECT * FROM form WHERE userip = '$ip' AND code = '$code' AND status = 'temp' LIMIT 1")
    or die(mysql_error());
    $code_exist = mysql_num_rows($result);
    if ($code_exist > 0){
        //ذخیره اطلاعات در دیتابیس
        mysql_query("INSERT INTO form (name,mail,message,code,date,time,userip,useragent,status) VALUES ('$name','$mail','$message','$code','$date','$time','$ip','$agent','sent')")
        or die(mysql_error());
        echo "<div class=\"sent\">پیام شما با موفقیت ارسال شد!</div>";        
    }
    else{
        echo "<div class=\"error\">کد امنیتی اشتباه است! [<a href=\"javascript: history.go(-1)\">بازگشت</a>]</div>";
    }
}
//پایان ارتباط    
mysql_close($con);
?>
</body>
</html>
اکنون باید دو فایل با نام های index.php که فرم تماس را در آن نوشته ایم و فایلی دیگر با نام contact.php برای پردازش و ذخیره اطلاعات داشته باشیم، اما توضیح موارد مورد نیاز.
توضیح:
- در ابتدا یک اتصال با دیتابیس برقرا می کنیم، چرا که در ادامه کد، اطلاعاتی را از دیتابیس فراخوانی یا در آن ذخیره خواهیم کرد؛ دقت کنید که در این قسمت باید از نام کاربری و کلمه عبور دیتابیس خود استفاده کنید (در حالت پیش فرض این کار برای لوکال هاست انجام شده است).
- سپس متغیرهایی را که برای بررسی و کارکرد صحیح برنامه به آنها نیاز خواهیم داشت، تعریف می کنیم، همان طور که ملاحظه می کنید، از تابعی با نام clean برای جلوگیری از نفوذ به دیتابیس یا همان mysql injection استفاده کرده ایم، این تابع در واقع در درون خود چند کار را انجام می دهد، ابتدا فضای خالی احتمالی ابتدا و انتهای مقدار ارسال شده با trim حذف می شود، سپس وضعیت فعال بودن get_magic_quotes_gpc در سرور بررسی می شود، اگر این قابلیت در سرور فعال باشد (به طور پیش فرض معمولا این امکان غیر فعال است، ولی در برخی نسخه های قدیمی php ممکن است این طور نباشد)، مفسر php به صورت خودکار بک اسلش هایی (\) به مقادیر ارسال شده اضافه می کند (هر جا که علامت " یا ' باشد)، برای جلوگیری از ایجاد این بک اسلش های تکراری و ناخواسته، از stripslashes استفاده می کنیم؛ در قسمت بعدی تابع، htmlspecialchars کاراکترهای مربوط به تگ های html را غیر فعال می کند، این کار باعث می شود تگ ها به صورت متن دریافت شوند نه به صورت کدهای html، در نهایت نیز mysql_real_escape_string مقادیر را به جهت جلوگیری از نفوذ به دیتابیس ایمن سازی می کند و متغیر نهایی با return از تابع برگردانده می شود.
- تاریخ و زمان ارسال پیام را با تابع date در php بدست می آوریم، در اینجا علاوه بر این کار، اختلاف زمانی سرور از وقت محلی (ایران) را هم حساب می کنیم، برای سرورهایی که بر روی GMT تنظیم شده اند، اختلاف 3:30 معادل 12600 ثانیه و 4:30 معادل 16200 ثانیه خواهد بود؛ لذا این مقادیر را به زمان فعلی سرور اضافه می کنیم (دقت کنید که برخی سرور ها بر روی زمان دیگری ممکن است تنظیم شده باشند).
- برای اینکه سیستم کد امنیتی به طور صحیح کار کند، ما نیاز به شناسایی کاربران متفاوت از هم داریم، بدین منظور تقریبا دو راه وجود دارد؛ استفاده از سشن (session) و مقادیر id آن، یا استفاده از IP کاربر، به جهت جلوگیری از پیچیده شدن مبحث، در اینجا تنها از IP استفاده کرده و بحث سشن ها و کدهای امنیتی را به مطلب دیگری موکول می کنیم.
- برای بدست آوردن IP کاربر، ساده ترین راه استفاده از دستور SERVER و REMOTE_ADDR است که در کد بالا ملاحظه می کنید.
- علاوه بر این، اگر تمایل دارید اطلاعاتی در مورد مرورگر و سیستم عامل کاربر داشته باشید، می توانید از HTTP_USER_AGENT نیز استفاده کنید، در مثال بالا این کار انجام شده است.
- مرحله بعدی، مرحله اعتبار سنجی و اطمینان از خالی نبودن فیلد های مورد نیاز است (روش و نوع اعتبار سنجی به خودتان و هدفی که دارید، بستگی دارد و از این لحاظ محدودیتی نیست).
- و در گام نهایی نیز، پس از ارسال صحیح مقادیر از فرم تماس، ابتدا بررسی می شود که کد ذخیره شده برای IP کاربر در دیتابیس با آنچه که کاربر در فیلد مربوط به کد امنیتی وارد کرده است، یکی باشد، اگر این کدها مطابق هم بودند (در این صورت mysql_num_rows مقادیر 1 را برمی گرداند)، اطلاعات او در پایگاه داده ذخیره می شود و در غیر این صورت قسمت else اجرا شده و پیغام خطا نشان داده می شود.
اما اگر دقت کرده باشید، گفتیم IP و کد امنیتی با آنچه در دیتابیس ذخیره شده مقایسه می شود، لذا باید از قبل و در فرم تماس، IP و کد را علاوه بر ذخیره کردن، به کاربر نیز نشان دهیم (تا او مقادیر کد امنیتی را در فیلد مربوط وارد کند)؛ لذا در فایل index.php مقادیر زیر را برای سیستم کد امنیتی یا captcha اضافه می کنیم.

ساخت سیستم کد امنیتی یا captcha


همان طور که می دانیم، کد امنیتی یا captcha، به سیستمی برای شناسایی کاربران حقیقی (انسان ها) از کاربران ماشینی (ربات های خزنده، برنامه های مخرب و...) گفته می شود، اینکه چگونه این قابلیت را به فرم خود اضافه کنیم، تا حدود زیادی بستگی به خودتان دارد، برنامه هایی نیز بدین منظور نوشته شده و در وب وجود دارد که هر کدام دارای معایب و مزایایی هستند، اما اگر می خواهید خودتان این کار را انجام دهید، یک روش ساده را در زیر توضیح می دهیم و توسعه آن را به عهده شما می گذاریم.
گام اول برای ساخت سیستم کد امنیتی، ذخیره اطلاعات منحصر به فرد هر کاربر در دیتابیس است، برای این کار معمولا برنامه نویسان وب از دو روش IP یا روش سشن (session) استفاده می کنند، این دو روش در عمل یک کارکرد دارند ولی از نظر جزئیات کمی با هم فرق می کنند؛ گام بعدی ما ایجاد یک کد امنیتی (با استفاده از توابع و روش های مختلف در php) است، این کد همراه با اطلاعات کاربر علاوه بر اینکه در دیتابیس ذخیره شده، در یک بلاک مشخص به صورت یک معادله ساده، به کاربر نشان داده می شود (تا او بتواند مقادیر را وارد فیلد مورد نظر کند)؛ حال بعد از ارسال فرم، مقادیر موجود در دیتابیس با کد ارسال شده کاربر تطبیق داده می شود، اگر اطلاعات همسان و درست بود، پیام کاربر ذخیره می شود و در غیر این صورت، پیغام خطای کد امنیتی نشان داده می شود.
توجه داشته باشید، برنامه نویسانی که ربات های خزنده و اسپمرها را طراحی می کنند، هم زمان با به کارگیری روش های نوین ساخت کد امنیتی، برنامه های مخرب خود را نیز هوشمندتر می کنند، به طور مثال حتی برخی ربات ها قادر به تجزیه تحلیل و خواندن اعداد و حروف داخل تصاویر captcha هستند، پس مهم است از روشی استفاده نمائید که قابل شناسایی برای ربات نباشد و تا می توانید آن را پیچیده کنید، یکی از این روش ها که بازدهی بالاتری نسبت به موارد مشابه دارد، ترکیب اعداد به صورت حاصل جمع، ضرب و... است، معمولا این برنامه ها آنقدر هم هوشمند نیستند که منظور حقیقی شما را تشخیص دهند و احتمالا هر آنچه را در فرم می بینند در فیلد وارد می کنند! (سعی کنید از علامت های دیگر مانند فاصله، ()، [] و ... نیز در زمان نمایش کد امنیتی استفاده کنید)؛ در مثال زیر ما از حاصل جمع دو عدد استفاده کرده ایم.
فایل index.php که پیش از این ساختیم را ویرایش کرده و به صورت زیر تغییر دهید.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>وبگو | فرم تماس با ما</title>
<!-- http://webgoo.ir -->
<style type="text/css">
body{
    font-family:Tahoma, Geneva, sans-serif;
    font-size:12px;
    direction:rtl;
}
label{
    display:inline-block;
    width:100px;
    height:25px;
    vertical-align:top;
}
.code{
    width:50px;
    margin-top:2px;
}
.code-box{
    display:inline-block;
    font-weight:bold;
}
</style>
</head>
<body>
<?php
//اطلاعات اتصال به دیتابیس
$con = mysql_connect("localhost","root","")
or die(mysql_error());
//نام پایگاه داده
mysql_select_db("contact", $con)
or die(mysql_error());
//ساخت کد امنیتی
$code_1 = rand(1,9);
$code_2 = rand(1,9);
$code = $code_1 + $code_2;
//دریافت آی پی کاربر
$ip = $_SERVER['REMOTE_ADDR'];
//بررسی وضعیت کاربر در سرور
$result = mysql_query("SELECT * FROM form WHERE userip = '$ip' AND status = 'temp' LIMIT 1")
or die(mysql_error());
$user_exist = mysql_num_rows($result);
if ($user_exist > 0){
    //به روز رسانی کد برای آی پی کاربر در دیتابیس
    mysql_query("UPDATE form SET code='$code' WHERE userip = '$ip' AND status = 'temp'" )
    or die(mysql_error());    
}
else{
    //ذخیره کد و آی پی کاربر در دیتابیس
    mysql_query("INSERT INTO form (code,userip,status) VALUES ('$code','$ip','temp')")
    or die(mysql_error());
}
?>
<form action="contact.php" method="post">
<label for="name">نام:</label>
<input name="name" id="name" type="text" maxlength="255" /><br />
<label for="mail">ایمیل:</label>
<input name="mail" id="mail" type="text" maxlength="255" dir="ltr" /><br />
<label for="message">یادداشت:</label>
<textarea name="message" id="message" cols="35" rows="8">
</textarea><br />
<label for="code">کد امنیتی:</label>
<input name="code" id="code" type="text" class="code" />
<div class="code-box"><?php echo $code_1.' + '.$code_2 ?></div><br />
<input type="hidden" name="check" value="1" />
<input type="submit" value="ارسال" />
</form>
</body>
</html>
توضیح:
- از آنجایی که به حاصل جمع دو عدد تصادفی نیاز داریم، برای ساخت کد امنیتی از تابع rand در php استفاده کرده ایم، کد نهایی ما، در واقع حاصل جمع دو مقدار اتفاقی بین اعدا 1 تا 9 خواهد بود (روش تولید کدهای اتفاقی به این شیوه محدود نمی شود و می توان توابع پیشرفته تری برای آن به کار برد).
- برای تفکیک کاربرانی که نظر آنها ارسال و در دیتابیس ذخیره شده با آنهایی که هنوز نظری ارسال نکرده اند، از یک ستون با نام status یا وضعیت استفاده کرده ایم (نامی دلخواه است)، بدین ترتیب کاربرانی که نظر آنها ارسال نشده است یا قصد ندارند نظری ارسال کنند، تنها به عنوان temp یا موقتی در دیتابیس ذخیره می شوند و مقادیر این ستون برای آنهایی که پیامی ارسال می کنند، sent در نظر گرفته می شود (در فایل contact.php این مقادیر بعد از بررسی صحیح بودن کد امنیتی، در ستون status ذخیره می شود).
- همان طور که ملاحظه می کنید، ابتدا بررسی می کنیم که آیا چنین کاربری (IP) در دیتابیس از قبل موجود است (ممکن است کاربر صفحات سایت را قبلا دیده باشد)، اگر این طور بود، مقادیر مربوط به ستون کد امنیتی را با مقدار جدید به روز رسانی می کنیم (و با این کار از ایجاد یک ردیف جدید تکراری برای کاربر در دیتابیس، جلوگیری می کنیم).
- اما اگر کاربری با این IP در دیتابیس از قبل وجود نداشت، یعنی او اولین بار است که از صفحات سایت دیدن می کند، برای او یک ردیف جدید ایجاد کرده و به این صورت به نحوی تقریبا هوشمندانه وضعیت کاربر را شناسایی می کنیم، علاوه بر این شما می توانید با درک نحوه کارکرد این شیوه، روش های منحصر به فرد و هوشمندانه تری نیز ابداع کنید، به طور مثال در حالت فعلی حتی اگر کاربر نظری ارسال نکند، یک ردیف در دیتابیس برای IP او در نظر گرفته می شود و واضح است که پس از مدتی ممکن است تعداد این ردیف های temp زیاد شوند، البته این اتفاق به طور کلی مشکل خاصی ایجاد نمی کند، ولی می توان از ایجاد ردیف های اضافه در mysql با تعریف یک سیستم هوشمندتر جلوگیری کرد، به فرض ردیف های temp را پس از چند روز به حالت غیر فعال درآورد (به فرض در ستون status برای ردیف هایی که تاریخ آنها مربوط به چند روز پیش است، مقادیر فرضی trash را در نظر گرفت!) و برنامه را طوری تنظیم کرد که ابتدا از ردیف های غیر فعال استفاده کند و اگر دیگر ردیف غیر فعالی باقی نبود، ردیف های جدید برای کاربران temp بسازد (چیزی شبیه به یک سیستم بازیافت!)، به هر صورت انجام این موضوع تا حدود زیادی به میزان آشنایی شما با برنامه نویسی و به طور خاص برنامه نویسی وب برمی گردد.
- برای نمایش کد امنیتی از یک بلاک با کلاس css فرضی code-box استفاده کرده ایم، با دقت در نحوه عملکرد کد، به راحتی می توانید تغییرات سفارشی و دلخواه خود را در آن ایجاد کنید.

نمایش پیام های ذخیره شده در دیتابیس


پس از ذخیره اطلاعات در دیتابیس، نوبت به فراخوانی و نمایش آنها است، برای این کار نیز به راحتی می توانید از دستور SELECT * FROM در mysql استفاده کنید، به طور مثال:
<?php
//اطلاعات اتصال به دیتابیس
$con = mysql_connect("localhost","root","")
or die(mysql_error());
//نام پایگاه داده
mysql_select_db("contact", $con)
or die(mysql_error());
//نمایش پیام ها
$result = mysql_query("SELECT * FROM form WHERE status != 'temp' LIMIT 15")
or die(mysql_error());
$message_exist = mysql_num_rows($result);
if ($message_exist > 0){
    $loop = 1;
    while ($row = mysql_fetch_array($result)){
        $name = $row['name'];
        $mail = $row['mail'];
        $message = nl2br($row['message']);
        $date = $row['date'];
        $time = $row['time'];
        $ip = $row['userip'];
        $agent = $row['useragent'];
        echo "شماره: $loop - نام: $name - ایمیل: $mail <br /> پیام: $message <br /> تاریخ: $date - زمان: $time آی پی: $ip - سیستم: $agent  <hr />";
        $loop++;
    }
}
else{
    echo "<div class=\"error\">هنوز هیچ پیامی ارسال نشده است!</div>";
}
//پایان ارتباط    
mysql_close($con);
?>
توضیح:
- در کد بالا، ابتدا بررسی می کنیم تا ببینیم آیا پیام ارسال شده ای در دیتابیس موجود است یا خیر، اگر پیامی موجود باشد mysql_num_rows عددی بزرگتر از صفر خواهد بود و با mysql_fetch_array و حلقه while اطلاعات ردیف ها را استخراج کرده و نمایش می دهیم.
- برای جلوگیری از مشکل نمایش خطوط جدید در پیام به صورت یک خطی(یا همان مشکل حذف خطوط  جدید یا line break پیام در textarea)، از تابع nl2br استفاده می کنیم، این کار به این دلیل است که در php برای خطوط و سطرهای جدید، به جای تگ <br> از n\r\ استفاده می شود و لذا هنگام نمایش پیام در صفحات html باید از تابع nl2br استفاده کنیم تا خطوط php به خطوط html تبدیل شوند، در غیر این صورت پیام شما در یک سطر نشان داده می شود و فاصله بین خطوط حذف می شود!
در پایان این مطلب، یک بار دیگر یادآوری می کنیم که این فرم صرفا یک نمونه و الگو است، با آشنایی و تسلط نسبی بر php و mysql، به راحتی می توانید مواردی پیشرفته تر و به صورت سفارشی تعریف نمائید؛ در آموزش های بعدی، به شیوه های ساختن کدهای captcha و تعویض آنها به صورت آژاکسی (ajax) خواهیم پرداخت.
sectionدسته بندی: آموزش کاربردی » MySQL
related مطالب بیشتر:
» آموزش حذف گروهی اطلاعات از MySQL با استفاده از چک باکس
» صفحه بندی مطالب و محتوا با PHP و MySQL
» آموزش ساخت پنل ورود و خروج سایت با php و mysql
» تعویض کد امنیتی captcha با ajax و mysql
» ساخت فید آر اس اس (RSS Feed)، با استفاده از php و mysql
commentنظرات (۸۲ یادداشت برای این مطلب ارسال شده است)
نویسنده: hasan
زمان: ۲۳:۴۱:۵۰ - تاریخ: ۱۳۹۱/۰۶/۱۹
آموزش ها عالیه
نویسنده: محسن طحانیان
زمان: ۱۱:۰۳:۲۶ - تاریخ: ۱۳۹۱/۰۶/۲۱
سلام خسته نباشید
از مطالب و آموزشهایی که گذاشتید واقعا ممنونم
خیلی بهم کمک کردند
اگه براتون ممکنه آموزش ساخت یه فروشگاه رو هم توضیح و آموزش بدید
بابت زحماتی که میکشید واقعا ازتون تشکر میکنم
پاسخ: 
سلام
خواهش می کنیم؛ در مورد آموزش ساخت فروشگاه، البته این یک پروژه کامل است که از جزئیات و بخش های متفاوت تشکیل می شود که هر بخش نیازمند یک مطلب آموزشی جداگانه است، به طور مثال آموزش فعلی می تواند برای بخش نظرات یا تماس آن مورد استفاده قرار گیرد.
نویسنده: maryam
زمان: ۱۵:۵۸:۴۱ - تاریخ: ۱۳۹۱/۰۶/۳۰
عالی بود
نویسنده: رضا
زمان: ۱۱:۲۸:۱۲ - تاریخ: ۱۳۹۱/۰۷/۲۵
سلام
دست مریضاد بسیار بسیار عالی بود اگه ممکن مطالب درمورد css-php متنی یا ویدیویی به ایمیلم ارسال کنید چون من دسترسی زیادی به اینترنت ندارم و هر از گاهی میام از لطفتون تشکر میکنم
پاسخ: 
سلام
متاسفانه این امکان وجود ندارد، پیشنهاد ما این است که از برنامه های دریافت یکباره و مشاهده آفلاین سایت ها استفاده کنید.
نویسنده: رضا
زمان: ۲۱:۱۸:۵۲ - تاریخ: ۱۳۹۱/۰۸/۰۵
سلام
خیلی عالی بود
میخواستم بپرسم میشه یه کاری کرد که به ترتیب حروف الفبا نشون بده
مثلا کسی که اسمش Ali ثبت شده اول قرار بگیره
و یه چیزه دیگه اینکه چکار کنم که پیام اول مثلا متنش قرمز باشه و بعدی آبی و همینطوری به ترتیب قرمز و آبی باشه
لطفا کمک کنید
ممنون
پاسخ: 
سلام
برای مرتب کردن بر اساس حروف الفبا کافی است هنگام پرس و جو ORDER BY name را اضافه کنید، MySQL به صورت خودکار نتایج را به ترتیب حروف الفبا (انگلیسی) یا ترتیب اعداد مرتب می کند.
//نمایش پیام ها
$result = mysql_query("SELECT * FROM form WHERE status != 'temp' ORDER BY name LIMIT 15")
or die(mysql_error());
برای خروجی گرفتن به صورت دو رنگ هم کافی است در حلقه while هنگام خروجی گرفتن یک متغیر را به عنوان کلاس css تعریف کنید و به تناوب مقادیر آن را در دستورات شرطی if و elseif تغییر دهید، به طور مثال چیزی شبیه این:
<?php
if ($message_exist > 0){
$color_class = 'gray';
while ($row = mysql_fetch_array($result)){
if ($color_class == 'gray'){
echo '<div class="'.$color_class.'">خروجی</div>';
$color_class = 'white';
}
elseif($color_class == 'white'){
echo '<div class="'.$color_class.'">خروجی</div>';
$color_class = 'gray';
}
}
}
?>
به این ترتیب تا هر زمان که حلقه while ادامه پیدا کند، بلاک های div با دو کلاس gray و white یکی در میان تکرار می شوند و البته باید استایل css را نیز از قبل برای آنها تعریف کرده باشید.
نویسنده: محمد هوشیاراحمدی
زمان: ۱۵:۱۵:۲۹ - تاریخ: ۱۳۹۱/۰۸/۰۷
با عرض سلام
همه چیز عالی است
ولی یک سئوال دارم و آن هم این است که آیا یک فرم ارتباط با حد امنیتی بدون دیتابیس را چطوری می توان ایجاد کرد لطفا راهنمائی کنید
پاسخ: 
سلام
کافی است به جای استفاده از دیتابیس، از کدهای ارسال ایمیل استفاده کنید که لینک مطلب مربوطه در آموزش قرار داده شده است، البته باید تا حدودی با php هم آشنایی داشته باشید.
نویسنده: امیر علی
زمان: ۱۴:۵۰:۱۱ - تاریخ: ۱۳۹۱/۰۸/۱۵
سلام طبق اموزش پیشرفتم. اخریش گفته بودین این کد ها رو داخل فایل index.php قرار بدهید. قرار دادم ولی این ارور رو میده:
Table 'contact.form' doesn't exist
و وقتی با اچ تی ام ال کل فرم رو پر می کنم می فرستم میگه کد امنیتی اشتباه است. خب کادری برای کد نشون نمیده که ببینیم چی نوشته.

کمک کنید لطفا .
تشکر
پاسخ: 
سلام
طبق خطایی که دریافت کرده اید، در دیتابیس contact جدولی با نام form وجود ندارد، در حالی که در کدها از این جدول استفاده شده، لذا ابتدا باید از صحیح بودن اطلاعات دیتابیس و جداول موجود اطمینان حاصل نمائید، برای این کار می توانید از برنامه phpmyadmin نیز استفاده کنید.
نویسنده: منتظر
زمان: ۱۳:۰۳:۳۸ - تاریخ: ۱۳۹۱/۱۰/۰۴
سلام من این مراحل رو انجام دادم ولی این ارور را میده.
Access denied for user 'root'@'localhost' (using password: NO)
پاسخ: 
سلام
بر روی لوکال هاست امتحان می کنید یا بر روی سرور؟ اگر بر روی سرور امتحان می کنید باید یک دیتابیس بسازید و از نام کاربری و کلمه عبور آن جهت اتصال به پایگاه داده استفاده نمائید.
کاربر root و بدون پسورد برای اتصال در لوکال به کار می رود نه سرور.
نویسنده: منتظر
زمان: ۱۴:۲۸:۱۴ - تاریخ: ۱۳۹۱/۱۰/۰۴
سلام
من خیلی سر در نمیارم فقط همین فایل ها رو که فرمودید ساختم و آپ کردم ولی این پیغام رو داد.
البته یه فلدر توی public_html یه اسم mail ساختم و اون 4 فایل رو داخلش گذاشتم که نشد.
میشه لطف کنید بفرمائید چکار باید بکنم؟
ممنون
پاسخ: 
سلام
آموزش های کاربردی با فرض آشنایی مقدماتی کاربران ارائه می شوند، لذا توصیه ما این است که php و mysql را در حد آشنایی نسبی یاد بگیرید؛ همان طور که قبلا گفتیم، برای اتصال به پایگاه داده در سرور باید دیتابیسی داشته باشید (ابتدا از طریق کنترل پنل هاست یک دیتابیس بسازید) و از نام کاربری و کلمه عبور آن استفاده کنید (اگر این نام کاربری یا کلمه عبور اشتباه باشد، متن خطا دریافت می کنید)، در لوکال هاست یا همان هاست مجازی (که در سیستم های خانگی و به کمک برنامه هایی مانند wampserver راه اندازی می شود)، نیازی به کلمه عبور نیست، کافی است یک دیتابیس بسازید و از نام کاربری root و بدون پسورد به آن متصل شوید.
اما تمام این موارد در صورتی است که شما قصد ذخیره پیام ها در دیتابیس را داشته باشید، یعنی اگر هدف صرفا ارسال پیام ها به ایمیل (و نه دیتابیس) است، کافی است آموزش مربوط به ارسال ایمیل با php (که لینک آن در مطلب حاضر وجود دارد) را مطالعه و اطلاعات فرم را به آدرس ایمیل خود ارسال کنید.
نویسنده: منتظر
زمان: ۱۱:۲۲:۱۰ - تاریخ: ۱۳۹۱/۱۰/۰۵
سلام
ممنون که این همه لطف کردید و جواب دادین
شما درست می فرمایید من باید اول مقدمات رو بدونم
هدف من ذخیره روی دیتابیس هستش
فقط می خواستم ببینم اگر من دیتابیس رو ساختم و مثلا A یوزر و B پسورد بود چه تغییراتی باید توی کد اون 4 فایل و کجا بدم که روی سایت کار بکنه؟
ممنون می شم کمک کنید
پاسخ: 
سلام
اطلاعات اتصال را باید برای تابع mysql_connect و نام پایگاه داده را برای تابع mysql_select_db استفاده کنید، به طور مثال اگر A نام کاربری و B پسورد و C نام پایگاه داده باشد، اتصال به پایگاه داده به این صورت خواهد بود:
<?php
//اطلاعات اتصال به دیتابیس
$con = mysql_connect("localhost","A","B")
or die(mysql_error());
//نام پایگاه داده
mysql_select_db("C")
or die(mysql_error());
?>
نکته: اطلاعات اتصال به پایگاه داده با اطلاعات ورود به کنترل پنل هاست متفاوت است، به زبان ساده برای پایگاه داده باید یک کاربر ویژه هم تعریف کرده باشید (در قسمت مدیریت پایگاه های داده، در پنل هاست) که حق استفاده از آن را داشته باشد.
نویسنده: لیلی
زمان: ۱۴:۴۴:۰۵ - تاریخ: ۱۳۹۱/۱۰/۰۷
سلام
خیلی ممنون از مطالب خوب و مفیدتان .
در رابطه با مطلب بالا مشکلی داشتم وقتی اجرا می کنم در صفحه contact خطای
Duplicate entry '0' for key 'PRIMARY'
را می دهد مشکل از کجاست. ممنون از زحماتتان. لطفا جواب دهید. با تشکر
پاسخ: 
سلام
این مشکل ممکن است دلایل متعددی داشته باشد؛ ابتدا بررسی کنید که موتور جدول دیتابیس MyISAM باشد نه InnoDB، سپس دقت کنید که در هنگام ذخیره اطلاعات با INSERT برای ID نباید مقادیری فرستاده شود (حتی مقادیر خالی)، چون ستون ID از نوع افزایش خودکار (AUTO_INCREMENT) است، نکته دیگر اینکه ببینید اولین سطر از اطلاعات جدول دیتابیس با مقادیر 1 برای ID شروع شده باشد یعنی شمارش از 1 باشد نه صفر، اگر از صفر شروع شده بود، مقادیر ID را به 1 تغییر دهید، یک احتمال دیگر ممکن است مشکل از خود دیتابیس باشد، یک بار دیتابیس را تعمیر (Repair) کنید، اگر مشکل با راه حل های بالا حل نشد، فایل های خود را به ایمیل ما (در بخش تماس موجود است) ارسال کنید تا بررسی گردد.
نویسنده: ansherli
زمان: ۱۸:۴۳:۵۷ - تاریخ: ۱۳۹۱/۱۰/۱۱
سلام
من می خوام از اديتور TinyMCE برای textarea استفاده کنم ولی هرچی گشتم توی سایت نتونستم آموزشش رو پیدا کنم .ممنون میشم این اموزش رو هم قرار بدید.
توی نت گشتم ولی همه آموزش ها یکجور بود منتها کدم اجرا نشد فقط یه textarea قرار میگیره!
لینک دانلود :
http://www.tinymce.com/download/download.php
ممنون میشم آموزش با عکس باشه تا من بتونم بفهمم مشکلم از چیه. البته در صورت امکان
متشکرم
پاسخ: 
سلام
نمونه آموزش های ویرایشگر TinyMCE WYSIWYG در سایت سازنده وجود دارد و در کوتاه مدت امکان نگارش و انتشار آنها در سایت نیست، در صورت تمایل برای حل مشکل فعلی یک نمونه کد از صفحه خود به ایمیل ما ارسال کنید تا بررسی گردد.
نویسنده: ansherli
زمان: ۲۱:۴۵:۲۷ - تاریخ: ۱۳۹۱/۱۰/۱۲
ممنونم از توجهتون
خوشبختانه مشکل حل شد هر چند هنوزم نمیدونم مشکل از چی بود! :)
نویسنده: arash
زمان: ۰۰:۲۶:۳۰ - تاریخ: ۱۳۹۱/۱۰/۲۶
سلام ممنون
چجوری برای دیدن اطلاعات یوزر پس بزارم که فقط خودم بتونم بخونم اطلاعات رو نه کس دیگه اگه میشه راهنمایی کنید
پاسخ: 
سلام
باید با مبحث سشن ها در php آشنا باشید، برای اطلاعات بیشتر از نمونه آموزشی که در مطالب کاربردی mysql درج شده (در رابطه با ایجاد پنل ورود و خروج) هم می توانید استفاده کنید.
نویسنده: ایمان
زمان: ۱۹:۲۸:۰۲ - تاریخ: ۱۳۹۱/۱۱/۰۸
سلام مرسی از آموزش خوبتون
من دیتابیس رو با نام contact با phpmyadmin ساختم و صفحه install رو هم درست کردم بعد دقیقآ نفهمیدم چطوریه، دستورات صفحه install رو باید با phpmyadmin ایمپورت کنیم به دیتابیسمون؟
ببخشید اصلن این قسمت رو نمیدونم چطوریه
پاسخ: 
سلام
خیر، با phpmyadmin تنها باید دیتابیس را ایجاد کنید (البته این کار با کدهای php نیز ممکن است) سایر موارد با اجرای فایل install.php انجام می شوند، با اجرای این فایل، برنامه به دیتابیس متصل شده و بر اساس دستوراتی که نوشتید عملیات مورد نظر شما در دیتابیس انجام می شود.
paged صفحه 1 از 6




more لطفا دقت کنید که یادداشت های زیر منتشر نشده و حذف خواهند شد:
- یادداشت های خارج از موضوع این مطلب.
- سوالات کلی، غیر ضروری و مشکلاتی که هیچ تلاشی برای رفع آن نکرده باشید.
- نظرات حاوی کدها و اسکریپت های خیلی طولانی (به طور مثال کد کامل قالب وبلاگ).

6 × 5
 refresh
آگهی
seonab.com
طراحی نرم افزار اندروید
رنگین کمان عکس
Ranginkamaan.com

آرشیو عکس های باکیفیت با موضوعات متنوع...