ارسال اطلاعات به ديتابيس در PHP

در این مقاله به آموزش اتصال به دیتابیس در php می‌پردازیم و نحوه‌ی ارسال اطلاعات به ديتابيس در PHP را به شما آموزش می‌دهیم. یکی از جالب‌ترین قسمت‌های پیاده‌سازی یک وب سایت کار با پایگاه داده‌ ‌می‌باشد‌‌ و از آن جایی که پایگاه داده بخش خیلی مهمی از پروژه ما است پس باید بتوانیم خیلی خوب با پایگاه داده کار کنیم تا مشکلات امنیتی و یا مشکلاتی نظیر خطا داشتن کدهایمان پیش نیاید. در این قسمت از آموزش قرار است که با هم یاد بگیریم که چگونه می‌توان اطلاعات مورد نظرمان را به پایگاه داده ارسال کنیم، با ما همراه باشید.

آماده سازی محیط کار برای ارسال اطلاعات به ديتابيس در PHP

در این آموزش ما تاکید بر استفاده از یک ویرایشگر یا IDE خاصی نداریم و شما با هر ویرایشگری که راحت‌تر هستید می‌توانید کار کنید.

بعد از انتخاب ویرایشگر خود حال شما باید یک وب سرور محلی داشته باشید که دو نوع معروف آن را می‌توان به WAMP و XAMPP اشاره کرد که ما به شما پیشنهاد می‌کنیم وب سرور مجازی XAMPP را بر روی سیستم خود داشته باشید.

ما در این پروژه‌ی کوچک نیاز به سه فایل با نام‌های config.php و index.php و process.php داریم، فایل config.php قرار است که تمامی مشخصات مربوط به پایگاه‌داده را در خود ذخیره سازی کند تا بتوانیم در طول پروژه و زمانی که می‌خواهیم به پایگاه‌داده متصل بشویم از آن استفاده کنیم.

در فایل index.php نیز ما کدهای ساده‌ی html خود را درون آن قرار می‌دهیم نظیر یک فرم که در ادامه‌ی آموزش به طور کامل به آن می‌پردازیم. در فایل process.php قرار است کدهای PHP که اطلاعات را به سمت پایگاه‌ داده ارسال و ثبت می‌کند را قرار دهیم.

آماده سازی پایگاه داده برای ارسال اطلاعات به ديتابيس در PHP

قبل از هر پروژه‌‌ای ما باید ابتدا جداول و فیلدهای پایگاه داده خود را مشخص کنیم، نگاه کلی به این پروژه کوچک این است که ما یک فرم در صفحه index.php خود داشته باشیم و از کاربر اطلاعاتی نظیر نام کاربری، ایمیل و سن او را دریافت کنیم.

اکنون باید پایگاه داده خود را نسبت به کاری که قرار است در پروژه انجام شود طراحی کنیم، ما یک پایگاه داده به اسم پروژه‌ی خودمان می‌سازیم تا تمامی عملیات پایگاه داده مربوط به پروژه‌ی خود را درون آن داشته باشیم، برای مثال نام پایگاه داده‌ی خود را myProject قرار می‌دهیم.

برای ساخت یک پایگاه داده درون mysql همان‌طور که گفتیم ابتدا باید XAMPP خود را نصب داشته باشیم و Apache و Mysql را Start یا روشن کنیم تا بتوانیم از این دو استفاده کنیم. با وارد کردن آدرس localhost/phpmyadmin در آدرس بار مرورگرمان می‌توانیم وارد محیط Phpmyadmin بشویم و از Mysql استفاده کنیم.

باز زدن دکمه new در بالا اسامی پایگاه داده می‌توانیم یک پایگاه داده ایجاد کنیم.

ارسال اطلاعات به ديتابيس در PHP : پایگاه داده Mysql - Phpmyadmin

بعد از کلیک کردن بر روی دکمه new در صفحه باز شده ما باید نام پایگاه داده و Encoding آن را وارد کنیم، همان‌طور که در قبل هم گفته شد نام پایگاه داده خود را myProject می‌گذاریم و Encoding پایگاه داده را نیز utf8mb4_general_ci قرار می‌دهیم که مناسب‌ترین و سازگارترین نوع برای کلمات فارسی نیز می‌باشد. بعد از وارد کردن این موارد بر روی دکمه create بزنید تا پایگاه داده شما ایجاد شود.

ارسال اطلاعات به ديتابيس در PHP : ایجاد پایگاه داده در phpmyadmin

بعد از ایجاد شدن پایگاه داده الان نوبت آن است که جدول مورد نظر خودمان را بسازیم تا بتوانیم داده‌های مورد نظرمان را به صورت منظم درون یک جدول داشته باشیم.

بعد از اینکه ما پایگاه داده خود را ساختیم به طور خودکار وارد صفحه‌ای می‌شویم که از ما می‌خواهد جدول مورد نظرمان را ایجاد کنیم.

در فیلد Name ما باید نام جدول خود را قرار دهیم که در پروژه‌ی ما قرار است اطلاعاتی مربوط به کاربران را درونش ذخیره سازی کنیم پس با این اوصاف نام جدول خود را users قرار می‌دهیم. بعد از قرار دادن نام جدول حال باید تعداد فیلدهای جدول خود را درون Number of columns مشخص کنیم. همان‌طور که در بالاتر نیز گفته شد قرار است نام کاربری، ایمیل و سن کاربر را ذخیره سازی کنیم پس نتیجه می‌گیریم که ما نیاز به چهار فیلد داریم.

شاید با خودتان بگویید که این‌ها فقط سه فیلد است پس چرا چهار فیلد؟ باید به شما بگوییم که همه‌ی جداول درون پایگاه داده یک فیلد به نام id نیاز دارد که یک عدد منحصر به فرد است و برای هر record یا اطلاعاتی که درون پایگاه داده ثبت می‌شود یک عدد منحصر به فرد برای آن اختصاص می‌یابد تا بتوان با آن عدد record مورد نظرمان را شناسایی کنیم.

