Skip to main content

Query σε MySQL χρησιμοποιώντας PHP

Σε προηγούμενη ανάρτηση είδαμε πώς να πραγματοποιούμε σύνδεση με μία βάση δεδομένων MySQL μέσω της PHP και πώς να εκτελούμε scripts. Πώς όμως μπορούμε να χρησιμοποιήσουμε τα αποτελέσματα που επιστρέφονται από την εκτέλεση των εντολών;
Έστω ότι έχουμε έναν πίνακα με όνομα Users με τα παρακάτω πεδία:

Θέλουμε να πάρουμε τις τιμές για όλα τα πεδία όπου id=1. Θεωρούμε πως το πεδίο id είναι το primary key του πίνακα. Θα χρειαστούμε,λοιπόν, τις παρακάτω εντολές:
$sql="SELECT * FROM Users WHERE id='1'";
echo $row["name"]." ".$row["surname"];
echo mysql_error();

Παρατηρήσεις Κώδικα
  • Η μεταβλητή $sql είναι μια τυχαία μεταβλητή στην οποία αποθηκεύουμε την εντολή SQL που θα εκτελέσουμε, σε μορφή string.

  • Στη μεταβλητή $result αποθηκεύουμε το αποτέλεσμα της εντολής mysql_query($sql) η οποία εκτελεί την εντολή SQL. Αν η μεταβλητή $result είναι TRUE, σημαίνει πως η εντολή εκτελέστηκε επιτυχώς. Αν είναι FALSE σημαίνει πως δεν εκτελέστηκε σωστά η εντολή πχ. γιατί ο πίνακας δεν υπάρχει.

  • Αφού ελέγξουμε ότι το $result είναι TRUE, φορτώνουμε στην μεταβλητή $row την εγγραφή-αποτέλεσμα που επιστράφηκε από τη βάση δεδομένων. Έπειτα, γράφοντας $row["name"] εννοούμε το περιεχόμενο του πεδίου "name", ενώ χρησιμοποιώντας το $row["surname"] εννοούμε το περιεχόμενο του πεδίου "surname" (όπως ακριβώς τα έχουμε ορίσει στη βάση δεδομένων).
    Υπάρχουν και άλλες συναρτήσεις όπως η mysql_fetch_array($result) ή mysql_fetch_object($result) οι οποίες επιστρέφουν τα αποτελέσματα του query σε μορφή array ή object, αντίστοιχα.

  • Σε περίπτωση που το $result επιστρέψει FALSE, τότε εκτελείται η mysql_error() η οποία εκτυπώνει στην οθόνη την περιγραφή του λάθους που προκλήθηκε από την εκτέλεση του query.

  • Το όνομα του πίνακα και των πεδίων στο query είναι case-sensitive. Έχει, δηλαδή, διαφορά το Users από το users.

Άλλη συνάρτηση που ίσως θα θέλατε να χρησιμοποιήσετε στα προγράμματά σας, είναι η mysql_num_rows($result). Η συνάρτηση αυτή επιστρέφει το σύνολο των εγγραφών που επεστράφηκαν ως αποτέλεσμα από το query σας. Σε περίπτωση, λοιπόν, που επιστρέψει 0 σημαίνει πως δεν υπάρχουν εγγραφές που να ανταποκρίνονται στο ερώτημά σας. Παρόλα αυτά το $result θα είναι TRUE.
Είναι όμως πολύ πιθανόν να βρεθείτε κάποια στιγμή να πάρετε δεδομένα από παραπάνω από έναν πίνακα. Πχ. να έχετε τους παρακάτω πίνακες:

Μπορείτε να γράψετε $sql="SELECT * FROM users,pages"; όμως πώς θα ξεχωρίσετε το πεδίο id του πίνακα pages από το πεδίο id του πίνακα users! Για να λύσουμε αυτό το πρόβλημα μπορούμε από τη βάση να αλλάξουμε το όνομα των πεδίων ώστε να έχουμε πχ. id_users και id_pages. Αυτό όμως δεν είναι πάντα λύση. Δεν μπορούμε πάντα να αλλάξουμε τα ονόματα των πινάκων. Πρέπει το πρόβλημα να λυθεί μέσω PHP. Άρα θα χρησιμοποιήσουμε την αναφορά μέσω πίνακα στο κάθε πεδίο. Δηλαδή αντί για id θα γράψουμε και οπότε και θα έχουμε το query $sql="SELECT,name,surname,,title,content". Σε περίπτωση όμως που μας φαίνεται πολύ το να γράφουμε κάθε φορά $row[""] μπορούμε να γράψουμε το query ως $sql="SELECT AS u_id,name,surname, AS p_id,title,content" οπότε και θα αναφερόμαστε στα αμφιλεγόμενα πεδία ως $row["u_id"] και $row["p_id"].


Popular posts from this blog

Drupal: Status report problem: HTTP request status fails

Some of you may have encountered this problem in some cases. In "Status Report" page, accidentally appears the error below:

HTTP request status   FailsYour system or network configuration does not allow Drupal to access web pages, resulting in reduced functionality. This could be due to your webserver configuration or PHP settings, and should be resolved in order to download information about available updates, fetch aggregator feeds, sign in via OpenID, or use other network-dependent services.
What I did, was to recheck that my webserver had access to internet. Of course it had! The problem exists mostly when there is no information to resolve the domain name used with the local ip address of the webserver. This means that an error occurs in the entries of the DNS server.

In cases where DNS server is not existant(ex. local testing environment) all you have to do is inform the /etc/hosts file. For example if you use the domain http://www.example.local/ and your local ip addr…

Drupal: Allow registrations through Invite or Referral modules only

The Invite module provides invitations from existing users to their contacts. The Referral module, in contrary, creates a special URL for each existing user, which can be found in each user's profile, and allows new user registration. Even though, these two modules seem to provide the same functionality, they don't (and they shouldn't). Invite module, provides a mechanism for a site administrator to limit new registrations to "Invitations only". Referral module doesn't provide any of this functionality. Some users have requested the Invite module and Referral module to join in one module. Until now, there isn't anything to that direction. Wouldn't it be great though if there was a solution to limit drupal registration to referral or invitation only? Copy the functions below to a refinvite.module file in your sites→all→modules→refinvite folder and enable the module. Then go to http://<your-address-here>/admin/user/settings and enable the new …

Override the default Opigno LMS navigation menu

I recently used Opigno LMS for a client's project. It's actually a LMS distribution of Drupal. It supports WebEx meetings, Lessons, even PDF Certificates after you complete a Course. In my case though I needed Lessons but no PDF Certificates. Disabling the proper apps/modules wasn't anything out of the ordinary Drupal procedure. What was lacking though was a way to override the main menu to not display the My Achievements item.My Achievements is enabled as long as the Opigno Quiz App (@see Lessons above) is enabled and no hook exists to override this functionality. To disable it I had to create a custom theme using the Platon theme as a base (Platon is the default theme of the Opigno LMS) and copy 3 functions of Platon's template.php file to my theme's template.php with the proper modifications to get what I wanted.See the code below...