trad Δημοσ. 23 Ιουλίου 2004 Δημοσ. 23 Ιουλίου 2004 Γειά χαρά σε όλους. Έχω ένα site στο οποίο όταν ο χρήστης φεύγει απ΄αυτό θέλω να διαγράφεται ένας πίνακας στη MySQL. Γι' αυτό χρησιμοποιώ την onUnload της javascript έτσι ώστε, καρατχίν, να έχω έναν έλεγχο πάνω στο event της στιγμής αποχώρησης του χρήστη απο το site. Αυτό το οποίο πρέπει να ακολουθήσει όταν συμβεί το onUnload είναι το άδειασμα του πίνακα. Φυσικά ότι είναι να γίνει θα πρέπει να γίνει μέσα απο την javascript αφού αυτή "συλλαμβάνει" το onUnload και άρα αυτή μπορεί να διαχειριστεί το event. Εγώ προσωπικά βλέπω 3 εναλλακτικές: 1. Να αδειάσει τον πίνακα η ίδια η javascript κάτι το οποίο νομίζω ότι δεν γίνεται αφού η javascript είναι client-side και πως διάολο θα έχει access στη βάση του server μου? 2. Να φωνάζει ένα php script να κάνει τη δουλειά, αλλά, και πάλι, πως μπορεί να γίνει αυτό αφού η ίδια είναι client-side και η php server-side 3. Σε συνέχεια απο το 2 τη μόνη λύση που βλέπω είναι να καλεί ένα url, περνώντας μια μεταβλητή (πχ http://mydomain/execute?name=<?php echo $name; ?>), στον server όπου θα εκτελείται όντως ένα php script και θα διαφράφει τον πίνακα `$name`. Με δεδομένο ότι το συμβάν εκτελείται στο onUnload της σελίδας μου, που σημαίνει ότι εκτελείται όταν ο χρήστης έχει δόσει εντολή στον browser του να πάει σε κάποια άλλη διεύθυνση ή να κλείσει, και ότι με την τρίτη λύση στην ουσία χρησιμοποιώ URL, 1. δεν θέλω να ανοίξει κάποιο παράθυρο, 2. δεν θέλω ο χρήστης να καταλάβει τι έγινε και 3. δεν θέλω να διακοπεί η πορέια του web browser του χρήστη προς τη νέα σελίδα που θέλει να πάει Περιμένω σχόλια, προτάσεις, διορθώσεις, μπινελίκια, ότιδηποτε νομίζετε ότι μπορεί να βοηθήσουν. Ευχαριστώ εκ των προτέρων
galanta Δημοσ. 24 Ιουλίου 2004 Δημοσ. 24 Ιουλίου 2004 Φίλε θα ήθελα να σκεφτώ κάποια λύση, γι' αυτό πες μου, όταν εννοείς να φεύγει από το site εννοείς να φεύγει από κάποια συγκεκριμένη ιστοσελίδα ή γενικά από οποιαδήποτε ιστοσελίδα του site. Ρωτώ αυτό διότι η unload τρέχει για συγκεκριμένη ιστοσελίδα και όχι για site. Αν θες διευκρίνησε αυτό και θα προσπαθήσω να σε βοηθήσω.
trad Δημοσ. 24 Ιουλίου 2004 Μέλος Δημοσ. 24 Ιουλίου 2004 Το ξέρω αυτό που λες galanta. Γενικά η onUnload εκτελείται όταν ο χρήστης πατήσει Refresh, back, forward, αλλάξει σελίδα (γενικά) ή κλείσει τον browser. Εγώ για να αποφύγω όοοοοοοολα αυτά "έπαιξα" με frames. Έβαλα ένα σταθερό frame επάνω-επάνω στη σελίδα μου και εκεί έβαλα το onUnload. Με αυτό τον τρόπο περιόρισα τις περιπτώσεις στις οποίες καλείται η onUnload μόνο στο όταν φύγει απο το domain μου, όταν κλείσει το παράθυρο και όταν κάνει refresh. Η φύση της εφαρμογής είναι τέτοια που αυτός ο τρόπος λειτουργίας με βολεύει πολύ καλά. Το μόνο που μένει τώρα είναι να καταφέρω να αδειάσω τον πίνακα στο onUnload.
galanta Δημοσ. 24 Ιουλίου 2004 Δημοσ. 24 Ιουλίου 2004 Γιατί δεν το κάνεις μέσω της PHP με τη χρήση sessions και cookies? Σε κάθε επισκέπτη ανοίγεις ένα session και δίνεις μια τιμή σε μια super global μεταβλητή, την οποία ελέγχεις στο καπάκι με ένα if. Αν έχει τιμή τότε προχωράς κανονικά, αν δεν έχει σβήνεις τον πίνακα που θες. π.χ > session_start(); if (!isset($_SESSION['visiting'])) { // αν ο επισκέπτης είναι νέος, άρα η μεταβλητή δεν έχει οριστεί ακόμη mysql_query("delete from table"); //σβήσε τα περιεχόμενα του πίνακα $_SESSION['visiting'] = "1"; // ο επισκέπτης θα είναι "παλιός" από εδώ και πέρα } else { // αν ο επισκέπτης συνεχίζει στο site the_rest_of_the_page(); //η υπόλοιπη σελίδα } Με τον τρόπο αυτό θα διαγράφεις τον πίνακα με κάθε νέα επίσκεψη αντί να τον διαγράφεις με το τέλος κάθε επίσκεψης. Δεν ξέρω αν σε εξυπηρετεί αυτό, πάντως μέσω javascript θα έχεις το πρόβλημα ότι πιθανόν να σβήνεις τον πίνακα ενώ έχει αρχίσει να γράφει κάποιος άλλος. Για να γίνει με Javascript και το unload, δεν το βλέπω πώς, εκτός αν ανοίξεις ένα παραθυράκι με κλήση php script που θα κλείνει αυτόματα σε 1 δευτερόλεπτο.
trad Δημοσ. 26 Ιουλίου 2004 Μέλος Δημοσ. 26 Ιουλίου 2004 Δεν είναι ακριβώς αυτό που θέλω αλλά δεν είναι άσχημη ιδέα. Με λίγο customization πάνω στην πρότασή σου κάτι μπορώ να καταφέρω. Thanks!
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.