Redirect - URL forwarding

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

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

Απάντηση
Άβαταρ μέλους
giannis19
Δημοσιεύσεις: 38
Εγγραφή: 11 Ιουν 2006 14:12
Τοποθεσία: London, UK

Redirect - URL forwarding

Δημοσίευση από giannis19 » 25 Ιουν 2008 00:13

Είμαι νέος στην php και η απορία μου πιθανότατα αστεία γι'αυτό συγχωρέστε με:P

Λοιπόν...
Σε μια βάση έχω το ακόλουθω script που διαγράφει ένα χρήστη.

Η απορία μου είναι η εξής. Πώς μπορώ, αφού ολοκληρωθεί η διαγραφή, αυτώματα να ανοίγει μια άλλη σελίδα.

Παράδειγμα: έχω μια σελίδα με πίνακα χρηστών και επιλογή διαγραφής ξεχωριστά για κάθε χρήστη. Πατώ "Διαγραφή", διαγράφετε ο χρήστης και ξανά φορτώνετε ο πίνακας.

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

<?php     
session_start&#40;&#41;;
if &#40;!isset&#40;$_GET&#91;'email'&#93;&#41; && !isset&#40;$_GET&#91;'id'&#93;&#41; &#41;
&#123;echo "error&#58; Invalid Link";
exit&#40;&#41;;&#125;

else
&#123;
require&#40;"../../dbconnect.php"&#41;;
mysql_select_db&#40;$dbname, $con&#41;; 
$sql = "DELETE FROM customers WHERE email= '$_GET&#91;email&#93;' and ID = '$_GET&#91;id&#93;'";
mysql_query&#40;$sql,$con&#41;;?>
Προσπάθησα να χρησημοποιήσω την header(Location:....); αλλά δεν λειτουργεί όταν πριν ή μετά απ'αυτήν υπάρχει script.

Τι προτείνετε?

Άβαταρ μέλους
MaZz
Script Master
Δημοσιεύσεις: 345
Εγγραφή: 20 Ιούλ 2005 19:41
Τοποθεσία: Beyond the dark sun
Επικοινωνία:

Redirect - URL forwarding

Δημοσίευση από MaZz » 25 Ιουν 2008 11:09

Βάλε το header στο τέλος του κώδικα: εκεί δηλαδή που τελειώνει η διαδικασία διαγραφής.

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

...
&#123;
require&#40;"../../dbconnect.php"&#41;;
mysql_select_db&#40;$dbname, $con&#41;;
$sql = "DELETE FROM customers WHERE email= '$_GET&#91;email&#93;' and ID = '$_GET&#91;id&#93;'";
mysql_query&#40;$sql,$con&#41;;
header&#40;"Location&#58; www.google.com"&#41; &#125;?>
If nothing in the world can change our children will inherit nothing.

alexsoft

Redirect - URL forwarding

Δημοσίευση από alexsoft » 25 Ιουν 2008 11:33

Χρησιμοποίησε την παρακάτω συνάρτηση:

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

function redirect &#40;$url&#41; 
&#123;
	if &#40;headers_sent&#40;&#41;&#41; &#123;
		echo '<script language="javascript" type="text/javascript">document.location.href="'.$url.'";</script>'."\n";
	&#125; else &#123;
		header&#40; "Location&#58; $url" &#41;;
	&#125;
	exit&#40;&#41;;
&#125;
και ....

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

else
&#123;
require&#40;"../../dbconnect.php"&#41;;
mysql_select_db&#40;$dbname, $con&#41;;
$sql = "DELETE FROM customers WHERE email= '$_GET&#91;email&#93;' and ID = '$_GET&#91;id&#93;'";
mysql_query&#40;$sql,$con&#41;;
redirect&#40;"www.alexsoft.gr"&#41;;
&#125;
?>

Άβαταρ μέλους
giannis19
Δημοσιεύσεις: 38
Εγγραφή: 11 Ιουν 2006 14:12
Τοποθεσία: London, UK

Redirect - URL forwarding

Δημοσίευση από giannis19 » 25 Ιουν 2008 13:48

ok! σας ευχαριστώ πολύ!

Άβαταρ μέλους
cpulse
Script Master
Δημοσιεύσεις: 1527
Εγγραφή: 21 Μαρ 2006 19:30
Τοποθεσία: Αθήνα village
Επικοινωνία:

Redirect - URL forwarding

Δημοσίευση από cpulse » 28 Ιουν 2008 00:31

Δεν έχει σημασία αν πριν ή μετα την εντολή header() υπάρχει άλλο script. Σημασία έχει το script να διακοπεί με exit(); Δεν πρέπει να γίνει κανονικά η ολοκλήρωση του. Το γιατί δεν το ξέρω αλλά αυτό το πρόβλημα είναι γνωστό.