بعد از وارد کردن نام جدول و تعداد فیلدهای آن بر روی دکمه go کلیک می‌کنیم تا به صفحه‌ای که باید نوع و اسامی فیلدهای جدول خودمان را وارد کنیم برویم.

ارسال اطلاعات به ديتابيس در PHP : ایجاد جدول users در پایگاه داده

همان‌طور که شما انتخاب کردید چهار فیلد برای ما آماده شده است تا ما نام، نوع و دیگر خصوصیات آن‌ها را وارد کنیم، در بخش Name نام ستون‌هایی که از قبل‌ هم گفته شد می‌آوریم. به ترتیب از سمت چپ به راست id، username، email، age را در ستون Name وارد می‌کنیم.

حال باید type و یا نوع آن‌ها را مشخص کنیم، برای id، ما int قرار می‌دهیم تا عددهای منحصر به فرد درونش قرار بگیرد، برای فیلد id ما دو ویژگی دیگر که یکی به اسم‌های Auto Increment که با A_I در Mysql شناخته می‌شود و باید تیک آن زده شود و دیگری ستون Index برای اینکه مشخص کنیم این عدد منحصر به فرد است، در گزینه‌هایی که دارد ما گزینه PRIMARY را انتخاب می‌کنیم تا عددی که تولید می‌شود یکتا باشد.

ارسال اطلاعات به ديتابيس در PHP : تنظیمات فیلد id

برای فیلدهای username، email ما نوع آن‌‌ها را VARCHAR انتخاب می‌کنیم تا بتوانیم داده‌ی رشته‌ای وارد کنیم، ویژگی دیگری که باید برای این دو تنظیم کنیم طول رشته است که ستون Length/Values قابل تنظیم است، شما می‌توانید طول 255 را برای هر دو قرار دهید تا 255 کاراکتر را بتوان درون ستون‌ها وارد کرد.

ارسال اطلاعات به ديتابيس در PHP : تنظیمات فیلدهای username , email

و درنهایت برای فیلد age ما باید نوع آن را int و طول آن را سه رقم قرار دهیم چون در حال حاضر ما سنی بزرگ‌تر از سه رقم نداریم. بر روی دکمه Save کلید کنید تا جدول تعریف شده‌ی شما ساخته شود.

ارسال اطلاعات به ديتابيس در PHP : تنظیمات فیلد age

آماده سازی فایل config.php برای ارسال اطلاعات به ديتابيس در PHP

همان‌طور که گفته شد ما درون فایل config.php مشخصات مربوط به پایگاه داده خود را قرار می‌دهیم و در آن به پایگاه داده متصل می‌شویم، این مشخصات شامل نام هاست، نام پایگاه داده، نام کاربری پایگاه داده و رمز پایگاه داده است. ما قصد داریم این اطلاعات را به صورت یک آرایه درون فایل config.php داشته باشیم.

<?php 
$database = [ 
    'host'   => 'localhost', 
    'dbname' => 'myProject', 
    'user'   => 'root', 
    'pass'   => '' 
];

در کد بالا ما یک آرایه به نام database تعریف کرده‌ایم که از نوع Associative array است، که ما این اطلاعات را در آن ذخیره می‌کنیم:

  • host که در وب سرورهای محلی با نام localhost شناخته می‌شود.
  • dbname که نام پایگاه داده ما است.
  • user نام کاربری ورود به Mysql که به طور پیش‌فرض root است.
  • و pass که رمز عبور Mysql ما است و به طور پیش فرض خالی یا هیچی است.

در ادامه کد بالا ما باید کدهای مربوط به اتصال به پایگاه داده را بنویسیم.

try { 
    $db = new PDO("mysql:host={$database['host']};dbname={$database['dbname']}", $database['user'], $database['pass']); 
} catch (PDOException $e) { 
    die("An error happend, Error: " . $e->getMessage()); 
}

کد اتصال به پایگاه داده را ما درون یک بلاک try و catch گذاشتیم که اگر خطایی در اتصال به پایگاه داده وجود داشت بتوانیم آن را کنترل کنیم.

درون بخش try ما آمده‌ایم از PDO برای اتصال به پایگاه داده استفاده کرده‌ایم، از آن جایی که PDO یک شئ است (درباره مبحث شئ گرایی به طول کامل درون دوره متخصص PHP تدریس شده است) ما باید یک از کلمه new برای ساختن یک نمونه از آن استفاده کنیم، درون PDO ما نوشته‌ایم که:mysql، به این معناست که پایگاه داده ما Mysql است، کلمه‌ی بعدی که host است باید نام host خود را مشخص کنیم که ما آن را درون آرایه‌ای که مشخصات پایگاه داده را در اختیار داشت فراخوانی کرده‌ایم، دو براکت {} بین متغیر برای جلوگیری از تداخل بین رشته و متغیر است.

در ادامه ما با یک ; (سمی کالمن) دو مقدار را از هم جدا کرده‌ایم، رو به روی کلمه dbname ما نام پایگاه داده خود را آورده‌ایم. در خارج از رشته ما نام کاربری و رمز عبور را فراخوانی کرده‌ایم. در نهایت نیز اتصال پایگاه داده را درون متغیر db نگه داشته‌ایم.

بلاک catch نیز زمانی اجرا می‌شود که خطایی در بلاک try رخ دهد و اگر خطایی رخ دهد تابع die اجرا می‌شود که خطا را چاپ و برنامه را متوقف می‌کند.

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

درون فایل index.php ما باید فرم خود را قرار دهیم تا کاربر بتواند اطلاعات خود را درونش وارد کند و آن‌ها را درون پایگاه داده ذخیره کنیم. از آن جایی که هدف این آموزش، آموزش html و css نیست ما یک نمونه فرم برای شما آماده کرده‌ایم پیشنهاد می‌کنیم برای اینکه وقتتان ذخیره شود از همین کدهای زیر استفاده کنید.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Insert data to database</title>
    <style>
        .container {
            margin: 20px auto;
            width: 24%;
            text-align: left;
            border: 1px solid #eee;
            padding: 14px 26px;
            border-radius: 6px;
        }
        .form-control {
            padding: 8px;
        }
        input {
            border-radius: 5px;
            border: 1px solid #eee;
            padding: 8px 9px;
        }
        input#age {
            margin-left: 43px;
        }
        input#email {
            margin-left: 27px;
        }
        input[type="submit"] {
            background-color: dodgerblue;
            color: white;
            cursor: pointer;
        }
        label {
            margin-right: 22px;
        }
    </style>
