سرمایه گذاری متفاوت در سال نو 🍎🌱 ۳۵٪ تخفیف نوروزی ➕ حضور رایگان در مسترمایند نخبگان صنعت نرم‌افزار 💻✅
۰ ثانیه
۰ دقیقه
۰ ساعت
۳ منصور لیاقت
عدم نمایش متغیر
جامعه پی اچ پی ایجاد شده در ۳۰ خرداد ۱۴۰۳

با سلام و احترام

 

بنده یک دایرکتوری دارم به نام libs که داخلش یک فایل به نام func.php دارم که محتویاتش شامل :

<?php
function getFolders()
{
    global $dbconnection;
//var_dump($dbconnection);
    $sql = "select * from folders";
    $stmt = $dbconnection->prepare($sql);
    $stmt->execute();
    $folders = $stmt->fetchAll(PDO::FETCH_OBJ);
    return $folders;
}

 

 

و یک دایرکتوری دیگر به نام bootstrap دارم که داخلش یک فایل به نام init.php دارم که محتویاتش شامل :

<?php
include_once "constants.php";
include_once "config.php";
include_once "../vendor/autoload.php";
try {
    $dbconnection = new PDO("mysql:host=$host;dbname=$database", $user, $pass);
//    echo "coonetion successfully";
} catch (PDOException $e) {
    print "Error!: " . $e->getMessage() . "<br/>";
    die();
}
include "../libs/func.php";

 

 

و در روت پروژه فایل index.php دارم که محتویاتش شامل :

<?php
include "bootstrap/init.php";       فایل اینیت را اینکلود کردم و داخل فایل اینیت فایل فانک اینکلود شده است
include "views/home.php";
$folders = getFolders();
print_r($folders);

 

 

سوال : زمانی که فایل index.php را در مرورگر اجرا میکنم متغیر $folders خروجی نمیدهد 
و زمانی که فایل index.php را در محیط phpStorm اجرا میکنم خطا زیر را میدهد :
PHP Fatal error:  Uncaught Error: Call to undefined function getFolders() in /home/mansour/PhpstormProjects/task_manager/index.php:6

به نظر مسیردهی فایل هایی که اینکلود کردم صحیح است

و در پایان عرض کنم زمانی که فایل include "libs/func.php"; را در فایل index.php اینکلود میکنم همه چیز کار میکند
اما در تعجبم چرا زمانی که فایل init.php در فایل index.php اینکلود شده است 
و داخل فایل init.php فایل func.php اینکلود شده است کار نمیکند

درود آقای لیاقت عزیز

به نظر می‌رسه مشکل اصلی به نحوه دسترسی به متغیر $dbconnection در فایل func.php و همچنین ترتیب اینکلود کردن فایل‌ها برمی‌گرده.

 برای رفع این مشکل، چند نکته رو با هم بررسی می‌کنیم:

  1. متغیر $dbconnection به صورت global در تابع getFolders تعریف شده.=>  بهتره که متغیر $dbconnection رو به صورت پارامتر به تابع getFolders بدید.
  2. ترتیب اینکلود کردن فایل‌ها رو بررسی کنید. باید مطمئن بشید که فایل‌ها به درستی و به ترتیب صحیح اینکلود شدن.
  3. فایل func.php:
  4. prepare($sql);
       $stmt->execute();
       $folders = $stmt->fetchAll(PDO::FETCH_OBJ);
       return $folders;
    }
  5. فایل init.php:
  6. getMessage() . "
    "; die(); } include "../libs/func.php";
  7. فایل index.php:
  8. تو این اصلاحات، متغیر $dbconnection به صورت پارامتر به تابع getFolders داده میشه تا مشکلی در دسترسی بهش پیش نیاد. همچنین اطمینان حاصل می‌کنیم که فایل‌ها به درستی اینکلود شدن.

 

موفق باشید

 

محمدرسول اصغری ۳۱ خرداد ۱۴۰۳، ۱۱:۳۷

درود بر شما ،
مواردی را که فرمودید اعمال گردید ، متاسفانه درست نشد و موقتا خود فایل func را داخل فایل index اینکلود کردم تا مشکل حل شود و به ادامه دروس برسم
متشکر از شما

منصور لیاقت ۰۱ تیر ۱۴۰۳، ۰۹:۵۹

کدتون رو در پیوست یا در گیت هاب  قرار بدید براتون بررسی میکنم

محمدرسول اصغری ۰۱ تیر ۱۴۰۳، ۱۴:۳۳