Open eClass Documentation
You are here: start » el » developers » database

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
el:developers:database [2022/10/26 16:02] – adminel:developers:database [2022/10/26 16:10] (current) – admin
Line 28: Line 28:
 </code> </code>
  
-__Σημείωση__: για το_ ''Database::core()'' _η σύνταξη των_ ''query*...'' _είναι ίδια και δεν έχει καμμία άλλη διαφορά._+__Σημείωση__: για το ''Database::core()'' η σύνταξη των ''query*...'' είναι ίδια και δεν έχει καμμία άλλη διαφορά.
  
 Σε κάθε μία μέθοδο, η πρώτη παράμετρος είναι το επερώτημα SQL που μας ενδιαφέρει να εκτελέσουμε, ακολουθούμενο από μία λίστα με παραμέτρους που θα γίνει εισαγωγή στο επερώτημα. Είναι λάθος πρακτική σε περίπτωση που θέλουμε να εισάγουμε κάποια παράμετρο στο επερώτημα να τη δώσουμε λεκτικά στο επερώτημα αυτό καθ'εαυτό, από το να το δώσουμε σαν επιπρόσθετη παράμετρο. Για να σημειώσουμε στο ίδιο το επερώτημα σε ποιο σημείο είναι η κάθε παράμετρος, χρησιμοποιούμε το σύμβολο «?» ακολουθούμενο από ένα γράμμα που δηλώνει τον τύπο της παραμέτρου. Σε περίπτωση που ως μία παράμετρο δωθεί πίνακας, τότε ο πίνακας θα αναλυθεί στα επιμέρους στοιχεία του με τη σειρά με την οποία εμφανίζονται, ώστε το τελικό αποτέλεσμα των παραμέτρων τελικά να είναι ένας μονοδιάστατος πίνακας, ανεξάρτητα από την επιμέρους δομή των αρχικών παραμέτρων.  Σε κάθε μία μέθοδο, η πρώτη παράμετρος είναι το επερώτημα SQL που μας ενδιαφέρει να εκτελέσουμε, ακολουθούμενο από μία λίστα με παραμέτρους που θα γίνει εισαγωγή στο επερώτημα. Είναι λάθος πρακτική σε περίπτωση που θέλουμε να εισάγουμε κάποια παράμετρο στο επερώτημα να τη δώσουμε λεκτικά στο επερώτημα αυτό καθ'εαυτό, από το να το δώσουμε σαν επιπρόσθετη παράμετρο. Για να σημειώσουμε στο ίδιο το επερώτημα σε ποιο σημείο είναι η κάθε παράμετρος, χρησιμοποιούμε το σύμβολο «?» ακολουθούμενο από ένα γράμμα που δηλώνει τον τύπο της παραμέτρου. Σε περίπτωση που ως μία παράμετρο δωθεί πίνακας, τότε ο πίνακας θα αναλυθεί στα επιμέρους στοιχεία του με τη σειρά με την οποία εμφανίζονται, ώστε το τελικό αποτέλεσμα των παραμέτρων τελικά να είναι ένας μονοδιάστατος πίνακας, ανεξάρτητα από την επιμέρους δομή των αρχικών παραμέτρων. 
Line 74: Line 74:
 </code> </code>
  
 +
 +----
  
 === Μέθοδος querySingle($statement) === === Μέθοδος querySingle($statement) ===
  
-Με τη μέθοδο αυτή εκτελούμε ένα επερώτημα από το οποίο περιμένουμε να λάβουμε ως αποτέλεσμα ένα μοναδικό στοιχείο, ή με άλλα λόγια μία και μόνο μία γραμμή. Ο αριθμός των στηλών του αποτελέσματος δεν έχει σημασία. Η σύνταξη είναι ίδια με αυτή της μεθόδου <code class="php">query($statement);</code>+Με τη μέθοδο αυτή εκτελούμε ένα επερώτημα από το οποίο περιμένουμε να λάβουμε ως αποτέλεσμα ένα μοναδικό στοιχείο, ή με άλλα λόγια μία και μόνο μία γραμμή. Ο αριθμός των στηλών του αποτελέσματος δεν έχει σημασία. Η σύνταξη είναι ίδια με αυτή της μεθόδου <code>query($statement);</code>
  
-Ως αποτέλεσμα λαμβάνουμε ένα αντικείμενο όπου κάθε ιδότητά του (property) έχει τιμή ίδια με το όνομα της στήλης σε περιβάλλον SQL. Για το λόγο αυτό είναι προτιμότερο κάθε στήλη να έχει ένα μοναδικό όνομα, ώστε να είναι μετά άμεση η προσπέλαση σε αυτό. Αν δεν υπάρχουν αποτελέσματα επιστρέφεται το @null@, οπότε είναι θεμιτό να γίνεται έλεγχος για @null@ σε περίπτωση που ξέρουμε πως μπορεί να μην υπάρχουν αποτελέσματα. Για παράδειγμα +Ως αποτέλεσμα λαμβάνουμε ένα αντικείμενο όπου κάθε ιδότητά του (property) έχει τιμή ίδια με το όνομα της στήλης σε περιβάλλον SQL. Για το λόγο αυτό είναι προτιμότερο κάθε στήλη να έχει ένα μοναδικό όνομα, ώστε να είναι μετά άμεση η προσπέλαση σε αυτό. Αν δεν υπάρχουν αποτελέσματα επιστρέφεται το ''null'', οπότε είναι θεμιτό να γίνεται έλεγχος για ''null'' σε περίπτωση που ξέρουμε πως μπορεί να μην υπάρχουν αποτελέσματα. Για παράδειγμα 
-<pre><code class="php">+<code>
 $stat_object = Database::get()->querySingle("SELECT status FROM course_user WHERE user_id = ?d AND course_id = ?d", $uid, $course_id); $stat_object = Database::get()->querySingle("SELECT status FROM course_user WHERE user_id = ?d AND course_id = ?d", $uid, $course_id);
 if ($stat_object) { if ($stat_object) {
   $status = $stat_object->status;   $status = $stat_object->status;
 } }
-</code></pre>  +</code> 
-Ένα άλλο παράδειγμα: <pre><code class="php">+ 
 +Ένα άλλο παράδειγμα:  
 +<code>
 $openCoursesNum = Database::get()->querySingle("SELECT COUNT(id) as count FROM course_review WHERE is_certified = 1")->count; $openCoursesNum = Database::get()->querySingle("SELECT COUNT(id) as count FROM course_review WHERE is_certified = 1")->count;
-</code></pre>+</code> 
 + 
 +----
  
-h2. Μέθοδος @queryArray($statement);@+=== Μέθοδος queryArray($statement) ===
  
-Αυτή η μέθοδος εκτελείται όταν περιμένουμε από το επερώτημα να επιστρέψει περισσότερο από ένα στοιχείο (ή γραμμή) και θέλουμε να πάρουμε αμέσως όλα τα αντικείμενα σε έναν πίνακα. Η μέθοδος αυτή μπορεί να χρησιμοποιηθεί σε περίπτωση που περιμένουμε τα αποτελέσματα να είναι λίγα στον αριθμό. Σε περίπτωση που είναι αρκετά, *είναι προτιμότερη η χρήση της μεθόδου @queryFunc@*.+Αυτή η μέθοδος εκτελείται όταν περιμένουμε από το επερώτημα να επιστρέψει περισσότερο από ένα στοιχείο (ή γραμμή) και θέλουμε να πάρουμε αμέσως όλα τα αντικείμενα σε έναν πίνακα. Η μέθοδος αυτή μπορεί να χρησιμοποιηθεί σε περίπτωση που περιμένουμε τα αποτελέσματα να είναι λίγα στον αριθμό. Σε περίπτωση που είναι αρκετά, **είναι προτιμότερη η χρήση της μεθόδου ''queryFunc''**.
  
-Η σύνταξη της μεθόδου είναι αντίστοιχη ομοίως της <code class="php">query($statement);</code>+Η σύνταξη της μεθόδου είναι αντίστοιχη ομοίως της ''query($statement);''
  
-Η επιστρεφόμενη τιμή είναι ένας πίνακας με αντικείμενα, όπου τα αντικείμενα είναι αντίστοιχα με της μεθόδου <code class="php">querySingle($statement);</code>+Η επιστρεφόμενη τιμή είναι ένας πίνακας με αντικείμενα, όπου τα αντικείμενα είναι αντίστοιχα με της μεθόδου ''querySingle($statement);''
  
 Παράδειγμα χρήσης της μεθόδου Παράδειγμα χρήσης της μεθόδου
  
-<pre><code class="php">+<code>
 $moduleIDs = Database::get()->queryArray("SELECT module_id FROM course_module WHERE visible = 1 AND course_id = ?d", $course_id); $moduleIDs = Database::get()->queryArray("SELECT module_id FROM course_module WHERE visible = 1 AND course_id = ?d", $course_id);
 foreach ($moduleIDs as $module) { foreach ($moduleIDs as $module) {
   $publicModules[] = $module->module_id;   $publicModules[] = $module->module_id;
 } }
-</code></pre>+</code>
  
-h2. Μέθοδος @queryFunc($statement, $callback_function);@ 
  
-Η μέθοδος αυτή αναφέρεται σε επερωτήματα που μπορεί να έχουν πολλά αποτελέσματα, αλλά σε αντίθεση με την @queryArray@ λαμβάνουμε ένα αποτέλεσμα τη φορά. Αυτή η συνάρτηση είναι ιδανική όταν τα αποτελέσματα που αναμένουμε είναι αρκετά, αλλά είναι εξίσου χρήσιμη σε περίπτωση που περιμένουμε λίγα, ένα ή και καθόλου αποτελέσματα.+---- 
 + 
 +=== Μέθοδος queryFunc($statement, $callback_function); === 
 + 
 +Η μέθοδος αυτή αναφέρεται σε επερωτήματα που μπορεί να έχουν πολλά αποτελέσματα, αλλά σε αντίθεση με την ''queryArray'' λαμβάνουμε ένα αποτέλεσμα τη φορά. Αυτή η συνάρτηση είναι ιδανική όταν τα αποτελέσματα που αναμένουμε είναι αρκετά, αλλά είναι εξίσου χρήσιμη σε περίπτωση που περιμένουμε λίγα, ένα ή και καθόλου αποτελέσματα.
  
 Ως δεύτερη παράμετρο δίνουμε μία function με μία και μοναδική παράμετρο, όπου θα αποθηκευτεί το τρέχον αποτέλεσμα της εκτέλεσης του επερωτήματος για κάθε _γραμμή_ (σε σύνταξη SQL). Η σύνταξη της παραμέτρου αυτής είναι ίδια με τη σύνταξη της συνάρτησης επανάκλησης σε περίπτωση λάθους, όπως αναφέρθηκε προηγουμένως. Ως δεύτερη παράμετρο δίνουμε μία function με μία και μοναδική παράμετρο, όπου θα αποθηκευτεί το τρέχον αποτέλεσμα της εκτέλεσης του επερωτήματος για κάθε _γραμμή_ (σε σύνταξη SQL). Η σύνταξη της παραμέτρου αυτής είναι ίδια με τη σύνταξη της συνάρτησης επανάκλησης σε περίπτωση λάθους, όπως αναφέρθηκε προηγουμένως.
  
-Επειδή η ορατότητα των εξωτερικών μεταβλητών μέσα στη συνάρτηση είναι περιορισμένη, μπορούμε να χρησιμοποιήσουμε το λεκτικό <code class="php">use($param1, &$param2 ...)</code>, ώστε να ενημερώσουμε την PHP πως ενδιαφερόμαστε να χρησιμοποιήσουμε τις μεταβλητές @$param1@  και @$param2@ εσωτερικά στη συνάρτησή μας. Ειδικά για τη παράμετρο @$param2@, με τη χρήση του συμβόλου @&@ υποδηλώνουμε πως η γίνεται «καθ'αναφορά» η δήλωση της μεταβλητής, δηλαδή οποιαδήποτε αλλαγή που θα γίνει εσωτερικά, θα αλλάζει συνολικά την τιμή της μεταβλητής αυτής.+Επειδή η ορατότητα των εξωτερικών μεταβλητών μέσα στη συνάρτηση είναι περιορισμένη, μπορούμε να χρησιμοποιήσουμε το λεκτικό ''use($param1, &$param2 ...)'', ώστε να ενημερώσουμε την PHP πως ενδιαφερόμαστε να χρησιμοποιήσουμε τις μεταβλητές ''$param1''  και ''$param2'' εσωτερικά στη συνάρτησή μας. Ειδικά για τη παράμετρο ''$param2'', με τη χρήση του συμβόλου ''&'' υποδηλώνουμε πως η γίνεται «καθ'αναφορά» η δήλωση της μεταβλητής, δηλαδή οποιαδήποτε αλλαγή που θα γίνει εσωτερικά, θα αλλάζει συνολικά την τιμή της μεταβλητής αυτής.
  
 Ένα απλό παράδειγμα της μεθόδου αυτής είναι το εξής: Ένα απλό παράδειγμα της μεθόδου αυτής είναι το εξής:
-<pre><code class="php"> +<code> 
-DataBase::get()->queryFunc("SELECT title  FROM course_units WHERE course_id = ?d", function($unit) {+DataBase::get()->queryFunc("SELECT title FROM course_units WHERE course_id = ?d", function($unit) {
     echo "title: " . $unit->title;     echo "title: " . $unit->title;
-  }, intval($courseId));</code></pre>+  }, intval($courseId)); 
 +</code>
  
 Ένα πλήρες παράδειγμα και με συνάρτησης επανάκλησης σε περίπτωση λάθους: Ένα πλήρες παράδειγμα και με συνάρτησης επανάκλησης σε περίπτωση λάθους:
-<pre><code class="php">+<code>
 $counter = 0; $counter = 0;
 Database::get()->queryFunc("SELECT course.id as cid, course.code as code, FROM course WHERE course.id = ?d" , function ($course_info) use ($outer_variable, &$counter, &$title) { Database::get()->queryFunc("SELECT course.id as cid, course.code as code, FROM course WHERE course.id = ?d" , function ($course_info) use ($outer_variable, &$counter, &$title) {
Line 131: Line 141:
     exit();     exit();
   } , $dbname);   } , $dbname);
-</code></pre>+</code> 
 + 
 +----
  
-h2. Διαχείριση transactions+=== Διαχείριση transactions ===
  
 Όλες οι κλήσεις προς τη βάση είναι transactional. Σε περίπτωση που εκτελέσουμε ένα query και, ενώ ακόμα είναι ενεργό, εκτελέσουμε κάποιο άλλο query (π.χ. στο σώμα της μεθόδου queryFunc), τότε συνεχίζουμε να είμαστε μέσα στο transaction. To transaction τερματίζει όταν τερματίσει και η αρχική («εξωτερική») εντολή. Όλες οι κλήσεις προς τη βάση είναι transactional. Σε περίπτωση που εκτελέσουμε ένα query και, ενώ ακόμα είναι ενεργό, εκτελέσουμε κάποιο άλλο query (π.χ. στο σώμα της μεθόδου queryFunc), τότε συνεχίζουμε να είμαστε μέσα στο transaction. To transaction τερματίζει όταν τερματίσει και η αρχική («εξωτερική») εντολή.
Line 140: Line 152:
 Σαν παράδειγμα, έχουμε Σαν παράδειγμα, έχουμε
  
-<pre><code class="php">+<code>
 Database::get()->transaction(function () { Database::get()->transaction(function () {
     Database::get()->query("...");     Database::get()->query("...");
     Database::get()->query("...");     Database::get()->query("...");
 }); });
-</code></pre>+</code>
  
 Μόνο όταν τελειώσει η εκτέλεση της συνάρτησης, θα τερματίσει και το transaction. Σε περίπτωση που εμφανιστεί exception κατά την εκτέλεση της συνάρτησης, τότε το transaction ακυρώνεται αυτόματα. Μόνο όταν τελειώσει η εκτέλεση της συνάρτησης, θα τερματίσει και το transaction. Σε περίπτωση που εμφανιστεί exception κατά την εκτέλεση της συνάρτησης, τότε το transaction ακυρώνεται αυτόματα.
  
-h2. Ανάγνωση χαρακτηριστικών της βάσης+---- 
 + 
 +=== Ανάγνωση χαρακτηριστικών της βάσης ===
  
 Υποστηρίζεται η ανάγνωση χαρακτηριστικών της βάσης (attributes) μέσω της μεθόδου Υποστηρίζεται η ανάγνωση χαρακτηριστικών της βάσης (attributes) μέσω της μεθόδου
-<pre><code class="php">+<code>
 Database::get()->attributes()->attributeName(); Database::get()->attributes()->attributeName();
-</code></pre>+</code>
  
 Τα πιθανά attribute names είναι τα εξής: Τα πιθανά attribute names είναι τα εξής:
-|_. attribute names | +| //attribute names// | 
-| @autocommit()@  | +| ''autocommit()''  | 
-| @textCase()@  | +| ''textCase()''  | 
-| @clientVersion()@  | +| ''clientVersion()''  | 
-| @connectionStatus()@  | +| ''connectionStatus()''  | 
-| @driverName()@  | +| ''driverName()''  | 
-| @errorMode()@  | +| ''errorMode()''  | 
-| @oracleNulls()@  | +| ''oracleNulls()''  | 
-| @persistent()@  | +| ''persistent()''  | 
-| @prefech()@  | +| ''prefetch()'' | 
-| @serverInfo()@  | +| ''serverInfo()'' | 
-| @serverVersion()@  | +| ''serverVersion()''  | 
-| @timeout()@  |+| ''timeout()''  |
  
Open eClass Documentation

Table of Contents