</head>
<body>
    <div class="container">
        <form action="process.php" method="post">
            <div class="form-control">
                <label for='username'>Username</label>
                <input type="text" id="username" name="username" placeholder="Enter your username" autocomplete="off">
            </div>
            <div class="form-control">
                <label for='email'>Email</label>
                <input type="email" id="email" name="email" placeholder="Enter your email" autocomplete="off">
            </div>
            <div class="form-control">
                <label for='age'>age</label>
                <input type="text" id="age" name="age" placeholder="Enter age username" autocomplete="off">
            </div>
            <div class="form-control">
                <input type="submit" value="Submit">
            </div>
        </form>
    </div>
</body>
</html>

نکته‌‌ای که درون کد بالا وجود دارد این است که ما action فرم را به فایل process.php متصل کرده‌ایم و متد فرم را نیز POST قرار داده‌ایم.

نکته‌ی دیگر این است که اگر ما بخواهیم به مقادیر وارد شده درون فرم دسترسی داشته باشیم باید به inputهای فرم name بدهیم که ما این کار را در فرم بالا کرده‌ایم و برای هر input یک name مطابق با نام آن قرار داده‌ایم.

ذخیره اطلاعات فرم در دیتابیس

به بخش جذاب این پروژه‌ی کوچک رسیده‌ایم که قرار است آموزش اتصال فرم به دیتابیس را به شما بگوییم تا بتوانیم اطلاعاتمان را در پایگاه داده ثبت کنیم، در فایل index.php که فرم ما درون آن وجود دارد وقتی که فیلدهای فرم توسط کاربر پر می‌شوند و دکمه Submit یا ارسال فشرده می‌شود اطلاعات فرم به سمت فایل process.php ارسال می‌شود و تمامی اطلاعات از طریق آرایه Super global به نام POST قابل دسترس است. برای مثال بیایید داده‌هایی که به سمت فایل process.php می‌آید را چاپ کنیم تا مشاهده کنیم شامل چه محتوایی می‌باشد.

برای این کار شما ابتدا درون فایل process.php آرایه POST را print_r کنید، با print_r می‌توان آرایه‌های مختلف را چاپ کرد و محتوای آن‌ها را دید.

<?php
print_r($_POST);

درون فایل process.php این کد را قرار داده‌ایم حال بیایید شروع به وارد کردن داده‌ی درون فرم کنیم و آن را ارسال کنیم.

ذخیره اطلاعات فرم در دیتابیس

داده‌ای که در بالا وارد کردیم را ارسال می‌کنم و در صفحه‌ی process.php ما به این خروجی دست می‌یابیم.

Array
(
[username] => amirsalehi
[email] => example@gmail.com
[age] => 18
)

همان‌طور که در قبل گفتیم مقادیر فرم توسط name آن قابل دسترس است، در اینجا نیز شما مشاهده می‌کنید که name فرم به ایندکس آرایه درون POST در آمده و مقدار درون فیلد نیز به عنوان value قرار گرفته پس ما می‌توانیم به راحتی با استفاده از ایندکس آن‌ها به مقدار هر فیلد دسترسی داشته باشیم.

حال که می‌توانیم به مقادیر فرم دسترسی داشته باشیم کوئری یا دستور ارسال داده به پایگاه داده را نیز می‌نویسیم.

ابتدا برای اینکه بتوانیم از ارتباطی که در فایل config.php ایجاد کرده‌ایم استفاده کنیم باید فایل config.php را include کنیم.

include_once 'config.php';

مطمئن بشوید include بالا قبل‌تر از هر کدی انجام شده است تا بتوانید در ادامه از ارتباط پایگاه داده استفاده کنیم.

در ادامه می‌خواهیم بررسی کنیم که آیا مقادیری که قرار است ارسال بشود توسط کاربر پر شده است یا خیر؟

شرط‌های بررسی مقادیر ارسال شده

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    if (isset($_POST['username']) and isset($_POST['email']) and isset($_POST['age'])) {
        if (!empty($_POST['username']) and !empty($_POST['email']) and !empty($_POST['age'])) {
                # data is valid
        }
    }
}

در کد بالا ما چندین شرط قرار داده‌ایم تا تقریبا از صحت داده ارسال شده مطمئن شویم، شرط اول بررسی می‌کند که آیا متد درخواستی (Request method) که آمده است از نوع POST است به این معناست که فرم ارسال شده است؟ در شرط خط دوم ما بررسی کرده‌ایم که آیا مقادیر username، email، age در آرایه POST وجود دارد یا خیر؟ و در شرط خط سوم بررسی کرده‌ایم که مقادیر ارسال حاوی اطلاعات پوچ یا خالی نباشد.

حال اگر آن سه شرط true شود، کد ما درون بلاک آخرین if اجرا می‌شود، نوبت آن است که کد مربوط به ارسال اطلاعات را درون آخرین بلاک بنویسیم.

ما قصد داریم که کدهای مربوط ارسال اطلاعات به پایگاه داده را درون یک تابع قرار بدهیم تا هم کد تمیزتر داشته باشیم و هم بتوانیم از کدمان در قسمت‌های مختلف استفاده کنیم. ما تابع را پایین‌تر از شروط if تعریف می‌کنیم.

ارسال اطلاعات به ديتابيس در PHP

<?php
include_once 'config.php';
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    if (isset($_POST['username']) and isset($_POST['email']) and isset($_POST['age'])) {
        if (!empty($_POST['username']) and !empty($_POST['email']) and !empty($_POST['age'])) {
            # data is valid
        }
    }
}
function insertUserData($username, $email, $age)
{
    global $db;
    $sql = "INSERT INTO users (username, email, age) VALUES (:username, :email, :age)";
    $stmt = $db->prepare($sql);
    $stmt->execute([':username' => $username, ':email' => $email, ':age' => $age]);
    return $stmt->rowCount();
}

