شنبه ۰۸ مهر ۱۴۰۲

Saturday, September 30, 2023 GMT +3:30

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

mysql-insert

پس از آشنایی با نحوه ساخت دیتابیس، جدول و ستون با دستور CREATE در پایگاه داده MySQL و به کمک اکستنشن MySQLi، اکنون نوبت فراگیری قابلیت متداول دیگری از این سیستم مدیریت پایگاه داده است، هدف از این آموزش آشنایی با نحوه درج اطلاعات از طریق کدهای PHP با دستور INSERT INTO در جداول و ستون های MySQL است، قاعدتا صرف ساخت پایگاه داده، جدول و ستون کاربرد عملی نخواهد داشت و همه ی این مقدمات برای فراهم کردن شرایطی است که بتوانیم اطلاعاتمان را پیش از هر کار دیگری ذخیره سازی و در مواقع لزوم از آنها استفاده نمائیم، در واقع می توان گفت ذخیره سازی اطلاعات اولین مرحله تعامل با داده ها در دیتابیس است.

ارتباط با پایگاه داده MySQL


در آموزش های قبل گفتیم که قبل از انجام هر کاری ابتدا باید به پایگاه داده MySQL متصل شویم، طبق روال آموزش ها برای این کار از اکستنشن MySQLi و کدی مشابه به مثال زیر استفاده می کنیم.
برنامه نویسی رویه ای (Procedural):
<?php
//اتصال به دیتابیس
$conn = mysqli_connect("localhost", "username", "password", "dbname");
if(!$conn) {
    echo "PHP & MySQL Connection: Error! " . mysqli_connect_errno() . ' - ' . mysqli_connect_error();
    exit;
} else {
    echo "PHP & MySQL Connection: Ok!<br>";
}
//پایان اتصال
mysqli_close($conn);
?>
برنامه نویسی شی گرا (Object-oriented):
<?php
//اتصال به دیتابیس
$conn = new mysqli("localhost", "username", "password", "dbname");
if(!$conn) {
    echo "PHP & MySQL Connection: Error! " . $conn->errno . ' - ' . $conn->error;
    exit;
} else {
    echo "PHP & MySQL Connection: Ok!<br>";
}
//پایان اتصال
$conn->close();
?>
در این نمونه کد فرض بر این است که از قبل دیتابیسی با نام dbname را ساخته ایم (برای آشنایی با نحوه ساخت دیتابیس لطفا به آموزش قبل مراجعه کنید)، برای تکمیل کد نیز پرس و جوی ایجاد جدول فرضی books و ستون های id، book و level را در ادامه اجرا می کنیم.

ساخت جدول و ستون ها


قبل از INSERT اطلاعات، در پایگاه داده dbname جدولی فرضی با نام books می سازیم تا لیست چند کتاب و سطح آنها را جهت تست و به عنوان نمونه در ستون های book و level ذخیره کنیم، برای این منظور ابتدا با دستور CREATE جدول و ستون ها را ایجاد می کنیم (گفتیم که علاوه بر دستورات PHP، ایجاد دیتابیس، جدول و ستون از طریق رابط کاربری برنامه phpMyAdmin نیز امکانپذیر است).
برنامه نویسی رویه ای (Procedural):
<?php
//اتصال به دیتابیس
$conn = mysqli_connect("localhost", "username", "password", "dbname");
if(!$conn){
    echo "PHP & MySQL Connection: Error! " . mysqli_connect_errno() . ' - ' . mysqli_connect_error();
    exit;
} else {
    echo "PHP & MySQL Connection: Ok!<br>";
    
    //ساخت جدول و ستون ها
    $sql = "CREATE TABLE books(
    id INT NOT NULL AUTO_INCREMENT,
    PRIMARY KEY(id),
    book VARCHAR(255),
    level VARCHAR(255))
    ENGINE=MyISAM DEFAULT CHARACTER SET=utf8 COLLATE=utf8_persian_ci"
;
    $query = mysqli_query($conn, $sql);
    
    if(!$query) {
        echo "Creating Table books: Error! " . mysqli_error($conn);
    } else {
        echo "Creating Table books: OK!";
    }
}
//پایان اتصال
mysqli_close($conn);
?>
برنامه نویسی شی گرا (Object-oriented):
<?php
//اتصال به دیتابیس
$conn = new mysqli("localhost", "username", "password", "dbname");
if(!$conn) {
    echo "PHP & MySQL Connection: Error! " . $conn->errno . ' - ' . $conn->error;
    exit;
} else {
    echo "PHP & MySQL Connection: Ok!<br>";
    
    //ساخت جدول و ستون ها
    $sql = "CREATE TABLE books(
    id INT NOT NULL AUTO_INCREMENT,
    PRIMARY KEY(id),
    book VARCHAR(255),
    level VARCHAR(255))
    ENGINE=MyISAM DEFAULT CHARACTER SET=utf8 COLLATE=utf8_persian_ci"
