PDA

View Full Version : مشکل در ضمیمه کردن فایل در php (حل شد)



reza-alborz
جمعه 18 اسفند 1391, 17:54 عصر
سلام دوستان
من یک فایل php دارم مثلا بنام database که در آن یک فایل را که دارای تعدای متغییر است را با تابع require ضمیمه کردم.
و به خوبی هم کار میکنه.
حال همین فایل databse رو در فایل دیگر ضمیمه میکنم باید متغییر ها کار کنند ؟؟؟

colors
جمعه 18 اسفند 1391, 19:23 عصر
مشکلی نداره! باید کار کنه

reza-alborz
جمعه 18 اسفند 1391, 19:43 عصر
اما کار نمیکنه
مثلا من تو یک فایلی چند تا متغیر ثابت به این شکل تعریف کردم
define("DB_SERVER", "localhost");
define("DB_USER", "root");
define("DB_PASS", "");
حال تو فایل مثلا database.php با تابع require اومدم اون فایلی که حاوی این متغییر هاست رو فراخوانی کردم و در دیتابیس هم جایگزین کردم و به خوبی کار میکنه
اما وقتی که در فایل دیگری میخوام فایل database .php رو فراخوانی کنم و متغیر ها کار نمیکنند و با این اخطار ها مواجه میشم

Notice: Use of undefined constant DB_SERVER - assumed 'DB_SERVER' in

Notice: Use of undefined constant DB_USER - assumed 'DB_USER' in

Notice: Use of undefined constant DB_PASS - assumed 'DB_PASS' in

colors
جمعه 18 اسفند 1391, 20:33 عصر
برای من که کار میکنه!، اگه میتونی کدهاتو بزار

reza-alborz
شنبه 19 اسفند 1391, 07:57 صبح
آخه مشکل من اینه که وقتی تمام فایل ها پیش هم یعنی تو یک پوشه قرار میگیرند کار میکنه
ولی وقتی که فایل متغیر ها و دیتابیسم رو تو یک پوشه و فایل ایندکس رو در پوشه دیگر قرار میدم کار نمیکنه
-------------------------------------------
پوشه inc فایل config.php :


<?php
define("DB_SERVER", "localhost");
define("DB_USER", "root");
define("DB_PASS", "");
define("DB_NAME", "site");
?>

---------------------------------------------
پوشه inc فایل database.php


<?php
require_once ("config.php");
class MySQLDatabase
{

function __construct()
{
$this->open_connection();

}


public function open_connection()
{

$connection = mysql_connect(DB_SERVER, DB_USER, DB_PASS);
if(!$connection)
{
die("Database Connection failed".mysql_error());
}
else
{
$db_select = mysql_select_db(DB_NAME, $connection);
if(!$db_select)
{
die("Database Selection Failed".mysql_error());
}
}
}
}

$database = new MySQLDatabase();
?>

----------------------------------------------------
پوشه site فایل index.php


<?php
require_once ("../inc/database.php");

if(isset($database))
{
echo 'true';
}
else
{
echo 'false';
}
echo '</br>';
?>

reza-alborz
شنبه 19 اسفند 1391, 16:20 عصر
دوستان کسی تست نکرد ؟

MMSHFE
یک شنبه 20 اسفند 1391, 00:06 صبح
فکر کنم مشکل شما با مسیردهی مطلق حل بشه. کدهای زیر رو امتحان کنید:
1- inc/config.php :


<?php
if(!defined('DB_NAME')) { define('DB_NAME' , 'site' ); }
if(!defined('DB_PASS')) { define('DB_PASS' , '' ); }
if(!defined('DB_SERVER')) { define('DB_SERVER', 'localhost'); }
if(!defined('DB_USER')) { define('DB_USER' , 'root' ); }
?>

2- inc/database.php :


<?php
require_once str_replace('\\', '/', dirname(__FILE__)) . '/config.php';
class MySQLDatabase {
function __construct() {
$this->open_connection();
}
public function open_connection() {
$connection = mysql_connect(DB_SERVER, DB_USER, DB_PASS);
if(!$connection) {
die('Database Connection failed ' . mysql_error());
}
else {
$db_select = mysql_select_db(DB_NAME, $connection);
if(!$db_select) {
die('Database Selection Failed ' . mysql_error());
}
}
}
}
$database = new MySQLDatabase();
?>

3- site/index.php :

