php current url και επιλογή γλώσσας

Σε αυτή την περιοχή μπορείτε να βρείτε ή να αναζητήσετε πληροφορίες σχετικές με την PHP

Συντονιστές: WebDev Moderators, Super-Moderators, PHP Moderators

Απάντηση
Άβαταρ μέλους
Khronos
Δημοσιεύσεις: 754
Εγγραφή: 11 Δεκ 2006 14:43
Τοποθεσία: Ηράκλειο

php current url και επιλογή γλώσσας

Δημοσίευση από Khronos » 14 Οκτ 2009 18:57

Πώς μπορώ να πάρω το current url της μορφής

Κώδικας: Επιλογή όλων

index.php?page=1&langid=1
και να αφαιρέσω το langid=1 έτσι ώστε αν κάποιος πατήσει το κουμπί της άλλης γλώσσας να μην προκύψει url της μορφής

Κώδικας: Επιλογή όλων

index.php?page=1&langid=1&langid=2

Άβαταρ μέλους
vassilism
Δημοσιεύσεις: 1952
Εγγραφή: 17 Μαρ 2007 14:47
Επικοινωνία:

php current url και επιλογή γλώσσας

Δημοσίευση από vassilism » 14 Οκτ 2009 19:29

Απλά κράτα την επιλεγμένη γλώσσα σε μια session και δεν θα έχεις κανένα πρόβλημα.

Άβαταρ μέλους
Khronos
Δημοσιεύσεις: 754
Εγγραφή: 11 Δεκ 2006 14:43
Τοποθεσία: Ηράκλειο

php current url και επιλογή γλώσσας

Δημοσίευση από Khronos » 14 Οκτ 2009 20:45

Μάλλον δεν το διατύπωσα σωστά. Τα λινκ των γλωσσών δημιουργούνται δυναμικά κάπως έτσι.

Κώδικας: Επιλογή όλων

function curPageURL() {
	$pageURL = 'http';
	$pageURL .= "://";
	if ($_SERVER["SERVER_PORT"] != "80") {
		$pageURL .= $_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"];
	} 
	else {
		$pageURL .= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
	}
	
	return $pageURL;
}

$lang_html .= '<a href=' . curPageURL&#40;&#41; . '&langid=' . $row&#91;'id'&#93; . '><img src="template_images/flag_' . $row&#91;'locale'&#93; .'.png" /></a>';
Ετσι αν κάποιος πατήσει το ενα λινκ, θα δημιουργηθεί ένα url της μορφής index.php?page=1&langid=1. Αν πατήσει αμέσως το άλλο λινκ θα δημιουργηθεί url της μορφής index.php?page=1&langid=1&langid=2 που θέλω να αποφύγω.

Το id της γλώσσας το κρατάω στο session αλλά δεν καταλαβαίνω πώς θα με βοηθήσει σε αυτό το πρόβλημα.

Ελπίζω να έγινα κατανοητός! :P

Άβαταρ μέλους
korgr
Honorary Member
Δημοσιεύσεις: 5067
Εγγραφή: 07 Οκτ 2008 18:30
Τοποθεσία: Corinth
Επικοινωνία:

php current url και επιλογή γλώσσας

Δημοσίευση από korgr » 14 Οκτ 2009 21:05

Δοκιμασε μηπως σου δουλεψει ετσι, αλλα θα πρεπει η &langid= να ειναι παντα η τελευταια στο query string

Κώδικας: Επιλογή όλων

function curPageURL&#40;&#41; &#123;
	$pageURL = 'http';
	$pageURL .= "&#58;//";
	if &#40;$_SERVER&#91;"SERVER_PORT"&#93; != "80"&#41; &#123;
		$pageURL .= $_SERVER&#91;"SERVER_NAME"&#93;."&#58;".$_SERVER&#91;"SERVER_PORT"&#93;.$_SERVER&#91;"REQUEST_URI"&#93;;
	&#125; 
	else &#123;
		$pageURL .= $_SERVER&#91;"SERVER_NAME"&#93;.$_SERVER&#91;"REQUEST_URI"&#93;;
	&#125;
$pageURL=substr&#40;$pageURL, 0, strlen&#40;$pageURL&#41;-9&#41;;	// remove &langid=someValue
	return $pageURL;
&#125;

$lang_html .= '<a href=' . curPageURL&#40;&#41; . '&langid=' . $row&#91;'id'&#93; . '><img src="template_images/flag_' . $row&#91;'locale'&#93; .'.png" /></a>';

Άβαταρ μέλους
Khronos
Δημοσιεύσεις: 754
Εγγραφή: 11 Δεκ 2006 14:43
Τοποθεσία: Ηράκλειο