همان‌طور که می‌بینید ما یک تابع به اسم insertUserData تعریف کرده‌ایم و پارامتر ورودی برای تابع به نام‌های username، email، id در نظر گرفته‌ایم. درون تابع ما متغیر db را که درون فایل config.php است global کرده‌ایم شاید بپرسید چرا؟ برای اینکه بتوانیم از متغیرهای تعریف شده درون پروژه‌مان در توابع استفاده کنیم باید کلید global را قبل از نام متغیر قرار بدهیم تا درون بلاک تابع قابل دسترس باشد.

در خط بعدی ما کوئری ارسال اطلاعات به پایگاه داده را نوشته‌ایم و درون متغیر sql قرار داده‌ایم. تنها جایی که در کوئری نیاز به توضیح دارد قسمت پرانتز بعد از  VALUES می‌باشد. در داخل پرانتز ما آمده‌ایم یک سری کلیدها با نام‌های مرتبط قرار دا‌ده‌ایم، چرایی این کار این است که اگر مقادیر وارد شده معتبر نباشد و هدف آن SQL Injection باشد (در مقاله آموزش کامل امنیت در PHP درباره SQL Injection صحبت کرده‌ایم و راحل رفع آن را نیز گفته‌ایم) جلوی این حمله را گرفته باشیم پس به خاطر همین است که ما مقادیر ورودی را به طور مستقیم درون کوئری قرار نداده‌ایم.

در ادامه کد کوئری را درون تایع prepare قرار داده‌ایم تا کوئری ما را آماده‌ی اجرا کردن کند و محتوای آن را بررسی کند، مقدار prepare شده کوئری را درون متغیر stmt قرار داده‌ایم تا بتوانیم کوئری را در ادامه اجرا کنیم، در ادامه ما از متغیر stmt تابع execute را صدا زده‌ایم تا کلیدهایی که درون کوئری تعریف کرده‌ایم با مقادیر اصلی‌شان جایگذاری کنیم و کوئری را اجرا کنیم. برای این کار کافی است در بین پرانتزهای تابع execute یک آرایه (درست مثل آرایه Associative) را به عنوان ورودی تابع بدهیم. که Index‌های آرایه مقدار کلید‌های تعریف شده درون کوئری است. و value‌های آرایه ورودی‌های تابع است. در نهایت نیز از stmt  تابع rowCount را صدا می‌زنیم تا برای ما تعداد فیلدهایی که تحت تاثیر این کوئری قرار گرفته است را برگرداند، واگر این کوئری به درستی کار کند عدد یک را برای ما بر می‌گرداند.

ارسال نهایی اطلاعات به ديتابيس در PHP

تا اینجا که فهمیدیم تابع ما چه کار می‌کند، باید از آن درون کدمان استفاده کنیم و داده‌های ارسال شده را در پایگاه داده ذخیره کنیم، برای این کار کافی است تابع را در داخلی‌ترین بلاک if شروط بالا قرار دهیم.

<?php
include_once 'config.php';
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    if (isset($_POST['username']) and isset($_POST['email']) and isset($_POST['age'])) {
        if (!empty($_POST['username']) and !empty($_POST['email']) and !empty($_POST['age'])) {
            $result = insertUserData($_POST['username'], $_POST['email'], $_POST['age']);
        }
    }
}
function insertUserData($username, $email, $age)
{
    global $db;
    $sql = "INSERT INTO users (username, email, age) VALUES (:username, :email, :age)";
    $stmt = $db->prepare($sql);
    $stmt->execute([':username' => $username, ':email' => $email, ':age' => $age]);
    return $stmt->rowCount();
}

در بالا ما تابع insertUserData که نوشته‌ایم را صدا می‌زنیم و به ترتیب مقادیر را به آن پاس می‌دهیم و مقدار خروجی تابع را درون یک متغیر به اسم result قرار می‌دهیم.

حال اگر به فرم ساخته شده درون index.php مراجعه کنیم و فیلدها را پر کنیم و بر روی دکمه‌ی submit یا ارسال بزنیم اطلاعات در پایگاه داده ذخیره می‌شوند و ما به صفحه process.php انتقال داده‌ می‌شویم. اگر بخواهید مطمئن شوید که اطلاعات در پایگاه داده ذخیره شده است یا خیر می‌توانید وارد phpmyadmin خود شوید و درون جدول users مقدار ثبت شده را مشاهده خواهید کرد.

مشکلی که ممکن است در این قسمت به وجود بیاید این است که شما به process.php منتقل می‌شوید و وقتی در همان صفحه، صفحه را Refresh می‌کنید اطلاعات دوباره به پایگاه داده ارسال می‌شود، در ادامه راه حل برطرف کردن این مشکل را به شما می‌گوییم.

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    if (isset($_POST['username']) and isset($_POST['email']) and isset($_POST['age'])) {
        if (!empty($_POST['username']) and !empty($_POST['email']) and !empty($_POST['age'])) {
            $result = insertUserData($_POST['username'], $_POST['email'], $_POST['age']);
            if ($result) {
                header('location: index.php?s=1');
                exit;
            } else {
                header('location: index.php?s=0');
                exit;
            }
        }
    }
}

اگر به خاطر داشته باشید ما خروجی تابع را درون متغیر result قرار می‌دادیم، پس با همین متغیر می‌توانیم مشکل‌مان را حل کنیم. اگر تابع به درستی اجرا شود مقدار درون result برابر با عدد یک می‌شود و اگر به درستی انجام نشود مقدار صفر که به معنای false است قرار می‌گیرد.

در ادامه ما مقدار درون result را در یک شرط بررسی می‌کنیم، اگر مقدار result برابر با یک بود وارد بلاک if می‌شود و ما را با کمک تابع header به index.php ارسال می‌کند، اما با یک مقدار اضافه در url که s=1 است. s حرف اول کلمه success است برای اینکه تشخیص بدهیم اطلاعات با موفقیت در پایگاه داده ثبت شده‌اند یا خیر. اگر مقدار result یک نبود وارد بلاک else می‌شود و ما را به صفحه index.php بر می‌گرداند اما با s=0 که نشان می‌دهد اطلاعات با موفقیت درون پایگاه داده ثبت نشده‌اند.

exit بعد از header برای این است که بعد از اجرا شدن تابع header ادامه‌ی کدهای درون آن صفحه خوانده نشوند و از همان جا خارج شود.

تمرین

در نهایت یک تمرین برای شما در نظر گرفته‌ایم، با مقداری که از طریق url به صفحه‌ی index.php ارسال می‌شود پیام مرتبط چاپ کنید، برای مثال اگر s برابر با یک بود پیام موفقیت آمیز بدهید.

جمع بندی:

در مقاله‌ی ارسال اطلاعات به ديتابيس در PHP ، ما ابتدا محیط کار خودمان را آماده سازی کردیم و بعد از آن پایگاه داده خود را طراحی کردیم و شروع به اضافه کردن تنظیمات مربوط به پایگاه داده درون فایل config.php کردیم. بعد از آن یک فرم مناسب در صفحه index.php قرار دادیم و شروع به کد نویسی اصلی پروژه‌مان که در فایل process.php بود کردیم و یاد گرفتیم که چگونه می‌توانیم اطلاعاتمان را با روشی درست و مناسب به سمت پایگاه داده ارسال کنیم و حتی جلوی مشکلی که پیش می‌آمد را نیز گرفتیم. امیدواریم که از این مقاله بهره کافی را برده باشید. اگر در انجام این کار سوال یا مشکلی داشتید خوشحال می‌شویم که در بخش نظرات با ما به اشتراک بگذارید.

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

 
ارسال دیدگاه
ما همه سوالات و دیدگاه ها رو می خونیم و پاسخ میدیم
۵۴ دیدگاه
salma ۲۱ تیر ۱۴۰۰، ۲۰:۰۵
با عرض سلام و خسته نباشد من به دیتا بیس وصلم و وقتی هم چیزی رو برای دیتا بیس ارسال میکنم هیچ اروری نمیده تمام ستونهای table هم ساختم ولی داخلش اطلاعاتم نمیشینه لطفا راهنماییم کنید اینم کدی که نوشتمه
نازنین کریمی مقدم ۰۴ مرداد ۱۴۰۰، ۱۵:۵۳
درود
احتمال داره که شما به درستی به دیتابیس متصل نشده باشین یا اینکه query که استفاده میکنید مورد داره. این موارد رو بررسی کردید؟
متاسفانه کدتون برای ما نیومده تا بررسی کنیم.
نگار ۲۳ خرداد ۱۴۰۰، ۱۲:۳۶
سلام
من کد هارو به درستی وارد کردم ولی اطلاعات به پایگاه منتقل نمیشه
مشکل از کجا میتونه باشه ؟
نازنین کریمی مقدم ۲۸ خرداد ۱۴۰۰، ۱۷:۴۴
درود
در کد خطایی نمیگیرید؟
ساسان فرجامی ۲۶ اردیبهشت ۱۴۰۰، ۱۳:۴۸
بسیار عالی و فوق العاده بود
یک سئوال هم داشتم آیا میتونیم از پایگاه داده وب سایت های دیگه هم اطلاعات بگیریم ؟
نازنین کریمی مقدم ۲۸ اردیبهشت ۱۴۰۰، ۰۱:۱۶
سلام.
اگر خودشون وب سرویس تهیه کرده باشند و دسترسی داده باشند، بله. مثل خیلی از وب سایت های تهیه دادگان
اما دسترسی به اطلاعات خصوصی یا اطلاعاتی که وب سایت اجازه نداده، در حالت عادی امکان پذیر نیست مگر با هک و نفوذ غیرقانونی :)
سید قاسم ۲۱ اسفند ۱۳۹۹، ۱۰:۵۰
با سلام ، ضمن تقدیر و تشکر از جناب آقای صالحی و تیم 7لر . تشکر میکنم از اشتراک گذاری این مطالب ، کدهای فوق به شکل صحیح اجرا شد . چنانچه در فایل config.php بعد از سطر شماره 10 این تکه کد به پیشنهاد جناب آقای صالحی درج شود مشکل ارور در هاست آنلاین با فارسی رفع خواهد شد . ممنون