;
    $conn->query($sql);
    if(!$conn) {
        echo "Creating Table books: Error! " . $conn->error;
    } else {
        echo "Creating Table books: OK!";
    }
}
//پایان اتصال
$conn->close();
?>
توضیح:
- اطلاعات اتصال را با توجه به نام کاربری، کلمه عبور و عنوان پایگاه داده خود در تابع mysqli_connect (برنامه نویسی رویه ای) یا کلاس mysqli (برنامه نویسی شی گرا) تعریف می کنیم (نام کاربری در localhost معمولا root و بدون کلمه عبور است).
- در مثال بالا جدولی فرضی با نام books ساخته و سه ستون در آن ایجاد کرده ایم (id, book, level)، ستون id به صورت INT عددی و افزایش خودکار (AUTO_INCREMENT) و ستون های book و level از نوع VARCHAR متنی هستند که برای ذخیره سازی متن های کوتاه (در اینجا تا 255 بایت) کاربرد دارند.
- INT و VARCHAR نوع داده (Data Types) ای هستند که در ردیف ها قابل ذخیره سازی است، این امکان در MySQL وجود دارد که از مقادیر INT برای اعداد، VARCHAR برای متن های کوتاه با مقادیر مشخص یا نوع داده TEXT، MEDIUMTEXT، LONGTEXT برای متن های طولانی استفاده کنیم (در این خصوص در آموزش های آینده مفصلا صحبت خواهیم کرد).
- مقادیر NOT NULL و AUTO_INCREMENT جزء ویژگی هایی هستند که هر نوع از داده ای مقادیر بخصوص خود را می تواند داشته باشد، به طور مثال برای INT که یک مقدار عددی است خاصیت AUTO_INCREMENT به معنی افزایش خودکار کاربرد دارد و افزایش خودکار یعنی با هر بار INSERT اطلاعات در جدول، یک مقدار به ستون مورد نظر (معمولا id) به صورت خودکار اضافه خواهد شد (شمارش پیش فرض از 1، 2، 3 و...) و نیازی به درج این مقدار به صورت دستی نیست، همچنین NOT NULL یعنی مقدار پیش فرض ستون ها NULL نیست و در صورتی که هنگام INSERT اطلاعات برای آن ستون مقداری در نظر نگیریم، مقدار خالی (به جای عبارت NULL) درج خواهد شد.

شیوه نگارش (Syntax) دستور INSERT


برای اجرای دستور INSERT می توانیم از دو شیوه نگارش استفاده و نام جدول و ستون ها را با دو Syntax زیر بنویسیم:
INSERT INTO tbl(col_1, col_2) VALUES('value_1', 'value_2')