php current url και επιλογή γλώσσας

Δημοσίευση από Khronos » 14 Οκτ 2009 21:11

Ετσι παίζει αν υπάρχει ΠΑΝΤΑ στο query string το langid. Στην περίπτωση που το url είναι index.php... δεν παίζει.

Άβαταρ μέλους
korgr
Honorary Member
Δημοσιεύσεις: 5067
Εγγραφή: 07 Οκτ 2008 18:30
Τοποθεσία: Corinth
Επικοινωνία:

php current url και επιλογή γλώσσας

Δημοσίευση από korgr » 14 Οκτ 2009 21:13

Κώδικας: Επιλογή όλων

if&#40;eregi&#40;"&langid=", $pageURL&#41;&#123;
$pageURL=substr&#40;$pageURL, 0, strlen&#40;$pageURL&#41;-9&#41;;   // remove &langid=someValue 
&#125;

Άβαταρ μέλους
Khronos
Δημοσιεύσεις: 754
Εγγραφή: 11 Δεκ 2006 14:43
Τοποθεσία: Ηράκλειο

php current url και επιλογή γλώσσας

Δημοσίευση από Khronos » 14 Οκτ 2009 21:17

Απότι είδα h eregi ειναι deprecated στην 5.3 οπότε το έκανα έτσι.

Κώδικας: Επιλογή όλων

if&#40;isset&#40;$_GET&#91;'langid'&#93;&#41;&#41; &#123;
		$pageURL = substr&#40;$pageURL, 0, strlen&#40;$pageURL&#41;-9&#41;;   // remove &langid=someValue 
	&#125;
Υπάρχει πιο σωστός τρόπος ή ειναι εντάξει αυτό?

Ευχαριστώ!

Άβαταρ μέλους
vassilism
Δημοσιεύσεις: 1952
Εγγραφή: 17 Μαρ 2007 14:47
Επικοινωνία:

php current url και επιλογή γλώσσας

Δημοσίευση από vassilism » 14 Οκτ 2009 21:32

Γιατί κρατάς όλο το path στο link?
Έχεις δοκιμάσει να κρατάς σε μια session το langid και στο link να του δίνεις μόνο τη session?

Άβαταρ μέλους
korgr
Honorary Member
Δημοσιεύσεις: 5067
Εγγραφή: 07 Οκτ 2008 18:30
Τοποθεσία: Corinth
Επικοινωνία:

php current url και επιλογή γλώσσας

Δημοσίευση από korgr » 14 Οκτ 2009 21:35

Khronos έγραψε:Απότι είδα h eregi ειναι deprecated στην 5.3 οπότε το έκανα έτσι.

Κώδικας: Επιλογή όλων

if&#40;isset&#40;$_GET&#91;'langid'&#93;&#41;&#41; &#123;
		$pageURL = substr&#40;$pageURL, 0, strlen&#40;$pageURL&#41;-9&#41;;   // remove &langid=someValue 
	&#125;
Υπάρχει πιο σωστός τρόπος ή ειναι εντάξει αυτό?

Ευχαριστώ!
και να μην ηταν deprecated η δικη σου λυση ειναι καλυτερη :D

Άβαταρ μέλους
Khronos
Δημοσιεύσεις: 754
Εγγραφή: 11 Δεκ 2006 14:43
Τοποθεσία: Ηράκλειο

php current url και επιλογή γλώσσας

Δημοσίευση από Khronos » 14 Οκτ 2009 21:45

vassilism έγραψε:Γιατί κρατάς όλο το path στο link?
Έχεις δοκιμάσει να κρατάς σε μια session το langid και στο link να του δίνεις μόνο τη session?
Το έχω στο session το langid αλλά είναι το current langid. Δεν μπορώ να ξέρω τι id έχει η γλώσσα που θα πατήσει ο χρήστης. Το ξέρω αφού πάρω το $_GET['langid'] με το λινκ.

nbc
Honorary Member
Δημοσιεύσεις: 526
Εγγραφή: 05 Σεπ 2009 20:12
Επικοινωνία:

php current url και επιλογή γλώσσας

Δημοσίευση από nbc » 14 Οκτ 2009 23:03

if(isset($_GET['langid'])) {
$pageURL = substr($pageURL, 0, strlen($pageURL)-9); // remove &langid=someValue
}
Ελπίζω να μου συγχωρέσεις ένα ...ακαδημαϊκού χαρακτήρα σχολιασμό :)

Tο παραπάνω snippet έχει τις εξής (προφανείς) προυποθέσεις για να λειτουργήσει:

