PDA

View Full Version : سوال: رفع خطا



soroush.r70
جمعه 02 تیر 1391, 14:58 عصر
دلیل این خطاها چیه مسیر فایل هم درسته پس مشکل از کجاست...؟


Warning: fopen(inc/soroushamar.txt) [function.fopen]: failed to open stream: No such file or directory in E:\xampp\htdocs\freetag\inc\function.php on line 78

Warning: flock() expects parameter 1 to be resource, boolean given in E:\xampp\htdocs\freetag\inc\function.php on line 79

Warning: fread(): supplied argument is not a valid stream resource in E:\xampp\htdocs\freetag\inc\function.php on line 80

Warning: ftruncate(): supplied argument is not a valid stream resource in E:\xampp\htdocs\freetag\inc\function.php on line 93

Warning: fseek(): supplied argument is not a valid stream resource in E:\xampp\htdocs\freetag\inc\function.php on line 94

Warning: fwrite(): supplied argument is not a valid stream resource in E:\xampp\htdocs\freetag\inc\function.php on line 95

Warning: flock() expects parameter 1 to be resource, boolean given in E:\xampp\htdocs\freetag\inc\function.php on line 96

Warning: fclose(): supplied argument is not a valid stream resource in E:\xampp\htdocs\freetag\inc\function.php on line 97

Warning: file_put_contents(inc/users.txt) [function.file-put-contents]: failed to open stream: No such file or directory in E:\xampp\htdocs\freetag\inc\function.php on line 105

Warning: file_get_contents(inc/users.txt) [function.file-get-contents]: failed to open stream: No such file or directory in E:\xampp\htdocs\freetag\inc\function.php on line 106

MMSHFE
جمعه 02 تیر 1391, 18:48 عصر
مطمئنید مسیر درسته؟ اگه درست بود که بی دلیل PHP به شما گیر نمیده! تا اینجا که فقط خطاها رو گذاشتین. باید کد رو هم ببینیم ولی در کل، دقت کنید که اگه قبل از اجرای دستورات فوق که موجب خطا شده، تابعی رو ازطریق یک فایل ضمیمه شده اجرا کنید و اون فایل، توی مسیر جاری نباشه، مسیر کاری جاری تغییر پیدا میکنه و به مسیر نگهداری فایل ضمیمه شده اشاره میکنه. بگذارین با مثال توضیح بدم. کد زیر رو ببینید که فرضاً کد فایل index.php در فهرست ریشه سایت هست:


require_once 'lib/functions.php';
showHeader();
$file = fopen('inc/soroushamar.txt', 'r');
while(!feof($file)) {
echo '<p>'.fgets($file).'</p>'.PHP_EOL;
}
fclose($file);
showFooter();

همونطور که میبینید، ابتدا فایل functions.php از پوشه lib ضمیمه شده و بعد، تابع showHeader که توی اون فایل تعریف شده، فراخوانی شده. بعد تلاش شده فایل soroushamar.txt از پوشه inc خونده و چاپ بشه و نهایتاً تابع showFooter از فایل ضمیمه شده (functions.php) فراخوانی شده. اما کد فوق درست کار نخواهد کرد چون بعد از فراخوانی تابع showHeader، مسیر کاری جاری (Current Working Directory) به lib تغییر خواهد کرد و درنتیجه دستور fopen دنبال فایل soroushamar.txt توی مسیر lib/inc میگرده نه inc پوشه root سایت! برای حل مشکل فوق باید اینطوری کار کنیم:


$cwd = getcwd();
require_once 'lib/functions.php';
showHeader();
chdir($cwd);
$file = fopen('inc/soroushamar.txt', 'r');
while(!feof($file)) {
echo '<p>'.fgets($file).'</p>'.PHP_EOL;
}
fclose($file);
showFooter();
chdir($cwd);

یعنی ابتدا با تابع getcwd مسیر کاری جاری رو بدست بیاریم و بعد از هربار فراخوانی توابع موجود در فایلهای ضمیمه شده، با chdir دوباره مسیر رو به وضعیت قبلی برگردونیم. البته این کار فقط وقتی ضروری هست که مسیر فایلهای ضمیمه شده، با فایلی که اونها رو ضمیمه میکنه متفاوت باشه. البته راه حل اصولی رفع این مشکل اینه که فهرست ریشه سایت رو یکبار ذخیره کنیم و از اون به بعد مسیرها رو نسبت به مسیر ریشه بدیم. برای این کار، توی فایل index.php سایتتون این کد رو بگذارین:

define('ROOT', preg_replace('#\\\\#', '/', __DIR__));
و از این به بعد مسیرها رو اینطوری بدین:


require_once ROOT.'/lib/functions.php';
showHeader();
$file = fopen(ROOT.'/inc/soroushamar.txt', 'r');
while(!feof($file)) {
echo '<p>'.fgets($file).'</p>'.PHP_EOL;
}
fclose($file);
showFooter();

امیدوارم خوب توضیح داده باشم. موفق باشید.

soroush.r70
شنبه 03 تیر 1391, 08:37 صبح
این کدهای منه

////////////////////////////////////نمایش تعداد بازدید کل////////////
$fh=fopen('inc/soroushamar.txt', 'r+b');
flock($fh, LOCK_EX);
list($total, $timestamp) = explode("\n", fread($fh, 2000));
$total = (int)$total + 1;
$today_date = getdate();
$last_date = getdate((int)$timestamp);
if( $today_date['yday'] == $last_date['yday'])
{
$today = (int)$today +1;
}
else
{
$total++;
}
$timestamp = time();
ftruncate($fh, 0);
fseek($fh, 0);
fwrite($fh, $total."\n".$timestamp );
flock($fh, LOCK_UN);
fclose($fh);
/////////////////////////////کاربران آنلاین/////////////////////////////////////////
$config = array(
user_time => time(),
user_ip => $_SERVER['REMOTE_ADDR'],
file_name => 'inc/users.txt'
);
$new_line = $config['user_ip'] . "|" . $config['user_time'] . "\r\n";
file_put_contents($config['file_name'], $new_line); //Write File
$online_file = file_get_contents($config['file_name']);
$online_file = explode("\r\n", $online_file);
foreach($online_file as $online_users)
{
$users = explode("|", $online_users);
if($users[1] >= time() - 300)
{
$online++;
}
}

ayub_coder
شنبه 03 تیر 1391, 09:01 صبح
اما کد فوق درست کار نخواهد کرد چون بعد از فراخوانی تابع showHeader، مسیر کاری جاری (Current Working Directory) به lib تغییر خواهد کرد و درنتیجه دستور fopen دنبال فایل soroushamar.txt توی مسیر lib/inc میگرده نه inc پوشه root سایت!

آیا این فقط برای require صدق میکنه؟ یا برای include_once هم به همین شکله؟