Άβαταρ μέλους
MaZz
Script Master
Δημοσιεύσεις: 345
Εγγραφή: 20 Ιούλ 2005 19:41
Τοποθεσία: Beyond the dark sun
Επικοινωνία:

Redirect - URL forwarding

Δημοσίευση από MaZz » 28 Ιουν 2008 09:58

:D
If nothing in the world can change our children will inherit nothing.

alexsoft

Redirect - URL forwarding

Δημοσίευση από alexsoft » 28 Ιουν 2008 11:27

cpulse έγραψε:Δεν έχει σημασία αν πριν ή μετα την εντολή header() υπάρχει άλλο script. Σημασία έχει το script να διακοπεί με exit(); Δεν πρέπει να γίνει κανονικά η ολοκλήρωση του. Το γιατί δεν το ξέρω αλλά αυτό το πρόβλημα είναι γνωστό.
Δεν είναι πρόβλημα. Είναι πολύ σωστή λογική και απαντάται σε όλες τις γλώσσες προγραμματισμού.

Η Λογική του είναι να σταματήσει την εκτέλεση όλων των εντολών που ακολουθούν (διότι κανονικά ένα script ολοκληρώνεται όταν εκτελεστεί και η τελευταία εντολή στο αρχείο, εκτός και εάν διακοπεί), ώστε να μην παρουσιαστεί σφάλμα από αστοχία εντολών στη νέα σελίδα.

Φαντάζεσαι π.χ. να ακολουθούν εντολές εμφάνισης μιας λίστας χρηστών και μετά το redirect να εμφανιστούν αυτά σε σελίδα που δεν έχει καμία σχεση με την λίστα αυτή;

Αυτά τα προβλήματα προλαμβάνει η πρόωρη διακοπή.

Άβαταρ μέλους
MaZz
Script Master
Δημοσιεύσεις: 345
Εγγραφή: 20 Ιούλ 2005 19:41
Τοποθεσία: Beyond the dark sun
Επικοινωνία:

Redirect - URL forwarding

Δημοσίευση από MaZz » 28 Ιουν 2008 12:52

Η αλήθεια είναι ότι μετά από τη header("Location..."); είναι σωστό να ακολουθεί η exit; ώστε να διασφαλιστεί ότι δε θα εκτελεστεί ο κώδικας που ακολουθεί...
If nothing in the world can change our children will inherit nothing.

Άβαταρ μέλους
cpulse
Script Master
Δημοσιεύσεις: 1527
Εγγραφή: 21 Μαρ 2006 19:30
Τοποθεσία: Αθήνα village
Επικοινωνία:

Redirect - URL forwarding

Δημοσίευση από cpulse » 28 Ιουν 2008 13:18

alexsoft έγραψε:
cpulse έγραψε:Δεν έχει σημασία αν πριν ή μετα την εντολή header() υπάρχει άλλο script. Σημασία έχει το script να διακοπεί με exit(); Δεν πρέπει να γίνει κανονικά η ολοκλήρωση του. Το γιατί δεν το ξέρω αλλά αυτό το πρόβλημα είναι γνωστό.
Δεν είναι πρόβλημα. Είναι πολύ σωστή λογική και απαντάται σε όλες τις γλώσσες προγραμματισμού.

Η Λογική του είναι να σταματήσει την εκτέλεση όλων των εντολών που ακολουθούν (διότι κανονικά ένα script ολοκληρώνεται όταν εκτελεστεί και η τελευταία εντολή στο αρχείο, εκτός και εάν διακοπεί), ώστε να μην παρουσιαστεί σφάλμα από αστοχία εντολών στη νέα σελίδα.

Φαντάζεσαι π.χ. να ακολουθούν εντολές εμφάνισης μιας λίστας χρηστών και μετά το redirect να εμφανιστούν αυτά σε σελίδα που δεν έχει καμία σχεση με την λίστα αυτή;

Αυτά τα προβλήματα προλαμβάνει η πρόωρη διακοπή.
Όχι.. αν φτιάξεις ένα script που δεν έχει τίποτα άλλο εκτώς από μια και μόνο εντολή, την header('Location: blabla.php'); , το redirection δεν θα λειτουργήσει. Αν βάλεις και την exit(); μετά θα λειτουργήσει. Ξέρω τι γράφω.

alexsoft

Redirect - URL forwarding

Δημοσίευση από alexsoft » 28 Ιουν 2008 13:51