- Το langid είναι στο τέλος του url
- Το id είναι μονοψήφιος αριθμός
- Προηγείται άλλη μεταβλητή
- Το Url αποτελείται από single byte χαρακτήρες

Νομίζω ότι είναι πολλά τα assumptions, και πολύ εύκολα μπορούν να δημιουργήσουν πρόβλημα.

Επιπροσθέτως, η σταθερά 9, ανήκει σε μια evil προγραμματιστική πρακτική, γνωστής και ως "magic numbers". Είναι αυτοί οι αριθμοί που εμφανίζονται στον κώδικα από το πουθενά.

Αν επιμένεις σε αυτήν την προσέγγιση, τότε το strlen δεν χρειάζεται, καθώς το -9 από μόνο του αρκεί. Η συνάρτηση θα αφαιρέσει 9 bytes από το τέλος - που είναι και το ζητούμενο. Στην προκείμενη περίπτωση δεν σε ενδιαφέρει το μήκος του url.


Παρένθεση: Η ενδεδειγμένη χρήση του strlen, για input strings σε περιβάλλον utf-8 είναι

Κώδικας: Επιλογή όλων

strlen&#40;utf8_decode&#40;$pageURL&#41;&#41;

Η κατά τη γνώμη μου ασφαλέστερη λύση στο πρόβλημα που σε απασχολεί είναι να διαλύσεις το url στα εξ ων συνετέθη, να αφαιρέσεις το langid και να το επανασυνθέσεις.
Κάτι σαν κι αυτό:

Κώδικας: Επιλογή όλων

$URL = parse_url&#40;$pageURL&#41;;
parse_str&#40;@$URL&#91;'query'&#93;, $GET&#41;;
unset&#40;$GET&#91;'langid'&#93;&#41;;
if &#40;count&#40;$GET&#41;&#41;
    $pageURL = $URL&#91;'path'&#93;.'?'.http_build_query&#40;$GET&#41;;
else
    $pageURL = $URL&#91;'path'&#93;;

Με την ευκαιρία θα ήθελα να προσθέσω πως και ο χειρισμός του port επικοινωνίας έχει περιθώρια σφάλματος. Αν για παράδειγμα το script λειτουργήσει σε περιβάλλον https, τότε το port θα είναι διάφορο του 80 (συνήθως 443) και η συνάρτηση curPageURL() θα σχηματίσει προβληματικό url.

Άβαταρ μέλους
Khronos
Δημοσιεύσεις: 754
Εγγραφή: 11 Δεκ 2006 14:43
Τοποθεσία: Ηράκλειο

php current url και επιλογή γλώσσας

Δημοσίευση από Khronos » 14 Οκτ 2009 23:39

nbc μας τα εξήγησες πολύ ωραία πιστεύω!
Έχεις να προτείνεις κάτι και για το πρόβλημα του https?

ps. Απο το parse_str(@$URL['query'], $GET); αφαίρεσα το '@' και παίζει μια χαρά. Για ποιο λόγο το έβαλες εκεί?

edit:το βρήκα :P
Notice: Undefined index: query

nbc
Honorary Member
Δημοσιεύσεις: 526
Εγγραφή: 05 Σεπ 2009 20:12
Επικοινωνία:

php current url και επιλογή γλώσσας

Δημοσίευση από nbc » 15 Οκτ 2009 00:06

Η εύρεση του πρωτοκόλλου είναι όντως tricky. Δεν υπάρχει universal μέθοδος.

Αυτό που χρησιμοποιώ στα δικά μου scripts, και μέχρι στιγμής δεν έχω πρόβλημα με Apache και IIS, είναι:

$proto = (empty($_SERVER['HTTPS']) || $_SERVER['HTTPS'] == 'off') ? 'http' : 'https';

Άβαταρ μέλους
Khronos
Δημοσιεύσεις: 754
Εγγραφή: 11 Δεκ 2006 14:43
Τοποθεσία: Ηράκλειο

php current url και επιλογή γλώσσας

Δημοσίευση από Khronos » 15 Οκτ 2009 00:53

Σας ευχαριστώ όλους για τη βοήθεια!

Άβαταρ μέλους
korgr
Honorary Member
Δημοσιεύσεις: 5067
Εγγραφή: 07 Οκτ 2008 18:30
Τοποθεσία: Corinth
Επικοινωνία:

php current url και επιλογή γλώσσας

Δημοσίευση από korgr » 15 Οκτ 2009 10:51

Ενδιαφερουσα αντιμετωπιση nbc, ευχαριστουμε :D

Απάντηση

Επιστροφή στο “PHP Προγραμματισμός”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 1 επισκέπτης