Evangeli Δημοσ. 24 Μαρτίου 2010 Δημοσ. 24 Μαρτίου 2010 Fatal error: Call to undefined function check_admin_user() in C:\xampp\htdocs\something\admin\login.php on line 8 Καλησπέρα σε όλους. Δεν είμαι πολύ άσχετος με την PHP αλλά υπάρχουν μερικά βασικά ζητήματα που με απασχολούν ακόμα και όσο κι αν έχω προσπαθήσει δεν έχω βρει λύση. Λοιπόν, ενώ μέχρι πρόσφατα είχα όλα τα αρχεία ενός project "χύμα" στο root directory, τώρα αποφάσισα να τα οργανώσω λίγο. Έτσι, σελίδες όμως το intex.php βρίσκονται τώρα στο root ενώ σελίδες όπως η login.php βρίσκονται κάνω από το direstory admin\ Επίσης έχω ένα αρχείο (soures\fns.php) στο οποίο κάνω include_once('...') διάφορα άλλα χρήσιμα αρχεία με συναρτήσεις της php. Αυτή την στιγμή δεν δουλεύει σχεδόν τίποτα και ο λόγος οφείλεται στα relative paths. Και αυτό γιατί ενώ για να δουλέψει η index.php θα πρέπει τα relative paths να έχουν την τιμές της μορφής include_once('\sources\data.valid.fns.php'); ενώ για να δουλέψει το admin\logni.php θα πρέπει τα ορίσματα να είναι της μορφής include_once('...\sources\data.valid.fns.php'); πράγμα που δεν μπορεί να γίνει ταυτόχρονα... Είμαι μπλεγμένος... Καμία ιδέα;
isay Δημοσ. 24 Μαρτίου 2010 Δημοσ. 24 Μαρτίου 2010 Fatal error: Call to undefined function check_admin_user() in C:\xampp\htdocs\something\admin\login.php on line 8 Καλησπέρα σε όλους. Δεν είμαι πολύ άσχετος με την PHP αλλά υπάρχουν μερικά βασικά ζητήματα που με απασχολούν ακόμα και όσο κι αν έχω προσπαθήσει δεν έχω βρει λύση. Λοιπόν, ενώ μέχρι πρόσφατα είχα όλα τα αρχεία ενός project "χύμα" στο root directory, τώρα αποφάσισα να τα οργανώσω λίγο. Έτσι, σελίδες όμως το intex.php βρίσκονται τώρα στο root ενώ σελίδες όπως η login.php βρίσκονται κάνω από το direstory admin\ Επίσης έχω ένα αρχείο (soures\fns.php) στο οποίο κάνω include_once('...') διάφορα άλλα χρήσιμα αρχεία με συναρτήσεις της php. Αυτή την στιγμή δεν δουλεύει σχεδόν τίποτα και ο λόγος οφείλεται στα relative paths. Και αυτό γιατί ενώ για να δουλέψει η index.php θα πρέπει τα relative paths να έχουν την τιμές της μορφής include_once('\sources\data.valid.fns.php'); ενώ για να δουλέψει το admin\logni.php θα πρέπει τα ορίσματα να είναι της μορφής include_once('...\sources\data.valid.fns.php'); πράγμα που δεν μπορεί να γίνει ταυτόχρονα... Είμαι μπλεγμένος... Καμία ιδέα; Δεν έχω καταλάβει που είναι το πρόβλημα σου. Μόνος σου έχεις γράψει τη λύση. Στη σελίδα index.php κάνε >include_once('\sources\data.valid.fns.php'); αν και θα προτιμούσα το >include_once('.\sources\data.valid.fns.php'); (με την τελεία) ενώ για τη σελίδα admin/login.php κάνε >include_once('...\sources\data.valid.fns.php'); απο τη στιγμή που είναι δυο διαφορετικές σελίδες, δεν καταλαβαίνω το πρόβλημα. Μήπως κάτι άλλο "χτυπάει" και νομίζεις ότι εκεί είναι το πρόβλημα; κώδικα php να τον βάζεις στο ανάλογο tag. Διαβάζεται πιο εύκολα.
Evangeli Δημοσ. 24 Μαρτίου 2010 Μέλος Δημοσ. 24 Μαρτίου 2010 Ξέχασα να αναφέρω μια σημαντική λεπτομέρεια: ότι το αρχείο που κάνω include ουσιαστικά κάνει και αυτό με την σειρά του include πολλά επιμέρους αρχεία. Άρα όπως καταλαβαίνετε, ακόμα και αν το κάνω όπως το λέμε, οι αναφορές που υπάρχουν μέσα στο τελευταίο δεν θα λειτουργούν είτε για τα αρχεία root είτε για τα αρχεία του admin\ Επομένως, η λύση που σκεφτικά είναι: κάνω 2 εκδόσεις των αρχείων που περιέχουν αναφορές. (ελπίζω να καταλάβατε τι εννοώ όπως τα λέω ). Η ερώτηση μου τώρα είναι: ενδείκνυται η λύση; Μήπως είναι λίγο μπακαλίστικη; Έχετε καμία άλλη ιδέα; Τέλος, πια είναι η διαφορά των παρακάτω συναρτήσεων και πότε να προτιμώ την μία έναντι των υπολοίπων; >include include_once require require_once
isay Δημοσ. 25 Μαρτίου 2010 Δημοσ. 25 Μαρτίου 2010 Ξέχασα να αναφέρω μια σημαντική λεπτομέρεια: ότι το αρχείο που κάνω include ουσιαστικά κάνει και αυτό με την σειρά του include πολλά επιμέρους αρχεία. Άρα όπως καταλαβαίνετε, ακόμα και αν το κάνω όπως το λέμε, οι αναφορές που υπάρχουν μέσα στο τελευταίο δεν θα λειτουργούν είτε για τα αρχεία root είτε για τα αρχεία του admin\Επομένως, η λύση που σκεφτικά είναι: κάνω 2 εκδόσεις των αρχείων που περιέχουν αναφορές. (ελπίζω να καταλάβατε τι εννοώ όπως τα λέω ). Η ερώτηση μου τώρα είναι: ενδείκνυται η λύση; Μήπως είναι λίγο μπακαλίστικη; Έχετε καμία άλλη ιδέα; Ένα ένα μας τα λες. Όχι να μην κάνεις δυο εκδόσεις για λόγους εύκολης συντήρησης και γρήγορης ανίχνευσης λαθών. Δυο λύσεις σκέφτομαι. Πρώτη είναι να ασχοληθείς με absolute paths και τη μεταβλητή να την βάλεις σε ένα συγκεκριμένο conf αρχείο. Δεύτερη λύση είναι να σκαλίσεις όλα τα αρχεία και να φτιάξεις τα paths (μόνα τους δε φτιάχνονται δυστυχώς). Βασικά το πρόβλημα σου είναι ότι δεν έκανες ορθή μελέτη για τη δομή του site σου και τις θέσεις των αρχείων, πριν αρχίσεις να το φτιάχνεις. Όταν χτίζεις ένα σπίτι, πρώτα φτιάχνεις τα σχέδια και μετά χτίζεις, σωστά; ...Τέλος, πια είναι η διαφορά των παρακάτω συναρτήσεων και πότε να προτιμώ την μία έναντι των υπολοίπων; >include include_once require require_once Για να μην τα γράφουμε πάλι http://forums.sureshkumar.net/perl-python-mysql-interview-technical-questions/16666-php-difference-between-require_once-require-include.html#post95698 http://www.techiecorner.com/38/php-programming-the-difference-between-require-and-include/
poscaman Δημοσ. 25 Μαρτίου 2010 Δημοσ. 25 Μαρτίου 2010 The include_once() statement includes and evaluates the specified file during the execution of the script. This is a behavior similar to the include() statement, with the only difference being that if the code from a file has already been included, it will not be included again. As the name suggests, it will be included just once. Difference between require() and require_once(): require() includes and evaluates a specific file while require_once() does that only if it has not been included before (on the same page).So require_once() is recommended to use when you want to include a file where you have a lot of functions for example. This way you make sure you don't include the file more times and you will not get the function re-declared error. Difference between require() and include() is that require() produces a FATAL ERROR if the file you want to include is not found while include() only produces a WARNING. There is also include_once() which is the same as include() but the difference between them is the same as the difference between require() and require_once(). πηγήΕΛΛΗΝΙΚΑ edit:με πρόλαβε ο isay
Evangeli Δημοσ. 25 Μαρτίου 2010 Μέλος Δημοσ. 25 Μαρτίου 2010 Καλημέρα και Χρόνια Πολλά σε εορτάζοντες και μη! Ευχαριστώ για τις απαντήσεις σας αλλά νομίζω πως δεν έχω κάνει ακόμα αντιληπτή την δομή (σκελετό) της εφαρμογής. Αν δεν είναι δομημένη και εύκολα συντηρήσιμη τώρα πόσο μάλλον πριν... Οι δυο εκδόσεις για τις οποίες μίλησα δεν αφορούν (προφανώς) αρχεία όπως index.php και admin\login.php αλλά ένα (και μόνο) άλλο πολύ νευραλγικό αρχείο: εκείνο που γίνεται include από σχεδόν όλες τις άλλες σελίδες και ουσιαστικά περιέχει 5-6 γραμμές ήτοι 5-6 include βασικών αρχείων με την έννοια ότι σε αυτά περιέχονται αποκλειστικά συναρτήσεις... (έστω fns.1.php και fns.2.php) Ελπίζω να έγινα αντιληπτός τώρα. Πάντως με τις δυο εκδόσεις αρχείων (τα οποία ξανά λεω περιέχουν μόνο 5,6 γραμμές άρα διαχειρίζονται σχετικά εύκολα) όλα δείχνουν πως δουλεύουν καλά τώρα. Απλά αναρωτιέμαι μήπως υπάρχει κάποια καλύτερη λύση... Όσο για το άλλο ερώτημα μου: Έστω ότι χρησιμοποιώ πλέων μόνο την require_once() όντας ο πιο strict περιορισμός. Μήπως όμως αυτό έχει ως αποτέλεσμα μεγαλύτερη καθυστέρηση στον χρόνο εκτέλεσης του συστήματος;
Σαρμης Δημοσ. 25 Μαρτίου 2010 Δημοσ. 25 Μαρτίου 2010 Γιατί δεν αφήνεις τα path να είναι relative; Από την στιγμή που στο Index.php κάνεις include ή request, τότε από τον root folder είναι το Index.php θα ψάχνει τα paths. Όχι από τον φάκελο στον οποίον έχεις βάλει το include file. Βασικά νομίζω πως το θέμα είναι κατα την αποψή μου, για λόγους ασφαλείας οι απλές σελίδες είναι διαφορετικές απο τις admin σελίδες. ΠΡΕΠΕΙ να τραβάνε διαφορετικά αρχεία. Αν το login σου δεν είναι για admin λειτουργίες, μην φτιάξεις φάκελο admin. Αυτά θα σου πρότεινα.. Αν βέβαια θέλεις απλά μια λύση, δημιούργησε σε μια μεταβλητή πχ isAdmin = true όταν θα ζητάς το include file να βλέπει την μεταβλητή και διαλέγει την αντίστοιχη include. (ακόμα καφέ πίνω δικαιολογήστε τα λαθάκια )
ΠάρηςΓ Δημοσ. 25 Μαρτίου 2010 Δημοσ. 25 Μαρτίου 2010 Η καλυτερη λυση ειναι absolutε path εαν δε μπορεις να βγάλεις ακρη..
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.