<?php
require_once str_replace('\\', '/', dirname(dirname(__FILE__))) . '/inc/database.php';
if(isset($database)) {
echo 'true';
}
else {
echo 'false';
}
echo '</br>';
?>

reza-alborz
یک شنبه 20 اسفند 1391, 08:11 صبح
خیلی خیلی ممنونم
مشکلم حل شد
امکان داره بگبن که مسیر دهی مطلق کارش چیه ؟ واین کدها رو توضیح بدین

require_once str_replace('\\', '/', dirname(dirname(__FILE__))) . '/inc/database.php';

MMSHFE
یک شنبه 20 اسفند 1391, 08:37 صبح
بطور کلی و خلاصه مسیردهی مطلق یعنی بجای اینکه بگین inc/config.php/.. بگین usr/someone/public_html/inc/config.php/ یا توی ویندوز بگین file:///C/wamp/www/yoursite/inc/config.php یعنی مسیر مطلق رسیدن به فایل رو نسبت به ریشه بیان کنید نه مسیر نسبی نسبت به فایل جاری. اخیراً سرورها بخاطر یکسری مسائل امنیتی، مسیردهی نسبی رو غیرفعال کردن. اما درمورد اون کد که گفتین:
1- تابع dirname یک فایل یا پوشه رو میگیره و مسیر مطلقش رو اعلام میکنه.
2- ثابت __FILE__ به فایل جاری (که کد داره توش نوشته میشه) اشاره میکنه.
3- از اونجا که توی ویندوز پوشه ها هم با \ و هم با / میتونن جدا بشن ولی توی لینوکس فقط از / برای اینکار استفاده میشه، با str_replace گفتیم هرچی \ بود تبدیل کن به / تا کد بطور یکنواخت توی همه سیستمها و هاستها کار کنه.
4- اینکه میبینید یکجا دوبار از dirname استفاده شده و یکجا یکبار هم بخاطر اینه که با یکبار استفاده و ارسال __FILE__ بعنوان پارامتر، مسیر مطلق فایل جاری بدست میاد (که برای ضمیمه کردن config.php توی database.php کافیه) و اگه همین مسیر رو دوباره بعنوان پارامتر به dirname بدیم (مثل کاری که توی index.php انجام شده)، مسیر مطلق پوشه والد (یک پوشه بالاتر) بدست میاد که برای رسیدن به پوشه inc لازم بوده. در کل هربار dirname رو بیشتر استفاده کنیم، یک پوشه بالاتر میریم.
اگه احیاناً جایی ابهامی وجود داشت بفرمایید تا بیشتر توضیح بدم. موفق باشید.
-----
پاورقی: راستی، همیشه کدهاتون رو توی تگ مناسب بگذارین (توی انجمن برنامه نویس) تا به شکل درست به نمایش در بیاد. ضمناً دکمه تشکر کردن کاربرد قشنگتری نسبت به پست دادن برای تشکر داره :چشمک:

reza-alborz
یک شنبه 20 اسفند 1391, 09:37 صبح
خیلی ممنون
و خیلی واضح توضیح دادین
اگه مثلا تو فایل index.php از همون require استفاده کنیم هم جواب میده
اشکالی نخواهد ایجاد کرد
چون فکر کنم فقط اون فایلی رو که میخوایم فراخوانی کنیم مهمه که آدرس دهی مطلق شده باشه

MMSHFE
یک شنبه 20 اسفند 1391, 10:15 صبح
بله دقیقاً میتونید توی index.php هر دو فایل رو ضمیمه کنید. مهم مسیردهی مطلقه. اینطوری خودتون هم راحتترین چون نگران اینکه فایلتون توی کدوم پوشه ذخیره میشه هم نخواهید بود. ازطرف دیگه میتونید توی فایل index.php یا config.php یک ثابت تعریف کنید که مسیر مطلق ریشه سایتتون رو مشخص میکنه و بعد از اون برای مسیردهی دیگه نیازی نیست هربار با dirname مسیر رو بدست بیارین و کافیه همون ثابت رو بنویسید و در ادامه اون، بقیه مسیر رسیدن به فایل رو ذکر کنید.

reza-alborz
یک شنبه 20 اسفند 1391, 12:13 عصر
بله پیشنهاد بسیار خوبیه
خلاصه ممنون نزدیک چند روز در گیر این مساله بودم تا آخر با کمک شما حل شد