[code]
db->exec("set names utf8")$
[/code]
نازنین کریمی مقدم ۲۱ اسفند ۱۳۹۹، ۲۰:۲۸
درود.
از اشتراک دانش تون با ما و سایر کاربران سون لرن سپاس گزاریم :)
قاسم ۰۱ اسفند ۱۳۹۹، ۱۱:۳۲
بخشی از تدریس : ""در ادامه ما مقدار درون result را در یک شرط بررسی می‌کنیم، اگر مقدار result برابر با یک بود وارد بلاک if می‌شود و ما را با کمک تابع header به index.php ارسال می‌کند،""
.
طبق کد نویسی ما عدد 1 را میگیریم و اطلاعات با موفقیت در پایگاه داده ثبت شده‌ و کاربر را به index.php ارجاء میکند ، اما داده در دو ردیف ( مشابه ) در جدول ثبت میشود .
نازنین کریمی مقدم ۰۲ اسفند ۱۳۹۹، ۲۳:۳۱
درود.
ممکن هست که هنگامی که آموزش رو مرحله به مرحله پیش رفته باشید تابع ارسال اطلاعات به دیتابیس دوبار اجرا شده باشه، لذا این بخش رو دوباره مطالعه کنید:
"مشکلی که ممکن است در این قسمت به وجود بیاید این است که شما به process.php منتقل می‌شوید و وقتی در همان صفحه، صفحه را Refresh می‌کنید اطلاعات دوباره به پایگاه داده ارسال می‌شود، در ادامه راه حل برطرف کردن این مشکل را به شما می‌گوییم."
کد نهایی که در پایین این پاراگراف نوشته شده رو به عنوان کد خودتون در نظر بگیرید. دیتابیس رو دستی پاک کنید و دوباره تست کنید. قاعدتا نباید دوبار داده رو ذخیره کنه.
mahdiyh ۱۸ بهمن ۱۳۹۹، ۰۲:۱۹
فوق العاده عالی بی نظیر ساده و کار آمد عالیییییییییییییییییی
متشکرم از سایت خوبتون همیشه پایدار باشید
نرگس ۰۳ بهمن ۱۳۹۹، ۰۷:۳۵
مطالب بسیار مفید و شفاف بود ممنون
Sahar ۲۰ دی ۱۳۹۹، ۲۲:۲۴
سلام وقتتون بخیر ببخشید من کدی که شما زدید رو کپی کردم اما وقتی اطلاعات رو میدم مثل اسم و ایمیل رو روی submit میزنم میره تو صفحه config ولی اطلاعات رو بهم نشون نمیده یا ی کد دیگه ام زدم واسه login شدن اون هم همین مشکل رو داشت وقتی میره صفحه بعد هیچی توی اون صفحه نشون نمیده
نازنین کریمی مقدم ۲۱ دی ۱۳۹۹، ۱۶:۲۴
سلام.
میتونید از درون پایگاه داده به طور مستقیم چک کنید ببینید مقادیر اونجا ارسال میشن یا خیر.
اگر مراحل رو به درستی انجام بدید کد باید براتون درست کار کنه. روشهای زیادی برای دیباگ php هست و انشالله در آینده یه مقاله رو به این موضوع اختصاص میدیم. یکی شون استفاده از تابع console.log در php هست که باعث میشه مقادیر در کنسول مرورگر (با زدن کلید f12) دیده بشه.
سحر ۱۸ دی ۱۳۹۹، ۱۶:۲۸
سلام وقت بخیر، من کاری که شما انجام دادین رو کردم و کد ها دقیقاً کپی پیست شدن ولی دیتابیسم از زبان فارسی پشتیبانی نمیکنه
برای مثال کلمه "سحر" به صورت "سحر" ذخیره میشه
برای حل کردنش چیکار باید کنم؟
نازنین کریمی مقدم ۱۹ دی ۱۳۹۹، ۱۵:۰۹
سلام. هنگام ساخت دیتابیس، آیا encoding رو utf8mb4_general_ci قرار دادید؟ چون اگر این کار رو نکنید فارسی رو ساپورت نمیکنه.
پیشنهاد میکنم سایر فرمتهای utf8 اون قسمت رو هم امتحان کنید و اگر درست نشد بفرمایید تا با کمک هم حلش کنیم.
سامان ۱۳ دی ۱۳۹۹، ۱۵:۱۵
سلام
چطور داخل کد ی تیبل به دیتابیس اضافه کنم و بهش بگم از utf8 پشتیبانی کنه؟
نازنین کریمی مقدم ۱۵ دی ۱۳۹۹، ۰۱:۰۳
درود. شما باید از یک کوئری create استفاده کنید و درونش بگید که از utf8 پشتیبانی کنه.
میتونید نحوه نوشتن کد رو از این پست مرتبط با ساخت جدول utf8 با php ببینید.
حسین ۱۱ آبان ۱۳۹۹، ۱۲:۰۶
سلام
میخوام یه کد واسه امتیازدهی بنویسم امتیاز کاربران تو یه رکورد در دیتابیس ذخیره شده اینجوری که مثلا امتیاز 5 چند تا رای داره و امتیاز 4 چند تا و... یعنی با محاسبه میشه به میانگین این امتیازها رسید!
حالا سوال من اینه که اگه وقتی کاربر داره امتیاز میده و این میانگین حساب میشه توسط کد! همونجا این میانگین امتیاز در یه رکورد در دیتابیس ذخیره بشه که وقتی میخوام امتیاز رو نشون بدم نیاز به محاسبه نباشه!

