آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

ادامه سوال قبلی

hjmcoder  9 سال پیش  9 سال پیش
0 0

 //database_file

if ($option != null) {
$host = $option['host'];
$user = $option['user'];
$pass = $option['pass'];
$name = $option['name'];
}else {
global $config;
$host = $config['db']['host'];
$user = $config['db']['user'];
$pass = $config['db']['pass'];
$name = $config['db']['name'];
}

$this->connection = new mysqli($host, $user, $pass, $name);
if ($this->connection ->connect_error) {
echo("Connection failed: " .$this->connection ->connect_error);
exit;
}
$this->connection->query("SET NAMES 'utf8'");
//اینو اصلا نفهمیدم
public function query($sql) {
$result = $this->connection->query($sql);
$records = array();
if ($result->num_rows == 0) {
return null;
}else {
while ($row = $result->fetch_assoc()) {
$records[] = $row;
 برای این سوال 1 پاسخ وجود دارد. مشاهده پاسخ صحیح
پاسخ به سوال 
محسن موحد  9 سال پیش
+4 0

 پاسخ صحیح

فک کن اصلا کلاسی ننوشته باشیم و بصورت ساده بخوایم به mysql کانکت بشیم:

$cn = new mysqli('localhost', 'root', '', 'dbname_test');

بعد ازینکه کانکت شدیم، برای اینکه در دیتابیس چیزی اضافه یا کم کنیم و یا اینکه مقداری رو سلکت کنیم تا در صفحه نمایش بدیم، باید به دیتابیس با توجه به کانکشنی که داریم، کوئری بزنیم.(یعنی از کانکشن قبلی که داخل متغیر $cn قرار گرفته استفاده میکنیم):

$sql = "select * from tbl_students where (name = 'mohsen')";
$result = $cn->query($sql);

* متد query (در کد بالا) مال کلاس Mysqli هست و این قبلا نوشته شده.(ضمنا $cn هم به همان Mysqli داره اشاره میکنه، چون رشته ی اتصال داخلشه!!)

با توجه به کوئری، داخل دیتابیس جستحو میکنه که جدول tbl_students اسمی بنام mohsen وجود داره یا نه، و اگر وجود داشت، اون ردیف رو برمیگردونه و داخل $result میریزه.(نتیجه یک آبجکت هست که اگر بخوای بفهمی تعداد ردیف هایی که پیدا کرده، چنتاست باید $result->num_rows() رو بزنی و اگر بخوای به داده هاش دسترسی پیدا کنی باید $result->fetch_assoc() رو بنویسی. علت while هم برای این هست که ممکنه 10 تا رکورد با اسم mohsen پیدا بشه بنابراین باید از حلقه استفاده کنی تا در هر بار اجرای حلقه، یک ردیف fetch بشه. پس اگر 10 رکورد پیدا بشه، حلقه ی while به تعداد 10 بار اجرا میشه و اگر 1 رکورد پیدا بشه، این حلقه 1بار اجرا میشه.(یعنی تا زمانی که شرط برقرار باشه و بتونه fetch کنه))

 

حالا توو کدهای شما، این مثال در قالب یک کلاس، پیاده سازی شده.
داخل کلاس، اگر متغیری تعریف کنیم و بخواهیم داخل تابع های(متدها) اون کلاس به متغیر دسترسی داشته باشیم، از $this-> استفاده میکنیم:

class Test
{
private $name = 'Mohsen';

public function sayName()
{
echo $this->name;
}
}

$obj = new Test;
$obj->sayName(); // Mohsen

حالا با توجه به این مثال، کد دیتابیس رو دوباره مینویسیم:

class DB
{
private $cn = null;

public function __construct()
{
$this->cn = new mysqli('localhost', 'root', '', 'dbname_test');
// ...
}

public function myQuery($sql)
{
$result = this->cn->query($sql);
if($result && $result->num_rows() > 0)
// ...
}
}

$db = new DB;
$records = $db->myQuery("select * from tbl_students order by id desc");

علت اینکه $cn رو بیرون از متدها معرفی کردیم، بخاطر اینه که از این رشته ی اتصال، داخل تمام متدهای دیگه استفاده کنیم. مثلا میبینی که داخل متد myQuery از این رشته ی اتصال استفاده شده و دیگه برای بار دوم کانکت نمیکنیم چون یکبار کانکت کردیم و رشته ی اتصال داخل $this->cn وجود داره.

با توجه به کد بالا، فرضا اگر بخواهید چندین سلکت دیگر انجام دهید یا چندین متد دیگری (که بعدا مینویسید) رو اجرا کنید، چون یکبار $db = new DB; رو نوشته اید، نیازی نیست مجددا این کارو کنید. و از همان $db قبلی استفاده میکنید.

0 0
یکم واضح تر شد برام ممنون. (9 سال پیش)

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .