88 γραμμές
		
	
	
	
		
			8,6 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			88 γραμμές
		
	
	
	
		
			8,6 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
+++
 | 
						||
title = 'DataBaseInterface για Perl μέρος 2ο'
 | 
						||
date = '2000-06-01T00:00:00Z'
 | 
						||
description = ''
 | 
						||
author = 'Μιχάλης Καμπριάνης(mailto:kabrianis@hellug.gr)'
 | 
						||
issue = ['Magaz 24']
 | 
						||
issue_weight = 4
 | 
						||
+++
 | 
						||
----------------------------------------------------------------------------------------------------------------------------------------------------------------
 | 
						||
 | 
						||
*Σε αυτό το τεύχος συνεχίζουμε την προσέγγιση στον προγραματισμό Perl για Databases μέσω του DBI interface που ξεκινήσαμε στο τεύχος Απριλίου.*
 | 
						||
 | 
						||
----------------------------------------------------------------------------------------------------------------------------------------------------------------
 | 
						||
 | 
						||
Αυτή τη φορά θα ασχοληθούμε με απλά κολπάκια για καλύτερο προγραμματισμό, τα οποία δεν αναφέραμε στο εισαγωγικό άρθρο. Ξεκινάμε:
 | 
						||
 | 
						||
1.  Έλεγχος λαθών
 | 
						||
 | 
						||
    Είχαμε πει στο προηγούμενο τεύχος ότι πρέπει ο προγραμματιστής να ελέγχει το exit status κάθε function που καλεί, για να δει αν πέτυχε ή όχι. Σε περίπτωση
 | 
						||
    που δεν πέτυχε μπορεί να κάνει κάποιες δουλειές, αλλά συνήθως θέλει να σταματάει η εργασία εκεί. Γι αυτό το DBI παρέχει το RaiseError. Αμέσως μετά τη
 | 
						||
    σύνδεση (ή και παράλληλα) μπορούμε να θέσουμε τη μεταβλητή RaiseError και τότε, σε κάθε error το πρόγραμμά μας θα σταματάει με ένα die.
 | 
						||
 | 
						||
        Παράδειγμα 1
 | 
						||
        $dbh=DBI->connect('DBI:Pg:dbname=dbname user=dbuser password=dbpass');
 | 
						||
        $dbh->{RaiseError} = 1;
 | 
						||
 | 
						||
    Η πρώτη γραμμή, απλά συνδέεται σε μία postgres database, στην βάση με όνομα dbname, με username dbuser και password dbpass. Η δεύτερη γραμμή θέτει τη
 | 
						||
    μεταβλητή RaiseError όπως λέγαμε. \`Αλλη μία μεταβλητή που μπορεί να τεθεί με αυτόν τον τρόπο, είναι η AutoCommit, για transactional databases. Αν δεν
 | 
						||
    ξέρετε τι είναι transactional database, καλά θα κάνετε να διαβάσετε το manual της βάσης σας.
 | 
						||
 | 
						||
2.  Απ\' ευθείας ανάθεση αποτελεσμάτων σε μεταβλητές
 | 
						||
 | 
						||
    Εκτός από την παραδοσιακή μέθοδο που είδαμε στο προηγούμενο τεύχος, να τοποθετούμε δηλαδή τα αποτελέσματα σε ένα array (μία στήλη αποτελεσμάτων είναι
 | 
						||
    αντίστοιχα ένα στοιχείο του array), μπορούμε να χρησιμοποιήσουμε την bind\_columns για να αναθέσουμε τα αποτελέσματα σε ήδη ορισμένες μεταβλητές.
 | 
						||
 | 
						||
        Παράδειγμα 2
 | 
						||
        $entoli = $dbh->prepare('SELECT phone,name FROM clients WHERE id=?');
 | 
						||
        $entoli->execute($num);
 | 
						||
        $entoli->bind_columns(\$phone,\$name);
 | 
						||
        $entoli->fetch;
 | 
						||
 | 
						||
    Το \$num καθώς και τα \$phone και \$name πρέπει προφανώς να τα έχουμε δηλώσει νωρίτερα. Προσοχή πρέπει να δοθεί στο ότι η bind\_columns δίνεται μετά την
 | 
						||
    execute. Επίσης όπως βλέπετε δεν χρησιμοποιούμε την fetchrow\_array αλλά την σκέτη fetch για να τραβήξουμε τα στοιχεία από την βάση.
 | 
						||
 | 
						||
3.  Casting και πέρασμα παραμέτρων από πριν Μία άλλη μέθοδος που υποστηρίζει το DBI είναι η bind\_param(). Αυτή δίνει εξ αρχής στην execute τις παραμέτρους που
 | 
						||
    θα πάρει, δίνoντάς μας την δυνατότητα να κάνουμε και casting.
 | 
						||
 | 
						||
        Παράδειγμα 2
 | 
						||
        $entoli = $dbh->prepare('SELECT phone,name FROM clients WHERE id=?');
 | 
						||
        $entoli->bind_param(1, $num, { TYPE => SQL_INTEGER });
 | 
						||
        $entoli->execute();
 | 
						||
        $entoli->bind_columns(\$phone,\$name);
 | 
						||
        $entoli->fetch;
 | 
						||
 | 
						||
    Σε αυτό το παράδειγμα πριν καλέσουμε την execute λέμε στο DBI ότι στο πρώτο placeholder (όπου placeholder είναι το ερωτηματικό, και το πρώτο βγαίνει από το
 | 
						||
    1 που είναι το πρώτο όρισμα της bind\_param()) θα βάλει την τιμή \$num και θα πει στην βάση μας ότι είναι τύπου Integer. Αυτό σε ορισμένες περιπτώσεις είναι
 | 
						||
    χρήσιμο, αν και το σε ποιες ακριβώς, αφήνεται ως άσκηση στον αναγνώστη :-) Αν λοιπόν θέλουμε για οποιονδήποτε λόγο να κάνουμε casting, αυτή είναι η μέθοδος
 | 
						||
    που πρέπει να ακολουθήσουμε.
 | 
						||
 | 
						||
4.  Αποθήκευση παραμέτρων σε hashed array
 | 
						||
 | 
						||
    Αντί για την fetchrow\_array και την fetch που είδαμε πιο πάνω, μπορούμε να χρησιμοποιήσουμε και την fetchrow\_hashref() μέθοδο, για να τοποθετήσουμε τα
 | 
						||
    αποτελέσματα που θα μας επιστρέψει η βάση σε ένα hash.\
 | 
						||
    Για κάθε γραμμή αποτελεσμάτων που επιστρέφεται από την βάση, δημιουργείται ένα reference σε ένα array που περιέχει το field name σαν κλειδί και την τιμή του
 | 
						||
    σαν value. Αν κάποιο value είναι Null, τότε επιστρέφεται με τιμή undef. Αυτό προσέξτε το γιατί σημαίνει ότι θα υπάρχει συνδυασμός κλειδί-τιμή στο hash που
 | 
						||
    θα δημιουργηθεί (ενώ ίσως περίμενε κάποιος να μην υπάρχει καν αυτός ο συνδυασμός εφόσον η τιμή του είναι Null).\
 | 
						||
    Αυτή η υλοποίηση δημιουργεί περισσότερο overhead στο πρόγραμμά μας απ\' ότι η fetchrow\_array και δεν είναι και πολύ μεταφέρσιμη μεταξύ των διαφορετικών
 | 
						||
    βάσεων, συνεπώς αν δεν το χρειάζεστε, μην το χρησιμοποιήσετε.
 | 
						||
 | 
						||
5.  Πληροφορίες από την βάση
 | 
						||
 | 
						||
    Μπορούμε να πάρουμε όλα τα αποτελέσματα του select μας με την μέθοδο dump\_results() η οποία καλεί εσωτερικά την neat\_list και τυπώνει τα αποτελέσματα.Aν
 | 
						||
    δεν δώσουμε παραμέτρους, θα τυπώσει μέχρι 35 χαρακτήρες (\$maxlen=35), μία γραμμή αποτελεσμάτων σε μία γραμμή του output (\$lsep=\'\\n\'), χωρισμένες οι
 | 
						||
    στήλες με κόμματα (\$fsep=\',\') στο STDOUT (\$fh). Όλα αυτά μπορούμε να τα αλλάξουμε με τις μεταβλητές που ανέφερα.
 | 
						||
 | 
						||
    Η βάση μας δίνει επίσης πληροφορίες για:
 | 
						||
 | 
						||
    -   NUM\_OF\_FIELDS (integer)\
 | 
						||
        Ο αριθμός των πεδίων που θα επιστρέψει το select που έχουμε κάνει prepare.
 | 
						||
    -   NUM\_OF\_PARAMS (integer)\
 | 
						||
        Ο αριθμός των παραμέτρων που περνάμε στην prepare (αυτά που λέγαμε για Placeholders).
 | 
						||
    -   NAME (reference σε array)\
 | 
						||
        Ένα reference σε array που περιέχει τα ονόματα των πεδίων. Υπάρχουν αντίστοιχα και οι NAME\_lc και NAME\_uc που επιστρέφουν τα ίδια στοιχεία σε
 | 
						||
        LowerCase και UpperCase αντίστοιχα.
 | 
						||
 | 
						||
    Όλες οι παραπάνω παράμετροι είναι βέβαια read\_only.
 | 
						||
 | 
						||
Με αυτό το κείμενο τελειώσαμε την εισαγωγή στο DBI interface της perl. Διαβάστε πάλι την βιβλιογραφία από το προηγούμενο τεύχος και είστε έτοιμοι να ξεκινήσετε.
 |