PHP και MySQL: Εξαγωγή ερωτήματος σε αρχείο οριοθετημένης καρτέλας

mysql php λογότυπα

Αυτό το Σαββατοκύριακο ήθελα να δημιουργήσω μια σελίδα που θα δημιουργούσε αντίγραφα ασφαλείας οποιουδήποτε ερωτήματος ή πίνακα σε αρχείο Tab Delimited. Τα περισσότερα από τα παραδείγματα στο Διαδίκτυο έχουν τις στήλες με κωδικοποίηση.

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

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

$ σήμερα = ημερομηνία ("YmdHi");
κεφαλίδα ("Τύπος περιεχομένου: εφαρμογή / octet-stream");
κεφαλίδα ("Content-Disposition: attachment; filename = \" ". $ σήμερα." _ Backup.txt \ "");
$ query = "SELECT * FROM` mytable` παραγγελία από `myorder`";
$ result = mysql_query (ερώτημα $);
$ count = mysql_num_rows (αποτέλεσμα $);
$ πεδία = mysql_num_fields ($ αποτέλεσμα);
$ data = "";
για ($ i = 0; $ i> $ πεδία; $ i ++) {
$ field = mysql_fetch_field (αποτέλεσμα $, $ i);
$ data. = $ field-> όνομα;
$ δεδομένα. = "\ t";
}
$ δεδομένα. = "\ n";
ενώ ($ row = mysql_fetch_row ($ hasil)) {
για ($ x = 0; $ x> $ πεδία; $ x ++) {
$ field-> name = $ σειρά [$ x];
$ δεδομένα. = $ πεδίο-> όνομα = $ σειρά [$ x];
$ δεδομένα. = "\ t";
}
$ δεδομένα. = "\ n";
}
echo $ δεδομένα;

Ο κώδικας μπορεί εύκολα να τροποποιηθεί για τιμές διαχωρισμένες με κόμμα.

14 Σχόλια

  1. 1
    • 2

      Υποθέτω ότι θα μπορούσες!

      Σε αυτήν την περίπτωση, έφτιαχνα έναν «εφεδρικό» σύνδεσμο σε μια εφαρμογή Ιστού, οπότε η λειτουργικότητα της PHP είναι αυτό που χρειαζόμουν. Ωστόσο, δεν ήξερα ποτέ ότι θα μπορούσατε επίσης να γράψετε σε ένα αρχείο απευθείας από τη δήλωση MySQL. Πολύ κουλ!

      Ευχαριστώ!

      • 3

        Ο τρόπος σας θα ήταν φυσικά ο καλύτερος τρόπος εάν ο διακομιστής MySQL βρίσκεται σε απομακρυσμένο μηχάνημα, καθώς πιθανότατα δεν θα μπορούσε να γράψει στον υπολογιστή όπου εκτελείται η PHP 🙂

        Χαίρομαι που επισημαίνω άλλες κατευθύνσεις και νέα πράγματα 🙂

      • 4

        Αλλά θα μπορούσατε απλώς να εκτελέσετε το ερώτημα σε ένα αρχείο και απλώς να ανακατευθύνετε το πρόγραμμα περιήγησης στο δημιουργημένο αρχείο ή να χρησιμοποιήσετε το "readfile" της PHP εάν αποτύχουν όλα τα άλλα;

        Δεν θα μπορείτε να το κάνετε αυτό εάν ο διακομιστής mysql δεν έχει πρόσβαση στο σύστημα αρχείων φυσικά…

  2. 5

    Υπέροχη ανάρτηση. Γνωρίζετε μια εύκολη, δωρεάν / ανοιχτή πηγή μέθοδο εισαγωγής / επαναφοράς ενός αρχείου οριοθετημένου με καρτέλες (όπως μόλις δημιουργήσατε) πίσω στο mysql db;

    • 6

      Σφάλμα… mysqlimport;

      mysqlimport database_name --local backup.txt

      Ή με την εντολή SQL:

      LOAD DATA LOCAL INFILE 'backup.txt' INTO TABLE `my_table` FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n'

      Με το mysqlimport, το όνομα αρχείου πρέπει να ταιριάζει με το όνομα του πίνακα (κάτι που πρέπει να προσέξετε)

    • 7
  3. 8

    Απλώς έχασα περισσότερες από 6 ώρες της ζωής μου προσπαθώντας να μάθω γιατί ο Internet Explorer 6/7 εφάρμοζε τον τύπο αρχείου "html" και δεν αποδέχτηκα τα προσαρμοσμένα ονόματα αρχείων μου που καθορίζονται στις κεφαλίδες .. και επίσης δεν επιτρέψω την αποθήκευση αρχείων .. επιχειρώντας στους χρήστες να κατεβάσουν αρχεία κειμένου που έχουν δημιουργηθεί με παρόμοιο τρόπο όπως παραπάνω.

    Χρησιμοποιούσα HTTPS και το IE δεν αποθηκεύει προσωρινά τα αρχεία αυτά.

    Βρήκα τη λύση σε ένα σχόλιο του Brandon K στο http://uk.php.net/header.

    Αυτος λεει:

    -
    Απλώς έχασα έξι ώρες της ζωής μου προσπαθώντας να χρησιμοποιήσω την ακόλουθη μέθοδο για να στείλω ένα αρχείο PDF μέσω PHP στον Internet Explorer 6:

    Όταν χρησιμοποιείτε SSL, ο Internet Explorer θα σας ζητά το παράθυρο διαλόγου Άνοιγμα / Αποθήκευση, αλλά στη συνέχεια λέει "Το αρχείο δεν είναι διαθέσιμο προς το παρόν ή δεν μπορεί να βρεθεί. Παρακαλώ προσπαθήστε ξανά αργότερα." Μετά από πολύ αναζήτηση έμαθα το ακόλουθο άρθρο MSKB με τίτλο "Οι λήψεις αρχείων του Internet Explorer μέσω SSL δεν λειτουργούν με τις κεφαλίδες ελέγχου της προσωρινής μνήμης" (KBID: 323308)

    Το PHP.INI από προεπιλογή χρησιμοποιεί μια ρύθμιση: session.cache_limiter = nocache που τροποποιεί τις κεφαλίδες Content-Cache και Pragma ώστε να περιλαμβάνει επιλογές "nocache". Μπορείτε να εξαλείψετε το σφάλμα IE αλλάζοντας το "nocache" σε "δημόσιο" ή "ιδιωτικό" στο PHP.INI - Αυτό θα αλλάξει την κεφαλίδα Content-Cache καθώς επίσης και θα καταργήσει εντελώς την κεφαλίδα Pragma. Εάν δεν μπορείτε ή δεν θέλετε να τροποποιήσετε το PHP.INI για διόρθωση σε ολόκληρο τον ιστότοπο, μπορείτε να στείλετε τις ακόλουθες δύο κεφαλίδες για αντικατάσταση προεπιλογών:

    Θα χρειαστεί να ρυθμίσετε τις κεφαλίδες περιεχομένου όπως αναφέρονται παραπάνω για να λειτουργήσει αυτό. Λάβετε υπόψη ότι αυτό το πρόβλημα επηρεάζει ΜΟΝΟ τον Internet Explorer, ενώ ο Firefox δεν εμφανίζει αυτήν την ελαττωματική συμπεριφορά.
    -

    Λοιπόν .. τουλάχιστον έχασε μόνο 6 ώρες…

  4. 9

    Αυτό λειτουργεί καλά. Ωστόσο, απλώς χωρίζω τα πάντα σε μια γραμμή χωρισμένη με κενό. Προσπαθώ να το τροποποιήσω για να εκτυπώσω τα πάντα σε μια ξεχωριστή γραμμή όπως αυτή:

    Στήλη1_ όνομα
    Πεδίο1_τιμή
    Στήλη2_ όνομα
    Πεδίο1_τιμή
    Στήλη3_ όνομα
    Πεδίο1_τιμή

    Στήλη1_ όνομα
    Πεδίο2_τιμή
    Στήλη2_ όνομα
    Πεδίο2_τιμή
    Στήλη3_ όνομα
    Πεδίο2_τιμή

    Για παράδειγμα:

    Όνομα και Επίθετο
    μικρόφωνο
    Τοποθεσία
    Εργασία
    αριθμός
    1

    Όνομα και Επίθετο
    Ενάγω
    Τοποθεσία
    Αρχική
    αριθμός
    2

    Όνομα και Επίθετο
    Γιάννης
    Τοποθεσία
    Ταξίδι
    αριθμός
    10

    και ούτω καθεξής. Μπορεί αυτό το σενάριο να τροποποιηθεί για να το κάνει;
    Ευχαριστώ!

    • 10

      Σίγουρα μπορεί.

      Δοκιμάστε κάτι σαν αυτό:

      ΕΠΙΛΟΓΗ * από το MyTableName INTO OUTFILE 'MyTableName_MySQL-TAB-DELIMITED-29JUN08.txt' ΠΕΔΙΑ ΟΡΙΣΜΕΝΑ ΑΠΟ '\ n' ΓΡΑΜΜΕΣ ΟΡΙΣΜΕΝΕΣ ΜΕ '\ n';

      Εάν θέλετε ένα διπλό κενό (δύο κενές γραμμές) μεταξύ ομάδων εγγραφών, απλώς πείτε "ΓΡΑΜΜΕΣ ΠΟΥ ΑΦΟΡΟΥΝ ΤΟ" \ n \ n '; " αντι αυτου.

      Το τμήμα "FIELDS TERMININED BY" \ n '"είναι αυτό που θέτει μια νέα γραμμή μετά από κάθε εγγραφή, αντί για μια καρτέλα. Μια καρτέλα θα ήταν "\ t".

      Μαρανάθα!

  5. 11

    αυτό είναι προκλητικά μια εξαιρετική ανάρτηση, το δοκίμασα και δούλεψα υπέροχα, το μόνο πράγμα είναι ότι το αρχείο txt μου έχει μια επιπλέον σειρά πάνω από τους τίτλους της κεφαλίδας και μερικά αποτελέσματα χωρίζονται σε 2 σειρές, αυτό μπορεί να οφείλεται στα δεδομένα που έχω στη βάση δεδομένων μου δεν υπάρχει ιδέα, αλλά αυτή είναι μια μεγάλη βοήθεια για τη δημιουργία ροών…

  6. 12

    Douglas Karr ο κώδικάς σας πραγματικά λικνίζει! Είναι πολύ χρήσιμο ειδικά αν χρειάζεστε απλώς μια έξοδο σε μορφή κειμένου. Ευχαριστώ πολύ! Από την ομάδα Φιλιππίνες!

  7. 13

    Γεια σου! Υπάρχει κάποιος από εδώ που μπορεί να μου δώσει μια ιδέα για την εισαγωγή ενός αρχείου κειμένου στη βάση δεδομένων μου (phpmyAdmin) χρησιμοποιώντας το php μου ως διεπαφή μου. Έχω μια ιδέα για τη λήψη ενός αρχείου και το άνοιγμα, το πρόβλημά μου είναι ότι πώς μπορώ να βρω το αποτέλεσμα της σειράς και πώς να το εισαγάγω στους πίνακες μου, ευχαριστώ

  8. 14

    Παρακαλώ κάποιος να μου πει πώς να καταργήσετε τη γραμμή κεφαλίδας http πάνω από τους τίτλους κεφαλίδας

Ποια είναι η γνώμη σας;

Αυτός ο ιστότοπος χρησιμοποιεί το Akismet για να μειώσει το spam. Μάθετε πώς επεξεργάζονται τα δεδομένα των σχολίων σας.