حالا سوال من اینه که میانگین امتیاز ستاره ها جداگانه ذخیره بشه بهتره یا از همون رکورد قبلی فراخوانی بشه و محاسبه بشه؟!
و اینکه اگه اطلاعات زیادی در دیتابیس ذخیره بشه رو سرعت سایت که تاثیر نداره؟!!
نازنین کریمی مقدم ۲۷ آبان ۱۳۹۹، ۱۵:۳۷
سلام.
اگر از این فیلد میانگین زیاد استفاده میکنید، بله بهتر هست که در یک فیلد جدا ذخیره بشه. همونطور که خودتون هم متوجه شدید اینکه به ازای هربار نمایش فیلد، اون همه داده جمع بشه کار درستی نیست.
در مورد سوال دومتون، بله که تاثیر داره :). اما این هنر شماست که جداول دیتابیس رو طوری تعریف کنید که اطلاعات تکراری نداشته باشید و خلاصه به بهینه ترین شکل ممکن این قضیه رو مدیریت کنید.
پویا سنجری ۰۸ آبان ۱۳۹۹، ۱۵:۰۹
سلام
من از کد شما استفاده کردم و کار هم میکنه، اما مشکلی که وجود داره اینه که فقط یک بار جواب میده و برای دفعه دوم که اطلاعاتی رو وارد میکنم چیزی داخل دیتابیس ذخیره نمیشه، میشه راهنمایی کنید.
امیر صالحی ۲۸ آبان ۱۳۹۹، ۲۳:۱۱
سلام و احترام
لطفا کدتونو قرار بدید
محمد ۳۰ مهر ۱۳۹۹، ۱۶:۵۵
سلام
ممنون از توضیحات کاملتون و وقتی که گذاشتین و دانشتون رو به اشتراک گذاشتین.
من یه جای کار به مشکل خوردم.
در واقع توی تابع insertUserData
خط sql = "INSERT INTO$
رنگش زرد هست و وقتی هم که کد رو اجرا می کنم همون صفحه ی مربوط به پر کردن اطلاعات نمایش داده میشه و آخر آدرسش یه s=0 اضافه می شه که یعنی result خالیه...
حالا خودم احساس میکنم مربوط به اینه که mysql یه مشکلی داره برای من... میشه راهنماییم کنین
ممنون
امیر صالحی ۲۸ آبان ۱۳۹۹، ۲۳:۱۳
سلام و احترام
احتمال داره که شما به درستی به دیتابیس متصل نشده باشین یا اینکه query که استفاده میکنید مورد داره. این موارد رو بررسی کنید و اگه مشکل حل نشد کدتون رو قرار بدید تا بررسی کنیم
علی اقا ۲۴ مهر ۱۳۹۹، ۱۳:۰۳
سلام خسته نباشید
در صفحه پراسس این متن چاپ میشه مشکلش چیه مهندس؟
prepare($sql); $stmt->execute([':username' => $username, ':email' => $email, ':age' => $age]); return $stmt->rowCount(); } ?>
امیر صالحی ۲۵ مهر ۱۳۹۹، ۰۹:۱۷
سلام و احترام
ظاهرا خطا به نظر نمیاد، شاید یک جایی به اشتباه این کد رو چاپ یا return کردید. کدتون رو یه بار دیگه بررسی کنید
اکبر ۲۰ مهر ۱۳۹۹، ۰۲:۲۱
سلام خسته نباشید بند یک میکرو دارم که وافای وصل میشه می خوام با اون به دیتابیس اطلاعات بفرستم و می خوام با متدpos باشه دیتا صدا میباشد اگه امکانش هست راهنمایی بفرمایید لطفا با متد GEtمیش ولی چون دیتا حجمش زیاد جواب نمیده
دستوراتی که دارم استفاده می کنم به این صورت
ابتدا آدرس سایت بعد کانکشن
Get/write. php? u=dat
امیر صالحی ۲۸ آبان ۱۳۹۹، ۲۳:۱۴
سلام و احترام
من دقیقا مشکل رو متوجه نشدم اگه امکانش هست واضح تر توضیح بدید تا بتونم کمکتون کنم
محمد میرزایی ۰۵ مهر ۱۳۹۹، ۱۲:۱۹
سلام و احترام
ممنون از وقتی که برای مطالعه این مقاله گذاشتید.
خطایی که دارید اینکه شما توی خط 39 آرایه رو دارید یه جوایی به String تبدیل میکنید یا دارید چاپش میکنید.
سوالی که اینجا مطرحه، آیا شما میخواید خود فایل رو توی دیتابیس ذخیره کنید؟؟
اگر همچین قصدی دارید لطفا این کار رو نکنید. شما میتونید فایل آپلود شده و ارسال شده در فرم رو دریافت کنید و در یک فایلی ذخیره سازی کنید و آدرس اون فایل رو درون دیتابیس ذخیره کنید، این روش بهتر و بهینه تر هم هست