INSERT INTO `tbl`(`col_1`, `col_2`) VALUES('value_1', 'value_2')
تفاوت روش دوم (استفاده از علامت ` backquote یا backtick) با حالت عادی در این است که با این کار در صورتی که از فضای خالی یا عبارات محفوظ MySQL به عنوان نام جدول یا ستون ها استفاده کنیم برنامه با خطای
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near...
یا خطاهای مشابه مواجه نمی شود، در هر صورت بهتر است از فضای خالی یا عبارات محفوظ برای نام جدول و ستون ها استفاده نشود:
https://dev.mysql.com/doc/refman/5.5/en/keywords.html
در آدرس بالا لیست این عبارات به تفکیک حروف الفبای انگلیسی درج شده است.

ذخیره مقادیر با دستور INSERT INTO در دیتابیس


پس از ساختن جدول و ستون، اکنون می خواهیم جهت نمونه نام سه کتاب فرضی آموزش HTML، آموزش PHP و آموزش MySQL را به لیست خود اضافه کنیم، بدین منظور از کدی مشابه مثال زیر استفاده می کنیم.
برنامه نویسی رویه ای (Procedural):
<?php
//اتصال به دیتابیس
$conn = mysqli_connect("localhost", "username", "password", "dbname");
if(!$conn){
    echo "PHP & MySQL Connection: Error! " . mysqli_connect_errno() . ' - ' . mysqli_connect_error();
    exit;
} else {
    echo "PHP & MySQL Connection: Ok!<br>";
    
    //سازگاری با حروف فارسی
    $sql = "SET NAMES 'utf8'";
    $query = mysqli_query($conn, $sql);
    
    //ساخت جدول و ستون ها
    $sql = "CREATE TABLE books(
    id INT NOT NULL AUTO_INCREMENT,
    PRIMARY KEY(id),
    book VARCHAR(255),
    level VARCHAR(255))
    ENGINE=MyISAM DEFAULT CHARACTER SET=utf8 COLLATE=utf8_persian_ci"
;
    $query = mysqli_query($conn, $sql);
    
    if(!$query) {
        echo "Creating Table books: Error! " . mysqli_error($conn) . '<br>';
    } else {
        echo "Creating Table books: OK!<br>";
        
        //ذخیره نمونه اطلاعات در جدول
        $sql = "INSERT INTO books(book, level) VALUES('آموزش HTML', 'مقدماتی')";
        $query = mysqli_query($conn, $sql);
        
         $sql = "INSERT INTO books(book, level) VALUES('آموزش PHP', 'مقدماتی')";
        $query = mysqli_query($conn, $sql);
        
        $sql = "INSERT INTO books(book, level) VALUES('آموزش MySQL', 'پیشرفته')";
        $query = mysqli_query($conn, $sql);
           
        if(!$query) {
            echo "Inserting Into Table books: Error! " . mysqli_error($conn);
        } else {
            echo "Inserting Into Table books: OK!";
        }
    }
}
//پایان اتصال
mysqli_close($conn);
?>
برنامه نویسی شی گرا (Object-oriented):
<?php
//اتصال به دیتابیس
$conn = new mysqli("localhost", "username", "password", "dbname");
if(!$conn) {
    echo "PHP & MySQL Connection: Error! " . $conn->errno . ' - ' . $conn->error;
    exit;
} else {
    echo "PHP & MySQL Connection: Ok!<br>";
    
    //سازگاری با حروف فارسی
    $sql = "SET NAMES 'utf8'";
    $conn->query($sql);
    
    //ساخت جدول و ستون ها
    $sql = "CREATE TABLE books(
    id INT NOT NULL AUTO_INCREMENT,
    PRIMARY KEY(id),
    book VARCHAR(255),
    level VARCHAR(255))
    ENGINE=MyISAM DEFAULT CHARACTER SET=utf8 COLLATE=utf8_persian_ci"
;
    $conn->query($sql);
    if(!$conn) {
        echo "Creating Table tblname: Error! " . $conn->error;
    } else {
        echo "Creating Table tblname: OK!<br>";
        
        //ذخیره نمونه اطلاعات در جدول
        $sql = "INSERT INTO books(book, level) VALUES('آموزش HTML', 'مقدماتی')";
        $conn->query($sql);
        
        $sql = "INSERT INTO books(book, level) VALUES('آموزش PHP', 'مقدماتی')";
        $conn->query($sql);
        
        $sql = "INSERT INTO books(book, level) VALUES('آموزش MySQL', 'پیشرفته')";
        $conn->query($sql);
           
        if(!$conn) {
            echo "Inserting Into Table books: Error! " . $conn->error;
        } else {
            echo "Inserting Into Table books: OK!";
        }        
    }
}
//پایان اتصال
$conn->close();
?>
توضیح:
- چنانچه پیش از این جدول books را ساخته باشیم با اجرای پرس و جوی بالا خطای
Creating Table books: Error! Table 'books' already exists
را دریافت خواهیم کرد، دلیل این خطا وجود جدول هم نام و تلاش برای ایجاد مجدد آن است، برای رفع این مشکل از طریق برنامه phpMyAdmin که معمولا در سرور مجازی با درج آدرس
http://localhost/phpmyadmin
در دسترس است، جدول موجود را Drop می کنیم (اصطلاح Drop در پایگاه داده معادل حذف و Delete است).
- هر دستور INSERT INTO مقادیر را در یک ردیف از ستون های تعیین شده ذخیره می کند، در این نمونه کد مقادیر به صورت مستقیم درج شده اند و از نظر امنیتی بررسی خاصی روی آنها صورت نگرفته است، در برنامه های کاربردی لازم است که هر نوع ورودی استفاده شده در پرس و جوهای دیتابیس قبل از هرچیز ایمن سازی شوند تا از نفوذ و خرابکاری احتمالی در پایگاه داده جلوگیری شود (در ادامه نکاتی که جهت حفظ امنیت دیتابیس باید رعایت کنیم را بررسی خواهیم کرد).
- در مواردی که اطلاعات به صورت مقادیر چندگانه و آرایه ای هستند بهتر است جهت مختصر نویسی و کدنویسی بهینه دستور INSERT را در حلقه ی while یا for قرار دهیم، در مثال بالا جهت جلوگیری از پیچیده شدن مبحث این کار صورت نگرفته است اما در برنامه نویسی حرفه ای تا حد امکان باید سعی کنیم مختصر و مفید کدنویسی کنیم!
- جهت سازگاری کامل جداول پایگاه داده با حروف زبان فارسی لازم است که علاوه بر تعیین utf8 به عنوان DEFAULT CHARACTER SET و utf8_persian_ci به عنوان COLLATE پیش فرض، پرس جوی زیر را هم پس از اتصال به دیتابیس اجرا کنیم:
SET NAMES 'utf8'
- فراموش نکنیم که پس از پایان اجرای پرس و جوها بهتر است از تابع mysqli_close استفاده کنیم تا از آزادسازی منابع سرور مطمئن شویم.

ایمن سازی مقادیر ورودی به دیتابیس در اکستنشن MySQLi


یکی از نکات کلیدی که برنامه نویسان وب در هنگام کار با سیستم های مدیریت پایگاه داده باید حتما به آن توجه داشته باشند حفظ امنیت کدها و جلوگیری از نفوذ به دیتابیس است، از جمله روش های متداول هکرها حملات موسوم به SQL Injection یا تزریق و اضافه کردن دستورات به مقادیری است که به عنوان ورودی از سمت کاربر دریافت و در پرس و جوهای سرور جایگزین می شوند، با توجه به مقدماتی بودن سطح این سری از آموزش ها از توضیح چگونگی این حملات خودداری می کنیم و در ادامه صرفا با نحوه مقابله با آنها در اکستنشن MySQLi آشنا خواهیم شد.
نخستین گام در جهت حفظ امنیت دیتابیس عدم درج مستقیم هرگونه مقادیری است که از سمت کاربر دریافت می شود، برای این منظور در روش برنامه نویسی رویه ای (Procedural) از تابع mysqli_real_escape_string و در برنامه نویسی شی گرا (Object-oriented) از Prepared Statement و Bind Param استفاده می کنیم.

ایمن سازی پارامترها با تابع mysqli_real_escape_string


یکی از روش های متداول ایمن سازی پارامترها در برنامه نویسی رویه ای (Procedural) استفاده از تابع mysqli_real_escape_string است، با این تابع می توانیم مقادیر ورودی از سمت کاربر را قبل از استفاده در پرس و جوی دیتابیس به لحاظ وجود کاراکترهای زیر ایمن سازی کنیم:
NUL (ASCII 0) 
\n
\r
\
'
"
Control-Z
این دسته از کاراکترها نباید به عنوان ورودی خام و به صورت پارامتر مستقیم در پرس و جوها استفاده شوند، به طور مثال اگر دستور INSERT در پرس و جوی ما به شکل زیر باشد:
//ذخیره نمونه اطلاعات در جدول
$book = 'PHP';
$level = 'pro';
$sql = "INSERT INTO books(book, level) VALUES('$book', '$level')";
و به فرض هکر مقدار متغیر level را از فرمی در صفحه HTML به این صورت ارسال کند:
$level = 'pro\'';
پرس و جویی نهایی به شکل زیر (با کاراکتر ' اضافه) خواهد بود:
INSERT INTO books(book, level) VALUES('PHP', 'pro'')
کمترین اتفاقی که در این حالت ممکن است رخ دهد از کار افتادن برنامه و دریافت خطای زیر است:
Inserting Into Table books: Error! You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''pro'')' at line 1
بروز خطا این پیام را به هکر می دهد که ایمن سازی پارامترها در پرس و جوهای دیتابیس به درستی صورت نگرفته و کدها قابل نفوذ هستند، به همین جهت برای در امان بودن از این نوع خطرات باید قبل از استفاده از پارامترها در پرس و جو آنها را از تابع mysqli_real_escape_string عبور دهیم:
//ذخیره نمونه اطلاعات در جدول
$book = mysqli_real_escape_string($conn, 'PHP');
$level = mysqli_real_escape_string($conn, 'pro\'');
$sql = "INSERT INTO books(book, level) VALUES('$book', '$level')";
این تابع دو آرگیومنت دارد، آرگیومنت اول متغیر (آبجکت) اتصال است و آرگیومنت دوم مقادیری است که می خواهیم به عنوان پارامتر در پرس و جو جایگزین کنیم، برای آشنایی بیشتر با این تابع و دیدن نمونه مثال ها می توانیم به آدرس زیر در سایت php.net رجوع کنیم.
php.net/manual/en/mysqli.real-escape-string.php

ایمن سازی پارامترها با Prepared Statement و Bind Param


 در برنامه نویسی شی گرا (Object-oriented) علاوه بر متد mysqli_real_escape_string روش توصیه شده دیگری برای ایمن سازی پارامترها تحت عنوان Prepared Statement وجود دارد، در شیوه Prepared Statement ابتدا پرس و جو بدون ارسال پارامترهای ورودی به دیتابیس ارسال می شود (به جای پارامترها علامت ? درج می کنیم) و سپس مقادیر پارامترهای مورد نظر به صورت Bind Param به دیتابیس ارسال شده و در نهایت پرس و جوی نهایی تکمیل و اجرا می شود، با این شیوه بخش دستورات از بخش مقادیر جدا شده و بدین نحو می توانیم حملات SQL Injection را خنثی کنیم، در مثال زیر نمونه کد شی گرائی که در آموزش بررسی کردیم را در قسمت دستور INSERT به شکل زیر ویرایش می کنیم:
//ذخیره نمونه اطلاعات در جدول
$book = 'PHP';
$level = 'pro';
$sql = "INSERT INTO books(book, level) VALUES(?, ?)";
$stmt = $conn->prepare($sql);
$stmt->bind_param("ss", $book, $level);
$stmt->execute();
همان طور که مشخص است به جای متد query از سه متد prepare، bind_param و execute استفاده کرده ایم، در متد prepare دستور پرس و جو بدون ارسال پارامترها درج شده است (در قسمت VALUES به جای هر پارامتر یک علامت ? جایگزین شده است)، در متد bind_param در آرگیومنت اول به ازای نوع داده (Data Type) هر پارامتر یک حرف s قرار داده ایم، s به معنی String (رشته) است، در اکستنشن MySQLi در کل چهار نوع داده به شرح زیر در قسمت Bind قابل تعریف است:
i - Integer
s - String
d - Double
b - Blob
از این چهار نوع معمولا i به معنی Integer (عدد) و s به معنی String (رشته) بیشترین کاربرد را در پرس و جوها دارند.
در نهایت با فراخوانی متد execute پرس و جو به نحو کامل اجرا شده و دستور INSERT اعمال می شود.
نکته: در برنامه های کاربردی معمولا مقادیر ورودی با متدهای GET یا POST از سمت کاربر دریافت شده و سپس به متغیرها نسبت داده می شوند، به طور مثال:
$book = $_POST['book'];
$level = $_POST['level'];
در صورت عدم آشنایی با نحوه دریافت پارامترها از سمت کاربر می توانیم به مبحث فرم های وب در HTML و متد GET و POST در PHP مراجعه کنیم.
مطالب گفته شده در این آموزش جهت شروع آشنایی با بحث ایمن سازی پارامترها در اکستنشن MySQLi کفایت می کند، در آموزش های پیش رو با توضیحات و مثال های بیشتری از مبحث ایمن سازی پارامترها در برنامه نویسی PHP و MySQL آشنا خواهیم شد.
دسته بندی: آموزش مقدماتی » MySQL
related مطالب بیشتر:
اتصال PHP به MySQL با اکستنشن MySQLi
استفاده از WHERE در پرس و جوی MySQL
حذف مقادیر از MySQL با دستور DELETE
آموزش MySQL، سیستم مدیریت پایگاه داده
محدودسازی، گروه بندی و مرتب سازی نتایج در MySQL
دیدگاه
more ۵۴ دیدگاه برای این مطلب ارسال شده است.
more دیدگاه جدید بر اساس تاریخ ارسال در انتهای دیدگاه های موجود نمایش داده می شود.
hamed
۲۰:۰۲ ۱۳۹۳/۰۵/۲۲
سلام با تشکر از سایت خوبتون
من در صفحه ی اول سایتم یه فیلد آپلود دارم که آدرس صفحه اش متفاوت با صفحه ی اوله و کاربر وقتی آپلود میکنه میره به صفحه ای دوم و همونجا میمونه ولی من میخوام برگرده به صفحه ای اول. بعد در انتهای صفحه ی دوم از طریق header آدرس صفحه ای اول رو دادم ولی فابرفاکس میگه Document Expired حدسم اینه که session ایراد داره میشه راهنماییم کنید در صفحه ی اول و دوم چطور باید seission رو تنظیم کنم
بدون دیدن سورس کدها نمی توان کمک خاصی کرد، معمولا Document Expired زمانی است که یک رفتار در مرورگر (مانند ارسال یک فرم) قبلا انجام شده و کاربر بدون کلیک مجدد بر روی دکمه ارسال (به طور مثال با استفاده از دکمه Back مرورگر)، قصد انجام مجدد آن را داشته باشد، در حالت کلی باید زمانی که آپلود در کدهای PHP انجام شد، دستور header را با یک مقدار Location تنظیم کنید تا کاربر به صفحه دیگر منتقل شود، اگر این کار را صحیح انجام دهید تداخلی با استفاده از سشن ندارد.
نکته: پیش از اجرای تابع header نباید هیچ نوع خروجی یا BOM وجود داشته باشد.
hamed
۱۷:۵۹ ۱۳۹۳/۰۵/۲۳
این کدهای منه کارش رو درست انجام میده یعنی فایل رو آپلود میکنه فقط به صفحه ی login برنمیگرده
session_start();
if (isset($_SESSION['user']) && isset($_SESSION['pass'])){
$type=$_FILES["up"]["type"];
$t=explode("/",$type);
$usr=$_SESSION['user'];
$l=$_FILES["up"]["tmp_name"];
$path="E:\user-pic\\".$usr.".".$t[1];
move_uploaded_file($l,$path);
header("location:http://127.0.0.1/login.php");
}
فایل ها باید به صورت کامل و تست واقعی بررسی شوند، دیدن بخشی از کدها کافی نیست!
valiyan
۰۰:۳۷ ۱۳۹۳/۰۷/۰۱
سلام من یه پایگاه داده mysql دارم که اطلاعات کاربران داخلش ذخیره شده و میخوام در سایتم یک فرم جستجو داشته باشم که وقتی کاربر تاریخ تولد رو جستجو میکنه اطلاعاتی مانند نام و نام خانوادگی و... کاربرانی که تاریخ تولدشان برابر با تاریخ وارد شده است که در پایگاه داده ذخیره شده رو نمایش بده. لطفا کمکم کنین خیلی نیاز دارم . لطفا از ایجاد فرم تا آخر کار رو برام بگین
امکان پاسخگویی به این نوع سوالات کلی وجود ندارد!
کاری که می خواهید انجام دهید نیازمند داشتن دانش برنامه نویسی در حد متوسط است، لذا قاعدتا باید آموزش های مقدماتی را به تدریج و با تمرین و تکرار فرا بگیرید و برای کارتان به اندازه کافی وقت صرف کنید!
پرویز
۰۱:۰۲ ۱۳۹۳/۰۸/۲۲
با سلام
من یه صفحه ی وب با php mysql طراحی کردم پایگاه داده رو با xampp پر کردم و اطلاعات رو قبل از شروع کردن به طراحی وب سایت با word تایپ کردم و در هنگام طراحی پایگاه داده با کپی پیست اطلاعات رو از ورد به پایگاه داده اینسرت کردم و تمامی collation ها رو هم روی utf8-persian-ci , بعد از جواب نگرفتن از برنامه روی utf8-general-ci تنظیم کردم. همین طور تمام صفحات پروژه ام را هم روی utf-8 انکد کردم. مشکل من این هست که وقتی حروف فارسی رو از پایگاه داده روی صفحه ی وب نشون میده به جای اون ها علامت سوال ؟ نشون میده
لطفا راهنمایی کنید.
با تشکر
پرویز
- collation دیتابیس و جداول باید هر دو بر روی utf8-persian-ci تنظیم شوند (از برنامه phpMyAdmin استفاده کنید)
- اطلاعات را ابتدا در یک فایل Notepad ریخته و از آن به دیتابیس انتقال دهید.
- هنگام اجرای پرس و جوی SELECT و قبل از آن، پرس و جوی زیر را اجرا کنید:
mysqli_query($conn, "SET NAMES 'utf8'");
- همچنین در تمام صفحات سایت شما باید متاتگ زیر باشد:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
- اگر با htaccess آشنا هستید نیز می توانید دستور زیر را تنظیم کنید:
AddDefaultCharset utf-8
reza
۱۴:۲۸ ۱۳۹۳/۰۹/۳۰
سلام ، من چطوری میتونم توی یه خط بالای جدول تعداد بازدید های امروز رو نمایش بدم ؟
یعنی اینکه تعداد ردیف هایی که تاریخ همون روز رو داره شمرده بشه و بگه بازدید امروز مثلا 100 نفر
حذف شد
ابتدا باید فرمت تاریخ موجود در دیتابیس مشخص شود، سپس تاریخ امروز با همان فرمت (با استفاده از تابع date) به یک متغیر نسبت داده شده و در دستور SELECT در قسمت WHERE ردیف هایی انتخاب شوند که date = $now باشد، در نهایت و در حلقه while یک متغیر با مقدار عددی (شروع از صفر) را با علامت ++ افزایش دهید تا در پایان حلقه تعداد کل ردیف ها به دست آید، مثال:
<?php
$now = date('Y-m-d');
$query = mysqli_query($conn, "SELECT id FROM tbl_name WHERE date_col = $now");
$loop = 0;
while($row = mysqli_fetch_array($conn, $query)){
$loop++;
}
echo $loop;
?>
نکته: راه حل حرفه ای تر استفاده از تابع COUNT در پرس و جوی MySQL است.
سیما
۰۹:۰۵ ۱۳۹۳/۱۱/۰۷
با سلام و خسته نباشید داخل دیتابیس من 7 ستون با نامهای شماره - نام کاربری - ایمیل و... دارم میخوام موقع فراخوانی اطلاعات جهت نمایش به صورت جدول نمایش داده بشه ممنون اگه راهنماییم کنید
انجام این کار مستلزم این است که ابتدا با ساختار جدول در HTML و سپس با نحوه چاپ خروجی HTML توسط کدهای PHP آشنا باشید، به این ترتیب زمانی که اطلاعات را در حلقه while از دیتابیس دریافت می کنید می توانید در تگ های جدول (تگ های td و...) به صورت داینامیک چاپ کنید تا در نهایت یک جدول HTML با اطلاعات دیتابیس داشته باشید.
علی
۱۱:۲۰ ۱۳۹۳/۱۱/۱۳
سلام قطعه کد زیر را ببینید
$query = db::query("SELECT `id`, `user`, `type`, `ref`, `date`,`status` FROM {prefix}pays order by id DESC");
while($row = mysqli_fetch_array($query))
در دستور بالا type داخلش یک عدد قرار می گیره که متعلق به یک شی است مثلا عدد 17 برای کیف است و این عددها دارای یک نام هستند که در یک ستون دیگر دیتابیس قرار دارد به نام usertypes حالا می خواهم دستوری اضافه کنم که مقدار عددی type را به نامش برگرداند و بجای عدد، نام کالا را خروجی دهد مثلا در خروجی بجای 17 ، نامش یعنی کفش را اکو کند ممنون میشم راهنمایی کنید
پرس و جوی درج شده از متدهای استاتیک خودنوشت (متدهای برنامه نویس پروژه) استفاده می کند و ممکن است راه حل، بسته به عملکرد متد با حالت معمولی متفاوت باشد، اما در کل باید پرس و جو را بر اساس JOIN با جدول دیگر بنویسید که آموزش های مربوطه در بخش مقدماتی MySQL توضیح داده شده است.
علی
۱۲:۲۶ ۱۳۹۳/۱۱/۱۴
استاد این دستور ستون type را نمایش میده که از طریق یک پلاگین هر خریدی انجام میشه به این ستون آی دی اون کالای خریداری شده اضافه میشه من می خوام آی دی این کالا که به صورت عدد هست را برگردانم به نام همان کالا که در قسمت دیگر قرار داره و نام آن تیبل هم nametype است که دارای ستون id, title است که درستون id شماره مربوط به کالا و title هم نام اون کالا است حالا میشه به کدی که خدمتتون دادم شماره کالا را برگرداند به نامش یعنی وقتی query$ و ستون type را اکو کردیم به جای شماره کالا نام کالا خروجی داده بشه ؟
همان طور که گفتیم باید از JOIN و مشتقات آن برای نوشتن پرس و جوی ترکیبی استفاده کنید، بدون تست نمی توان کد دقیقی ارائه کرد، اما احتمالا نمونه زیر راه حل مشکل شما است:
$query = db::query("SELECT {prefix}pays.id, {prefix}pays.user, {prefix}pays.type, {prefix}pays.ref, {prefix}pays.date, {prefix}pays.status FROM {prefix}pays INNER JOIN {prefix}nametype ON {prefix}pays.type = {prefix}nametype.id order by {prefix}pays.id DESC");
در حلقه while نیز از ستون title برای گرفتن نام کالا استفاده کنید.
rahim
۰۶:۴۴ ۱۳۹۳/۱۲/۱۷
سلام و عرض ادب به شما... ببخشید پستهای سایت مثلا همین پستهایی که در سایت شما وجود داره در پایگاه داده ذخیره میشن یا در فایل؟ و اگه در پایگاه داده ذخیره میشن آیا گوگل به نوشته هایی که در پایگاه داده ذخیره شدن و در صفحه نمایش داده میشن اهمیت میده یا فقط به نوشته های درون html اهمیت میده؟ یا حق
اینکه تکنولوژی سمت سرور یک سایت چه چیزی باشد از نظر موتورهای جستجو مهم نیست، یعنی چه مطالب در دیتابیس ذخیره شود و چه به صورت فایل متنی و... باشد اهمیتی ندارد، در نهایت مهم خروجی HTML است که در مرورگر نمایش داده می شود، در CMS های پیشرفته معمولا در کنار استفاده از دیتابیس تا حد امکان نسخه بدون نیاز به دیتابیس نیز به صورت Cache شده وجود دارد تا سرعت کار افزایش یابد.
۰۳:۱۰ ۱۳۹۴/۰۲/۰۶
با سلام و احترام
من میخوام داخل سایتم اخباری رو از دیتابیس فراخوانی کنم. قسمت title اخبار می خوام title رو از بانک فراخوانی کنم. هر کار میکنم نمیشه. ممنون میشم کمکم کنید و بگین چه جوری مثلا title یا date یا متن اصل خبر رو فراخونی کنم.
با سپاس
سوالتان کلی است! قاعدتا روش معمول SELECT کردن ردیف های مربوط از دیتابیس و گرفتن خروجی در کدهای PHP است که اگر این فرآیند را در آموزش های مقدماتی طی کرده باشید، کار چندان سختی نیست! اگر هم با خطایی مواجه شدید باید تست، بررسی و علت خطا مشخص شود.
donya
۱۳:۰۹ ۱۳۹۴/۰۲/۲۵
سلام ببخشید من یه سایت ساختم که دیکشنری آنلاینه .. میخوام وقتی کاربر کلمه ی مورد نظرش رو وارد میکنه بلافاصله معنی اون رو مشاهده کنه .. اما اصلا نمیدونم باید چطور این کارو بکنم و چطور این اطلاعات رو از دیتابیسم بخونم .. اگه میشه راهنماییم کنید.
اگر منظورتان از بلافاصله، همزمان با تایپ کاربر باشد، راه حل، استفاده از Ajax و ترکیب آن با PHP و MySQL است، البته قاعدتا برای طراحی یک برنامه تحت وب باید به ملزومات آن (HTML، CSS، JavaScript و...) مسلط بود که این راه حل سریع و جادوئی ندارد، باید از مقدمات آموزش ها را مطالعه و تمرین کرد!
امیر مهدی
۰۲:۰۶ ۱۳۹۴/۰۳/۱۱
سلاو و خسته نباشید
من می خواستم یک سیستم جستجو بسازم که کاربر یک کد عددی وارد اون کنه و برنامه کد رو جدا کنه و نمایش بده
مثلا
989364711242
رو بنویسه
98-9364711042-ایران
یعنی باید 98 رو به دیتابیس کشور ها معرفی کنه و خروجی بگیره
میشه راهنمایی کنید برای ایده حل این برنامه؟
می توانید با توابعی مانند substr و strlen به صورت نمونه زیر این کار را انجام دهید:
<?php
$num = 989364711242;
$leng = strlen($num);
$code = substr($num, 0, 2);
$mob = substr($num, 2, $leng - 2);
echo $code.'-'.$mob.'-ایران';
?>
۱۶:۲۶ ۱۳۹۴/۰۳/۳۰
سلام
خسته نباشید
سایتتون عالیه.
یه سوال داشتم.
تو دیتابیس چندتا ستون هست.
نام ، شماره ، ایمیل ، کد پیگیری.
میخوام تو یه فرم جدید ، کاربر بیاد کد پیگیری مخصوصش رو وارد کنه ، وقتی کدش رو درست وارد کرد بعد بهش اطلاعاتش نمایش داده بشه. (همون نام و شماره و ایمیل)
ممنون میشم راهنمایی کنید.
چند تا کار کردم و نشد.
تشکر
سوال کلی است! باید با چند مبحث برنامه نویسی وب آشنا باشید، از جمله تنظیم فرم HTML، ارسال مقادیر از طریق متد GET یا POST، دریافت مقادیر در سرور با کدهای PHP، جایگذاری مقادیر در پرس و جوی MySQL و انتخاب ردیف ها با SELECT، گرفتن خروجی در حلقه while و...
این موارد نیازمند کسب آموزش از مقدمات است و متاسفانه نمی توان در این قسمت آنها را توضیح داد!
صدیقی
۰۸:۳۹ ۱۳۹۴/۰۵/۱۶
خیلی ممنون از آموزش های بسیار عالیتون
ولی این کد فقط ایدی 1 رو میاره و نمایش میده . من اگر بخوام تمام اطلاعات یه تیبل رو نمایش بده باید چکار کنم؟
آموزش های مقدماتی فرآیندی گام به گام هستند، یعنی باید از ابتدا و مورد به مورد مباحث را فرا بگیرید تا امکان تغییر و سفارشی سازی دستورات را داشته باشید، نه اینکه صرفا به دنبال کدی کاربردی باشید که قاعدتا با هدف این مطلب متفاوت است!
صدیقی
۰۸:۵۰ ۱۳۹۴/۰۵/۱۶
خیلی ممنونم اما خودم پیداش کردم اونی که میخواستم :)
از این استفاده کردم
<?php
mysql_connect("server", "user", "****")//اطلاعات اتصال
or die(mysql_error());

mysql_select_db("db")//نام دیتابیس
or die(mysql_error());

$counter=10;
$page = @$_GET['email'];

if($page=='') $page=1;
$start=($page-1)*$counter;
$sql="SELECT * FROM `users` ORDER BY `id` DESC LIMIT ".$start.",".$counter."";
$result = mysql_query($sql);
while($rec = mysql_fetch_assoc($result)){
?>
<?php
echo "<br />".$rec['email'];
?>
<?php
};
?>
more لطفا پیش از ارسال دیدگاه نکات زیر را مد نظر داشته باشید:
- به سوالات کلی، زمانبر، مبهم و مشکلاتی که تلاشی برای رفع آنها نکرده باشید پاسخ مختصر داده شده یا به بخش برنامه نویسی اختصاصی ارجاع داده می شوند.
- کدها و اسکریپت های طولانی را ترجیحا در یک صفحه وب آنلاین یا به صورت حساب موقت و آزمایشی قرار دهید تا امکان بررسی دقیق مشکل و خطایابی میسر باشد.
- تمام دیدگاه های ارسالی خوانده شده و برای هر کاربر مدت زمان لازم جهت پاسخگویی در نظر گرفته می شود، لطفا از طرح سوالات متعدد در بازه زمانی کوتاه خودداری کنید.



 refresh
10 × 10
1 × 6
20 × 20
=
آخرین دیدگاه ها
more برای دسترسی سریع به یادداشت مربوطه می توانید از لینک مطلب در کادر زیر استفاده کنید.
javascript
سلام 🙌 توی جاوا اسکریپت چطور تگ آپشن رو پیش فرض بزاریم مثلا : تگ آپشن _استان محل صدور : همدان -...
۱۴۰۲/۰۷/۰۶

Fateme
سلام مطالب عالی و استفاده می کنم دستتان درد نکنه . سوال من این هست چطور میتونم تاریخ تولد را وارد کنم سن شخص رو...
۱۴۰۲/۰۷/۰۵

مجتهدزاده
سلام من در لاراول سعی دارم تا با یک لینک رو اجرا کنم تا یک اس ام اس به شماره ای که در...
۱۴۰۲/۰۷/۰۳

پـــرتو
سلام جناب خسته نباشید شرمنده مزاحم میشم عه جناب ببخشید من دو سه تا وبلاگ دارم که یکیش یا دوتاشون هک میشن یعنی...
۱۴۰۲/۰۷/۰۳

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

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

سعید
نمای ظاهری من مثل قبل که در اوت لوک میفرستادم در نیو ایمیل نیست یعنی تغییر کرده چطور میتونم برگردم به همون حالت اول خودش...
۱۴۰۲/۰۶/۲۷

سینا
با سلام و خسته نباشید من برای ترجمه متن از گوگل ترانسلیت استفاده می کنم یه مشکلی که دارم اینکه وقتی متنی رو برام...
۱۴۰۲/۰۶/۲۵

امین رحیمی
عالی بود ممنون
۱۴۰۲/۰۶/۲۴

کوروش
سلام خسته نباشید توضیح : سایتی که تگ های select option ها و همه div ها و label ها ( کلاس های...
۱۴۰۲/۰۶/۲۴

عدم اجرای فونت فیس در تب منو
سلام برای تب منو فونت فیس برای تب اول کار میکند اما تب های بعدی اعمال نمیشود چکار باید کرد
۱۴۰۲/۰۶/۲۲

محبوبه قاسم پور
سلام وقتتون بخیر برای منوهای کشویی سایت، اگر خاصیت overflow:hidden باشد، زیرمنوها نمایش داده نمی شود، از طرفی اگر این خاصیت فعال نباشد...
۱۴۰۲/۰۶/۱۸

mehdi
سلام من امتحان کردم نشد
۱۴۰۲/۰۶/۱۵

پـــرتو
سلام فکنم در یادداشت ها ارسال شده بود و تاریخشم یادم نیست ولی من واقعا نمی دونم کامنتش کجاست که برم برش دارم ...
۱۴۰۲/۰۶/۱۴

پـــرتو
سلام خسته نباشید ببخشید مزاحم شدم می خواستم بگم که یه کدی داده بودین قبلا برای بلاگفا که آی پی کسایی که بهمون توهین می...
۱۴۰۲/۰۶/۱۱

امیرحسین رستمی
سلام مجدد وقت بخیر لطفا لینک زیر را ببینید میخوام تمام متن های فارسی که اینجا انتخاب کردم رو با عبارت با قائده انتخاب...
۱۴۰۲/۰۶/۱۱

امیرحسین رستمی
سلام وقت بخیر من این متنو دارم: میخوام فقط متن های فارسی رو انتخاب کنم با preg_match و متن جایگزین براش بزارم قبلا...
۱۴۰۲/۰۶/۱۱

امیرحسین رستمی
در رابطه با دوتا سوال قبلی من این کد رو نوشتم شما بررسی کنید ببینید اگه مشکل دیگه ای نداره ، درست داره کار میکنه...
۱۴۰۲/۰۶/۰۹

امیرحسین رستمی
سلام وقت بخیر من یک عبارات با قائده ای میخوام که این متن رو : من همچین عبارتی در نظرم هست ولی ...
۱۴۰۲/۰۶/۰۹

hossein
سلام مجدد، ممنون از پاسخگویی شما از وردپرس استفاده میکنم و قالب وودمارت، هدر هم با هدر ساز قالب ساخته شده با اینکه...
۱۴۰۲/۰۶/۰۹

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

hossein
سلام وقت شما بخیر باشه ابتدا جا داره از شما تشکر کنم میخوام یک آیکن لینک دار توی هدر سایتم را از دید...
۱۴۰۲/۰۶/۰۹

علی
سلام و با تشکر از راهنمایی شما بنده یک وب سرویس ارسال پیامک دارم که از طریق آن برای کابرانم پیامک ارسال می کنم....
۱۴۰۲/۰۶/۰۷

مهدی
سلا چطوری میتونم کدام تو مرورگر دقیق نمایش بدم حتی >< تگ هام نمایش داده بشه در html تگ کد را هم معرف نکنید چون...
۱۴۰۲/۰۶/۰۴

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

محمدرضا
سلام وقت شما بخیر لطف بفرمائید با switch و default کدی رو بنویسید که: اگه متغیر a یک باشد متغیر b دو...
۱۴۰۲/۰۶/۰۱

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

fatima
سلام. خسته نباشید. ما با responsive هم میتوانیم اسکرول افقی را حذف کنیم؟
۱۴۰۲/۰۵/۲۸

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

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