cpulse έγραψε:Ξέρω τι γράφω.
Και εγώ ξέρω τι γράφω και στην ουσία λέμε τα ίδια, μόνο που δεν είναι πρόβλημα αλλά σωστή δομή γλώσσας προγραμματισμού.
Είναι ακριβώς αυτό που σου λέω. Δηλαδή αποκόπτει την εκτέλεση των εντολών που ακολουθούν με αποτέλεσμα να μην ολοκληρώνεται το script και άρα να μπορεί να εκτελεστεί το redirection. Για να εκτελεστεί σωστά πρέπει η εντολή του redirection να είναι η τελευταία εκτελεσμένη του κεντρικού script. Αυτό κάνει η exit;, δημιουργεί το τέλος του script.
Σε αντίθετη περίπτωση εκτελείται ο κώδικας που ακολουθεί και αν στο τέλος του κεντρικού script δεν υπάρχει εντολή για redirection είναι πολύ φυσικό να μην γίνει redirection.

Αυτή είναι η λογική λειτουργίας του.

Άβαταρ μέλους
MaZz
Script Master
Δημοσιεύσεις: 345
Εγγραφή: 20 Ιούλ 2005 19:41
Τοποθεσία: Beyond the dark sun
Επικοινωνία:

Redirect - URL forwarding

Δημοσίευση από MaZz » 28 Ιουν 2008 17:36

alexsoft και εγώ έτσι νόμιζα στην αρχή: ότι δηλαδή δεν εκτελείται ο κώδικας που ακολουθεί μετά τη header("Location:...);. Να όμως που ισχύει το αντίθετο. Μία δοκιμή θα σε πίσει:

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

<?php
	header&#40;"Location&#58; http&#58;//www.google.com"&#41;;
	
	$fh = fopen&#40;'test', 'w'&#41;;
	fwrite&#40;$fh, $_SERVER&#91;'REMOTE_ADDR'&#93;."\n"&#41;;
	fclose&#40;$fh&#41;;
?>
Το αρχείο test δημιουργείται κανονικά... :kaloe:
If nothing in the world can change our children will inherit nothing.

Άβαταρ μέλους
cpulse
Script Master
Δημοσιεύσεις: 1527
Εγγραφή: 21 Μαρ 2006 19:30
Τοποθεσία: Αθήνα village
Επικοινωνία:

Redirect - URL forwarding

Δημοσίευση από cpulse » 28 Ιουν 2008 18:01

alexsoft αν φτιάξεις ένα ξεχωριστό αρχείο με τρείς γραμμες:

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

<?php
header&#40;'Location&#58; abc.php'&#41;;
?>
σε κάποιες περιπτώσεις ΔΕΝ θα λειτουργήσει. Μου έχει τύχει και το έχω ακούσει κι από άλλους. Δεν ξέρω αν φταίει η PHP ή οι browsers αλλά υπάρχει ένα πρόβλημα εκεί. Έκανα ένα test εδώ με PHP 5, FF3 σε Ubuntu Hardy και δουλεύει μεν, αλλά θυμάμαι παλιότερα οτι είχα προβλήματα. Για να δουλεύει πάντα βάζουμε το exit();

alexsoft

Redirect - URL forwarding

Δημοσίευση από alexsoft » 28 Ιουν 2008 20:29

MaZz έγραψε:alexsoft και εγώ έτσι νόμιζα στην αρχή: ότι δηλαδή δεν εκτελείται ο κώδικας που ακολουθεί μετά τη header("Location:...);. Να όμως που ισχύει το αντίθετο. Μία δοκιμή θα σε πίσει:

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

<?php
	header&#40;"Location&#58; http&#58;//www.google.com"&#41;;
	
	$fh = fopen&#40;'test', 'w'&#41;;
	fwrite&#40;$fh, $_SERVER&#91;'REMOTE_ADDR'&#93;."\n"&#41;;
	fclose&#40;$fh&#41;;
?>
Το αρχείο test δημιουργείται κανονικά... :kaloe:
Μα εγώ δεν είπα ότι δεν εκτελείται. Αντιθέτως είπα ότι εκτελεί όλες τις εντολές που ακολουθούν μέχρι την τελευταία γραμμή του αρχείου. Για να μην εκτελεστούν χρησιμοποιούμε την exit;

Είπα ότι σε περίπτωση που δεν βάλουμε την exit πρέπει η εντολή redirection να είναι η τελευταία.

Ίσως να μην το διατύπωσα καλά. Έπρεπε να το γράψω:
Δηλαδή η exit; αποκόπτει την εκτέλεση των εντολών που ακολουθούν με αποτέλεσμα να μην ολοκληρώνεται το script και άρα να μπορεί να εκτελεστεί το redirection

Απάντηση

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

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

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