در جواب شما منم دقیقا مسیر رو به دیتابیس میفرستم که اگر var_dump هم بکنید متوجه میشوید مشکل من اینه که مسیر خودش یه آرایه هست و هنگام تبدیل به استرینگ ارور نمایش داده میشود میتونید کدم رو امتحان کنید متشکر میشم
امیر صالحی ۰۸ مهر ۱۳۹۹، ۲۲:۰۸
لطفا کد رو قرار بدید تا بررسی شه
محمد ۰۲ مهر ۱۳۹۹، ۱۶:۰۵
سلام ممنون از شما که دانشتون رو با ما در اختیار میگذارید
بنده از کد شما برای ایجاد صفحه فرمم استفاده کردم اما تغییراتی در کد انجام دادم که به کمک شما نیاز دارم
بنده قابلیت ارسال فایل رو اضافه کردم اما هنگامی که فایل آپلود میشود آدرس فایل چون به صورت آرایه هست در دیتابیس بجای آدرس فایل کلمه array نوشته میشود که دلیلش رو هم سرور اینگونه پاسخ میدهد:
( ! ) Notice: Array to string conversion in C:\wamp\www\php\procces.php on line 39
Call Stack
# Time Memory Function Location
1 0.0006 410848 {main}( ) ...\procces.php:0
2 0.0114 458560 insertUserData( ) ...\procces.php:19
3 0.0114 459680 execute ( ) ...\procces.php:39
که دلیلش هم استفاده از تابع execute است
بنابراین من به کمک شما برای رفع این مشکل نیازمندم
کد های بنده نیز اینگونه است:
امیر صالحی ۰۴ مهر ۱۳۹۹، ۱۸:۵۸
سلام و احترام
ممنون از وقتی که برای مطالعه این مقاله گذاشتید.
خطایی که دارید اینکه شما توی خط 39 آرایه رو دارید یه جوایی به String تبدیل میکنید یا دارید چاپش میکنید.
سوالی که اینجا مطرحه، آیا شما میخواید خود فایل رو توی دیتابیس ذخیره کنید؟؟
اگر همچین قصدی دارید لطفا این کار رو نکنید. شما میتونید فایل آپلود شده و ارسال شده در فرم رو دریافت کنید و در یک فایلی ذخیره سازی کنید و آدرس اون فایل رو درون دیتابیس ذخیره کنید، این روش بهتر و بهینه تر هم هست
mohammad ۱۸ شهریور ۱۳۹۹، ۱۷:۴۸
من با این ارور روبرو شدم توی ارسال اطلاعات به دیتابیس لطفا راهنمایی کنید
Fatal error: Uncaught Error: Call to a member function prepare() on null in C:\xampp\htdocs\web\newz\process.php:16 Stack trace: #0 C:\xampp\htdocs\web\newz\process.php(7): insertUserData('m', 'm@gmail.com', '19') #1 {main} thrown in C:\xampp\htdocs\web\newz\process.php on line 16
امیر صالحی ۲۱ شهریور ۱۳۹۹، ۰۰:۲۷
سلام و احترام
مثل اینکه متد prepare رو روی یک متغیری که مقدار null داره صدا زدید، خط 16 فایل process.php رو بررسی کنید
هادی ۲۳ مرداد ۱۳۹۹، ۱۴:۰۷
سلام
من کد هامو به همین شکلی که شما توضیح دادین نوشتم که امنیتش بیشتر بشه ولی اطلاعات فرم رو نمیفرسته تو دیتابیس داخل VALUES هر چی نوشتم اونارو میفرسته
امیر صالحی ۲۴ مرداد ۱۳۹۹، ۲۰:۴۱
سلام، لطفا کدی که بهش مشکوکید رو قرار بدید تا بررسی کنم
amin ۱۴ مرداد ۱۳۹۹، ۲۰:۱۶
سلام یه مشکل بین هاست و سورس ها دارم میخواستم ببینم اگه میشه با any deskبرام رفع کنین
امیر صالحی ۱۶ مرداد ۱۳۹۹، ۱۶:۱۹
سلام دوست عزیز، متاسفانه همچین خدماتی رو توی مجموعه سون لرن ندارم
sajad ۱۰ مرداد ۱۳۹۹، ۱۹:۰۸
سلام ممنون بایت مقاله خوبتون.وقتی با زبان فارسی اطلاعات میرع تو دیتابیس درست نشون داده نمیشه میشه راهنمایی کنید
امیر صالحی ۱۰ مرداد ۱۳۹۹، ۲۰:۴۹
سلام مرسی از شما که برای مطالعه این مقاله وقت گذاشتید.
مشکل شما به خاطر اینکه collation مناسبی برای دیتابیستون انتخاب نکردید. بهتون پیشنهاد میدهم موقع ایجاد دیتابیس collationشو روی utf8mb4_general_ci قرار بدید
جعفر ۱۰ مرداد ۱۳۹۹، ۱۳:۲۰
تو قسمت افزودن کد براتون فرستادم اینجا هم گذاشتم
$sql="INSERT INTO users_tbl (name,lastname,age,field,comment,picture) VALUES ('$data[name]','$data[lastname]','$data[age]','$data[field]','$data[comment]','$to')";
اینم اروری هست که تو phpstorm بهم میده :
No data sources are configured to run this SQL and provide advanced code assistance. Disable this inspection via problem menu (Alt+Enter).
SQL dialect is not configured.
امیر صالحی ۱۰ مرداد ۱۳۹۹، ۱۶:۵۰
وقتی که می‌خواهید یک کلید از یک ارایه رو صدا بزنید اگر اون کلید یک رشته باید اون رو درون دابل کوتیشن یا تک کوتیشن قرار بدید. برای مثال شما در بخش values باید کلید رو به این صورت $data["name"] قرار بدید.
jafar ۱۰ مرداد ۱۳۹۹، ۰۱:۰۵
با عرض سلام و خسته نباشد من به دیتا بیس وصلم و وقتی هم چیزی رو برای دیتا بیس ارسال میکنم هیچ اروری نمیده تمام ستونهای table هم ساختم ولی داخلش اطلاعاتم نمیشینه لطفا راهنماییم کنید اینم کدی که نوشتمه
امیر صالحی ۱۰ مرداد ۱۳۹۹، ۱۰:۳۷
سلام شب و روزتون بخیر.
لطفا کدی که مورد داره رو قرار بدید تا بررسی کنم
علی ۲۵ تیر ۱۳۹۹، ۱۴:۴۰
سلام خیلی ممنون از مطالب خوبتون یک سوال داشتم،من فایل php را قرار داده ام و در phpmyadmin هم با همان اسامی یک جدول درست کرده ام ولی وقتی فرم تماس را پر میکنم و دکمه ی ارسل را میزنم چیزی در دیتا بیس زخیره نمیشه و در همون صفحه ی html اطلاعت وارد شده را به همراه این ارور نشان میدهد SQLSTATE[42S02]: Base table or view not found: 1146 Table ' tablename' doesn't exist
این هم کدهای php :
امیر صالحی ۲۷ تیر ۱۳۹۹، ۱۲:۰۷
سلام ممنون شما که از این مقاله استفاده کردید
اروری که برنامه شما میده میگه که همچین جدولی وجود نداره. یا اسم جدول رو توی کوئری اشتباه دادید یا اینکه اصلا تو پایگاه دادتون وجود نداره. لطفا اینارو بررسی کنید و نتیجه رو تو همین بخش کامنت اعلام کنید
علی احمدی ۱۹ تیر ۱۳۹۹، ۰۲:۴۹
چطوری config.php رو include کنیم؟؟
امیر صالحی ۲۴ تیر ۱۳۹۹، ۱۵:۲۰
سلام و احترام
میتونید خیلی راخت از تابع include استفاده کنید
include 'filename';
علی ۱۵ تیر ۱۳۹۹، ۱۱:۵۷
مطالب بسیارخوب هستندامااین جداول رابرای یک سایت پی اچ پی چگونه تنظیم نمایم لطفاراهنمائی فرمائید
متشکرم
امیر صالحی ۲۴ تیر ۱۳۹۹، ۱۵:۲۲
خیلی ممنون از وقتی که برای خوندن این مقاله گذاشتید
اگه امکانش هست بیشتر توضیح بدید تا بتونم بهتون کمک کنم
hhh ۳۱ خرداد ۱۳۹۹، ۲۱:۳۶
سلام ممنون ازمطالب مفیدتون...
من یه سوال داشتم ممنون میشم بهم کمک کنید
مثل این کد function delpic() {
if(confirm("آیامطمعن به حذف تصویرهستید؟"))
window.location.assign("./delpic.php");
اینجامیخوام اون پیغاموبزارم
<a href="./?pg=users&action=del&id=" title="حذف">
امیر صالحی ۰۳ تیر ۱۳۹۹، ۱۹:۵۰
سلام، لطفا کدتان را در یک ظاهر مناسب تر قرار دهید تا بتوانم کمکتان کنم
Behrouz Alborzi ۱۲ خرداد ۱۳۹۹، ۱۲:۳۰
باسلام و وقت بخیر خدمت شما مقاله واقعا خوبیه ..
فقط اینکه من collation در mysql همیشه utf8_grenral_ci استفاده میکنم و بنظر بهتره
و لطفا یه مقاله درباره mysql schema هم میزارین ؟
امیر صالحی ۱۲ خرداد ۱۳۹۹، ۱۲:۴۵
سلام وقت شما هم بخیر، خیلی خوشحالیم که مقاله مفید بوده براتون
بله collation انتخابی شما هم مناسبه، مقاله پیشنهایی شما رو حتما بررسی میکنیم و اطلاع میدیم.