﻿<?xml version="1.0" encoding="UTF-8"?> <rss
version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:wfw="http://wellformedweb.org/CommentAPI/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
> <channel><title>GreekTuts &#187; PHP</title> <atom:link href="http://greektuts.net/category/programming/php/feed/" rel="self" type="application/rss+xml" /><link>http://greektuts.net</link> <description>Ελληνικά Βοηθήματα</description> <lastBuildDate>Mon, 30 Jan 2012 13:52:21 +0000</lastBuildDate> <language>en</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <generator>http://wordpress.org/?v=3.3.1</generator> <item><title>Απλό Σύστημα Εγγραφής Χρηστών: Ασφάλεια και Παραμετροποίηση</title><link>http://greektuts.net/register-system-part2-security-and-optimization/</link> <comments>http://greektuts.net/register-system-part2-security-and-optimization/#comments</comments> <pubDate>Mon, 13 Sep 2010 13:04:15 +0000</pubDate> <dc:creator>Jimakos</dc:creator> <category><![CDATA[HTML]]></category> <category><![CDATA[MySQL]]></category> <category><![CDATA[PHP]]></category> <category><![CDATA[jimakos]]></category> <category><![CDATA[login]]></category> <category><![CDATA[login system]]></category> <category><![CDATA[register]]></category> <category><![CDATA[register system]]></category> <category><![CDATA[security]]></category> <category><![CDATA[sql]]></category> <category><![CDATA[ασφάλεια]]></category> <category><![CDATA[Παραμετροποίηση]]></category> <guid
isPermaLink="false">http://greektuts.net/?p=4126</guid> <description><![CDATA[Στο προηγούμενο αρθρο είδαμε πως μπορούμε να δημιουργησουμε μια φόρμα απο την οποία μπορεί κάποιος να κανει εγγραφή χρηστη(Απλο Συστημα Εγγραφης Χρηστων) . Σε αυτό το μέρος θα δούμε ένα πολύ σημαντικο κομματι στα προγραμματα που είναι η ασφάλεια των δεδομένων και η ακαιρεότητα τους.]]></description> <content:encoded><![CDATA[<p>Σε αυτο το αρθρο θα δούμε πως μπορούμε να ασφαλίσουμε την φόρμα μας εναντι κακόβουλων επιθέσεων βλ. <a
href="http://en.wikipedia.org/wiki/Cross-site_scripting">Cross Site Scripting (XSS)</a> ,<a
href="http://en.wikipedia.org/wiki/SQL_injection">SQL injections</a> και πολλα αλλα που δεν είναι του παρόντος!</p><h1>Τι ειναι ασφάλεια λοιπον;</h1><p>Ασφάλεια ειναι το κομματι κώδικα που θα προστατεψει εσάς και το συστημα σας και ενδεχομένος στην περίπτωση μας  τους χρηστες μας  απο κακόβουλες επιθέσεις .</p><p>Χρησιμοποιώντας ασφάλεια στο κώδικα μας ερχομαστε πιο κοντα στην ιδέα του “<a
href="http://en.wikipedia.org/wiki/Defensive_programming">αμυντικου προγραμματισμου</a>” δηλαδη την προσπάθεια του προγραμματιστη να ελενξει για λάθη των χρηστών τα οποία θα γινουν απο αμέλεια η επιτιδευμένα ας δουμε λοιπον ενα μικρό παράδειγμα:</p><h3><strong>Έστω οτι έχουμε μια φόρμα  οπου ζητάμε απο  τον χρήστη να εισάγει τον αριθμό του κινητού του :</strong></h3><p>Ο PhP κώδικας μας συνήθως θα είναι καπως ετσι:</p><pre name="code" class="php">
$arithmos=$_POST['onoma_pediou'];
echo $arithmos;
</pre><p>Εστω οτι στο πεδίο της mySql εχουμε δηλωσει  να ειναι INT δηλαδή τα δεδομένα που θα εισαχθουν απο τον χρήστη στην βαση δεδομενων θα ειναι αριθμοι .Εμεις  μπορουμε να υποθέσουμε οτι ο χρήστης παντα θα εισάγει αριθμους .</p><p>Στον αμυντικό προγραμματισμο ομως ποτε δεν εμπιστευόμαστε τα δεδομενα που εισάγει ο χρήστης και παντοτε τα ελεγχουμε οποτε στην περιπτωση μας αν ο χρήστης εισάγει στον παραπάνω κώδικα χαρακτήρες και οχι αριθμούς στην βάση δεδομένων μας το πεδίο με το τηλέφωνο θα πάρει την τιμή 0 κατι που δεν θελουμε δηλαδη.</p><p>Ας δουμε πως θα ειναι ο κώδικας που θα πρεπε να γραψουμε για να αποφύγουμε το λάθος αυτο.</p><pre name="code" class="php">
function check($dedomeno)
{
$dedomeno = <a href="http://php.net/manual/en/function.trim.php">trim</a>($dedomeno);
$dedomeno = <a href="http://gr.php.net/manual/en/function.stripslashes.php">stripslashes</a>($dedomeno);
$dedomeno = <a href="http://php.net/manual/en/function.htmlspecialchars.php">htmlspecialchars</a>($dedomeno);
return $dedomeno;
}
if($_SERVER['REQUEST_METHOD']=='POST'){
if(isset($_POST['submit'])){
if(empty($_POST['number']))
{
echo "Δεν εχετε συμπληρώσει το πεδιο τηλέφωνο";
}
elseif(!ctype_digit(check(($_POST['number']))))
{
echo "Παρακαλω συμπληρώστε μονο αριθμους";
}
else
{
//εισαγωγή στοιχείων στην βάση δεδομένων
}
}
}
?&gt;
</pre><p>Μεγάλο ε ?</p><p>Μην αναχώνεστε ας το εξηγήσουμε σιγά σιγά :</p><p>Δημιουργούμε μια συνάρτηση με όνομα check και δέχεται ένα όρισμα το $dedomeno τα δεδομένα που θέλουμε να επαληθεύσουμε .</p><p>Έπειτα η trim αφαιρεί τα κενά και άλλους χαρακτήρες από την αρχή του δεδομένου και από το τέλος.</p><p>Στην συνέχει το stripslashes αφαιρεί τα εισαγωγικά από τα δεδομένα μας</p><p>Τέλος το htmlspecialchars μετατρέπει τους ειδικούς χαρακτήρες σε HTML οντότητες για αποτροπή των χρηστών να εισάγουν δεδομένα του τύπου &lt;a href=1&gt;1&lt;/a&gt;</p><pre name="code" class="php">
function check($dedomeno)
{
$dedomeno = <a href="http://php.net/manual/en/function.trim.php">trim</a>($dedomeno);
$dedomeno = <a href="http://gr.php.net/manual/en/function.stripslashes.php">stripslashes</a>($dedomeno);
$dedomeno = <a href="http://php.net/manual/en/function.htmlspecialchars.php">htmlspecialchars</a>($dedomeno);
return $dedomeno;
}
</pre><p>Ελέγχουμε τον τρόπο που ζητήθηκε η αίτηση</p><pre name="code" class="php">
if($_SERVER['REQUEST_METHOD']=='POST')
</pre><p>Ελέγχουμε εάν έχει γίνει submit</p><pre name="code" class="php">
if(isset($_POST['submit']))
</pre><p>Ελέγχουμε εάν είναι κενό το πεδίο</p><pre name="code" class="php">
if(empty($_POST['number']))
</pre><p>Τέλος ελέγχουμε εάν το πεδίο είναι αριθμός με την συνάρτηση ctype_digit η οποία ελέγχει όλη την μεταβλητή που έχουμε δώσει ως όρισμα για να “δει” εάν είναι η δεν είναι αριθμός.</p><pre name="code" class="php">
elseif(!ctype_digit(check(($_POST['number']))))
</pre><p>Αφού πήραμε μια γεύση μπορούμε πλέον να παραμετροποιήσουμε το <a
href="../register-system/">προηγούμενο αρθρο μου </a></p><p>Πάμε σιγά σιγά να το κάνουμε μαζί.</p><p>Αυτό που μας ενδιαφέρει είναι να ελέγξουμε τα δεδομένα που εισάγει ο χρήστης τον έλεγχο δηλαδή της ακεραιότητα τους οπότε ας κοιτάξουμε μόνο τα κομμάτια κώδικα που πρέπει να τροποποιήσουμε :</p><p>Αυτή την φορά θα προσθέσουμε μια συνάρτηση για δική μας ευκολία η οποία θα περνάει τα δεδομένα που στέλνει ο χρήστης από μια σειρά ελέγχων :</p><pre name="code" class="php">
db_con();
function check($dedomeno)  
{  
$dedomeno = &lt;a onclick="javascript:pageTracker._trackPageview('/outgoing/php.net/manual/en/function.trim.php');" href="http://php.net/manual/en/function.trim.php"&gt;trim&lt;/a&gt;($dedomeno);  
$dedomeno = &lt;a onclick="javascript:pageTracker._trackPageview('/outgoing/gr.php.net/manual/en/function.stripslashes.php');" href="http://gr.php.net/manual/en/function.stripslashes.php"&gt;stripslashes&lt;/a&gt;($dedomeno);  
$dedomeno = &lt;a onclick="javascript:pageTracker._trackPageview('/outgoing/php.net/manual/en/function.htmlspecialchars.php');" href="http://php.net/manual/en/function.htmlspecialchars.php"&gt;htmlspecialchars&lt;/a&gt;($dedomeno);  
return $dedomeno;  
}
</pre><p>Παρατηρήστε ότι είναι ίδια με την προηγούμενη με την διαφορά ότι έχει συν μια συνάρτηση την mysql_real_escape_string τι κάνει η συνάρτηση αυτή ;Βγάζει τους ειδικούς χαρακτήρες από ένα string το οποίο θα δώσουμε στην περίπτωσή μας τα στοιχεία που θα εισάγει ο χρήστης.</p><p>Έπειτα</p><pre name="code" class="php">
$name =check($_POST['name']);
$pass = check($_POST['password']);
$email = check($_POST['email']);
</pre><p>με την συνάρτηση μας τσεκάρουμε όλα τα δεδομένα που αποστέλνονται από την φόρμα εισαγωγής.</p><pre name="code" class="php">
if($_SERVER['REQUEST_METHOD']=='POST'){
if(isset($_POST['submit'])){
unset($_SESSION['errors']);
unset($_SESSION['error2']);
unset($_SESSION['success']);
</pre><p>Χρησιμοποιούμε όπως και στο παραπάνω παράδειγμα τον έλεγχο για να δούμε τον τρόπο με τον οποίο αποστέλνονται τα δεδομένα εάν είναι έγκυρο αυτό τότε ελέγχουμε αν έχει πατηθεί το κουμπάκι καταχώρηση εάν έχει γίνει σβήνουμε ότι μεταβλητές υπάρχουν στα</p><pre name="code" class="php">
$_SESSION['errors']
$_SESSION['error2']
$_SESSION['success']
</pre><p>για να αποφύγουμε τυχόν λάθη !</p><p>Ο έλεγχος για να δούμε εάν τα πεδία είναι άδεια η έχουν σταλεί λάθος δεδομένα.!</p><pre name="code" class="php">
if(empty($name)){
$_SESSION['errors']=" Το πεδίο όνομα θα πρέπει να συμπληρωθεί "."&lt;br&gt; ";
}
if(empty($pass)){
$_SESSION['errors'].=" Το πεδίο κωδικός θα πρέπει να συμπληρωθεί"." &lt;br&gt; ";
}
if(empty($email) ){
$_SESSION['errors'].=" Το πεδίο email θα πρέπει να συμπληρωθεί "."&lt;br&gt; ";
}
else{
if(!isEmail($email)){
$_SESSION['errors'].="Το πεδίο email θα πρέπει να είναι της μορφής xxx@xxx.xx ";
}
}
</pre><p>Εάν δεν υπάρχουν λάθη τότε  προχωράμε στην σύνδεση της βάσης ελέγχουμε αν υπάρχει κάποιος χρήστης με το όνομα αυτό αν ναι επιστρέφουμε λάθος αν όχι συνεχίζουμε στην εισαγωγή των στοιχείων στην βάση δεδομένων.</p><p>Παρατηρήστε ότι κάνουμε redirect  στην φόρμα για να βγάλουμε κάποια μηνύματα στον χρήστη.</p><pre name="code" class="php">
if(!isset($_SESSION['errors'])){
$query=mysql_query("SELECT Name FROM register where Name='$name' ") or die("Κάτι πήγε στραβά");
$check=mysql_num_rows($query);
if($check &gt; 0){
$_SESSION['error2']="Το όνομα χρήστη $name υπάρχει ήδη στην βάση ";
header( "Location: forma.php" );
}
else {
$query=("INSERT INTO register (Name, Password,Email) VALUES ('$name', '$pass', '$email')");
$insert=mysql_query($query);
$_SESSION['sucess']="Ευχαριστούμε για την εγγραφή";
header( "Location: forma.php" );
}
}
else {
header( "Location: forma.php" );
}
}
?&gt;
</pre><h1>Προσοχή</h1><p>Το db_con(); να γίνεται πριν το  mysql_real_escape_string διότι θα μας προκαλέσει μήνυμα  λάθους.</p><p>Όπως είδαμε η ασφάλεια είναι ένα σημαντικό κομμάτι του προγραμματισμού και μπορεί να διασφαλίσει την ομαλή ροή των δεδομένων και της λειτουργίας των script μας η ολόκληρης της ιστοσελίδας μας !</p><p>Βέβαια υπάρχουν πολλά ακόμη μέτρα ασφαλείας εμείς είδαμε τα βασικά.</p> ]]></content:encoded> <wfw:commentRss>http://greektuts.net/register-system-part2-security-and-optimization/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Απλό Σύστημα Εγγραφής Χρηστών</title><link>http://greektuts.net/register-system/</link> <comments>http://greektuts.net/register-system/#comments</comments> <pubDate>Wed, 21 Jul 2010 07:50:22 +0000</pubDate> <dc:creator>Jimakos</dc:creator> <category><![CDATA[HTML]]></category> <category><![CDATA[MySQL]]></category> <category><![CDATA[PHP]]></category> <category><![CDATA[jimakos]]></category> <category><![CDATA[login]]></category> <category><![CDATA[login system]]></category> <category><![CDATA[register]]></category> <category><![CDATA[register system]]></category> <category><![CDATA[sql]]></category> <guid
isPermaLink="false">http://greektuts.net/?p=4082</guid> <description><![CDATA[Αναρωτηθήκατε ποτέ πως είναι ένα σύστημα πρόσβασης χρηστών σε μια ιστοσελίδα; Σε αυτό το βοήθημα λοιπόν θα δούμε πως μπορούμε να δημιουργήσουμε για αρχή ένα απλό σύστημα εγγραφής χρηστών, χρησιμοποιόντας απλές εντολές της PHP, λίγη SQL και HTML.]]></description> <content:encoded><![CDATA[<h1>H Φόρμα Εγγραφής</h1><p>Καταρχάς θα χρειαστούμε μια φόρμα την οποία πρέπει να συμπληρώσει ο χρήστης για να προχωρήσει στην εγγραφή του .</p><p>Ο παρακάτω κώδικας είναι μια απλή φόρμα με λίγο κώδικα της php ο οποίος θα μας χρησιμεύσει αργότερα για την εμφάνιση μηνυμάτων.</p><pre name="code" class="php">
forma.php
&lt;?php
session_start();
?&gt;
&lt;html &gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8" /&gt;
&lt;title&gt;Φόρμα Εισαγωγής στοιχείων&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;pre&gt;
&lt;form action="register.php" method="get" &gt;
Όνομα : &lt;input name="name" style="background:#3281C0" /&gt;&lt;br /&gt;
Κωδικός:&lt;input name="name" style="background:#3281C0"  /&gt;&lt;br /&gt;
Email : &lt;input name="email"  style="background:#3281C0"  /&gt;
&lt;br /&gt;
&lt;input value="Καταχωρηση" /&gt;
&lt;?php
if (isset($_SESSION['errors'])){
echo $_SESSION['errors'];
}
else
echo $_SESSION['error2']; ?&gt;
&lt;/pre&gt;
&lt;/form&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre><h1>Η Βάση Δεδομένων</h1><p>Έπειτα θα χρειαστούμε μια βάση δεδομένων στην οποία θα καταχωρήσουμε τα στοιχειά που θα εισάγουν οι χρήστες</p><p>Ας δούμε λοιπόν πως θα δημιουργήσουμε αυτή την βάση :</p><p>Δημιουργία βάσης :</p><pre name="code" class="php">
CREATE DATABASE `Greektuts` ;
</pre><p>έπειτα αφού επιλέξουμε την βάση δημιουργούμε έναν πίνακα:</p><p>Δημιουργία πίνακα:</p><pre name="code" class="php">
CREATE TABLE `Greektuts`.`Register` (
`Name` VARCHAR( 40 ) NOT NULL ,
`Password` VARCHAR( 40 ) NOT NULL ,
`Email` VARCHAR( 60 ) NOT NULL ,
PRIMARY KEY ( `Name` )
) ENGINE = MYISAM ;
</pre><p>Έτσι έχουμε δημιουργήσει την βάση μας και τον πίνακα μας .</p><h1>Διαχείρηση Δεδομένων</h1><p>Τώρα το κομμάτι του κώδικα που θα διαχειριστεί τα δεδομένα:</p><p>Δημιουργούμε ένα αρχείο php με όνομα register.php</p><p>Για αρχή θα δημιουργήσουμε μια function για να διαχειριζόμαστε την σύνδεση μας με την βάση</p><pre name="code" class="php">
&lt;?php
function db_con(){
$connection=mysql_connect("$localhost","$db_username","db_password") or die("Δεν επιτεύχθηκε η σύνδεση");
$db_selct=mysql_select_db($db_name,$connection) or die("Δεν επιτεύχθηκε η σύνδεση με τον πίνακα ");
}
?&gt;
</pre><p>Λοιπόν δημιουργήσαμε μια μέθοδο για να μπορούμε να την καλούμε όποτε εμείς θέλουμε</p><p>Ας δούμε αναλυτικά τι κάναμε μέχρι στιγμής</p><p>Είναι ο κώδικας σύνδεσης στην βάση</p><pre name="code" class="php">
$connection=mysql_connect("$localhost","$db_username","db_password") or die("Δεν επιτεύχθηκε η σύνδεση");
</pre><p>Σημαντικό*</p><p>Αντικαταστήστε το $localhost,$db_username,$db_password και παρακάτω το $db_name</p><p>με τα δικά σας στοιχειά ένα παράδειγμα :</p><pre name="code" class="php">
$connection=mysql_connect("localhost","root","") or die("Δεν επιτεύχθηκε η σύνδεση");
</pre><p>Η σύνδεση αυτή καθορίζει το όνομα της βάσης την οποία θέλουμε να επιλέξουμε</p><pre name="code" class="php">
$db_selct=mysql_select_db($db_name,$connection) or die("Δεν επιτεύχθηκε η σύνδεση με τον πίνακα ");
</pre><p>Έπειτα προχωράμε παρακάτω :</p><pre name="code" class="php">
&lt;?php
session_start();
$name = $_POST['name'];
$pass = $_POST['password'];
$email = $_POST['email'];
if(isset($_POST['submit'])){
unset($_SESSION['errors']);
if(empty($name)){
$_SESSION['errors']=" Το πεδίο όνομα θα πρέπει να συμπληρωθεί ";
}
if(empty($pass)){
$_SESSION['errors'].=" Το πεδιο κωδικός θα πρέπει να συμπληρωθεί ";
}
if(empty($email)){
$_SESSION['errors'].=" Το πεδιο email θα πρεπει να συμπληρωθει ";
}
</pre><p>Εδώ απλά κάνουμε έναν έλεγχο απλό για το αν έχουν εισαχθεί δεδομένα στην φόρμα που είχαμε δημιουργήσει προηγουμένως.</p><p>Ας το πάρουμε κομμάτι κομμάτι</p><pre name="code" class="php">
session_start();
</pre><p>αυτή η μέθοδος θα μας χρησιμεύσει αργότερα για την επιστροφή μηνυμάτων στον χρήστη .</p><p>Ο παρακάτω κώδικας ελέγχει αν έχει “πατηθεί “ το κουμπί Καταχώρησε αν όντως έχει “πατηθεί”</p><p>τότε βγάζει όλα τα δεδομένα από το $_SESSION['errors'] ώστε να μην έχουμε κολλήματα αργότερα</p><pre name="code" class="php">
if(isset($_POST['submit'])){
unset($_SESSION['errors']);
</pre><p>Εδώ κάνουμε έναν έλεγχο από τους πιο απλούς που θα μπορούσατε να κάνετε</p><p>ελέγχουμε αν το πεδίο όνομα είναι άδειο αν ναι τότε εκχωρούμε μέσα στο $_SESSION  το ακόλουθο μήνυμα. Το ίδιο γίνετε για όλα τα πεδία τα οποία θέλουμε να ελέγξουμε.</p><pre name="code" class="php">
if(empty($name)){
$_SESSION['errors']=" Το πεδίο όνομα θα πρέπει να συμπληρωθεί ";
}
</pre><p>Παρατήρηση στο δεύτερο έλεγχο και ούτω κάθε ξης βάζουμε μια . πριν το =</p><p>Τέλος προσθέτουμε λίγο ακόμη έλεγχο και είμαστε έτοιμοι</p><pre name="code" class="php">
if(!isset($_SESSION['errors'])){
db_con();
$query=mysql_query("SELECT * FROM register where Name='$name' ") or die("Κάτι πήγε στραβά");
$check=mysql_num_rows($query);
if($check &gt;0){
$_SESSION['error2']="Το όνομα χρήστη $name υπάρχει ήδη στην βάση ";
header( "Location: forma.php" );
}
else {
$query=("INSERT INTO register (Name, Password,Email) VALUES ('$name', '$pass', '$email')");
$insert=mysql_query($query);
}
}
else {
header( "Location: forma.php" );
}
}
</pre><p>Ελέγχουμε αν υπάρχουν errors αν όχι τότε προχωράμε στον επόμενο έλεγχο ο οποίος είναι η ύπαρξη του ονόματος που εισαχθεί μέσα στην βάση μας. Εάν υπάρχει τότε δηλώνουμε το μήνυμα σε μια μεταβλητή και στέλνουμε τον χρήστη πίσω στην φόρμα εκεί θα του επιστρέφουν τα ανάλογα μηνύματα.</p><blockquote
style="text-align: center;"><p><em><strong>Μπορείτε να κατεβάσετε τα     αρχεία του βοηθήματος εδώ</strong></em></p><p><em><strong><a
href="http://static.greektuts.net/uploads3/2010/07/register-system.zip" target="_blank"><img
src="../wp-content/uploads/2009/10/membersdownload1.png" alt="download" width="200" height="200" /></a></strong></em></p></blockquote><p
style="text-align: center;"><p>﻿</p> ]]></content:encoded> <wfw:commentRss>http://greektuts.net/register-system/feed/</wfw:commentRss> <slash:comments>20</slash:comments> </item> <item><title>Eiσαγωγή στην PHP Μέρος 4</title><link>http://greektuts.net/php-intro-part4/</link> <comments>http://greektuts.net/php-intro-part4/#comments</comments> <pubDate>Thu, 17 Jun 2010 07:25:15 +0000</pubDate> <dc:creator>Pantso</dc:creator> <category><![CDATA[PHP]]></category> <category><![CDATA[intro]]></category> <category><![CDATA[part4]]></category> <category><![CDATA[Εισαγωγη στην PHP]]></category> <category><![CDATA[Μέρος 4]]></category> <category><![CDATA[τέσσερα]]></category> <category><![CDATA[τέταρτο]]></category> <guid
isPermaLink="false">http://greektuts.net/?p=3957</guid> <description><![CDATA[Στα προηγούμενα μέρη της εισαγωγής στην PHP είδαμε τις βασικές έννοιες και συναρτήσεις ενώ μιλήσαμε για την δομή και τις μεταβλητές που χρησιμοποιούμε στην PHP. Σε αυτό το 4ο μέρος, θα δούμε τα ψευδώνυμα (Aliases) των στηλών και των πινάκων που μπορούμε να χρησιμοποιήσουμε αλλά και 3 νέες εκφράσεις που χρησιμοποιούνται στην PHP]]></description> <content:encoded><![CDATA[<h1>Ψευδώνυμα (Aliases) Στηλών και Πινάκων</h1><p>Μερικές φορές είναι βολικό να αναφερόμαστε στις στήλες και στους πίνακες της MySQL με διαφορετικά ονόματα. Θα δούμε ένα παράδειγμα μιας βάσης δεδομένων που χρησιμοποιείται στο σύστημα κρατήσεων online μιας αεροπορικής εταιρείας. Για να παρουσιάσει τις πτήσεις που προσφέρονται από την εταιρεία, η βάση δεδομένων περιέχει τους εξής δύο πίνακες : Flights και Cities.<br
/> Η κάθε καταχώρηση στον πίνακα Flights παριστάνει μια πραγματική πτήση ανάμεσα σε δύο πόλεις, την αρχή και τον προορισμό της πτήσης. Προφανώς, οι Origin και Destination θα αποτελούν στήλες του πίνακα Flights, μαζί μ’ άλλες στήλες για πράγματα όπως η ημερομηνία και η ώρα της πτήσης, ο τύπος του αεροσκάφους, ο αριθμός της πτήσης και τα διάφορα ναύλα.<br
/> Ο πίνακας Cities περιέχει μια λίστα όλων των πόλεων προς τις οποίες πετάει η εταιρεία. Έτσι, και οι δύο στήλες Origin και Destination στον πίνακα Flights θα πρέπει να περιέχουν κωδικούς (ID&#8217;s) για να αναφέρονται στις καταχωρήσεις του πίνακα Cities. Θα δούμε τώρα μερικά ερωτήματα (queries).<br
/> Για να πάρουμε μια λίστα όλων των πτήσεων με τις πόλεις προέλευσής τους :</p><pre name="code" class="html">
mysql&gt; SELECT Flights.Number, Cities.Name
-&gt; FROM Flights, Cities
-&gt; WHERE Flights.Origin = Cities.ID;
+--------+-----------+
| Number | Name      |
+--------+-----------+
| CP110  | Montreal  |
| CP226  | Sydney    |
| QF2026 | Melbourne |
...      ...
</pre><p>Για να πάρουμε μια λίστα όλων των πτήσεων με τις πόλεις προορισμού τους :</p><pre name="code" class="html">
mysql&gt; SELECT Flights.Number, Cities.Name
-&gt; FROM Flights, Cities
-&gt; WHERE Flights.Destination = Cities.ID;
+--------+----------+
| Number | Name     |
+--------+----------+
| CP110  | Sydney   |
| CP226  | Montreal |
| QF2026 | Sydney   |
...      ...
</pre><p>Τι μπορούμε να κάνουμε τώρα αν θέλουμε να εμφανίσουμε την προέλευση και τον προορισμό της κάθε πτήσης μ’ ένα μόνο ερώτημα; Ένα ερώτημα που μπορεί να σκεφθούμε να χρησιμοποιήσουμε είναι το εξής :</p><pre name="code" class="html">
mysql&gt; SELECT Flights.Number, Cities.Name, Cities.Name
-&gt; FROM Flights, Cities
-&gt; WHERE Flights.Origin = Cities.ID
-&gt; AND Flights.Destination = Cities.ID;
Empty set (0.01 sec)
</pre><p>Το παραπάνω ερώτημα δεν δουλεύει επειδή λέμε στην MySQL να ενώσει (join) τους πίνακες Flights και Cities και να εμφανίσει τον αριθμό πτήσης, το όνομα της πόλης και το όνομα της πόλης ξανά όλων των καταχωρήσεων που επιστρέφονται αν ταιριάξουμε το Origin με το City ID και το Destination με το City ID.<br
/> Μ’ άλλα λόγια, οι στήλες Origin, Destination και City ID πρέπει να είναι ίσες μεταξύ τους. Αυτό έχει σαν αποτέλεσμα μια λίστα όλων των πτήσεων όπου η προέλευση και ο προορισμός είναι ίδιοι. Δεν θα υπάρχουν λοιπόν καθόλου καταχωρήσεις που να ταιριάζουν με την παραπάνω περιγραφή και έτσι είχαμε το αποτέλεσμα &#8220;Empty set&#8221;.<br
/> Αυτό που χρειαζόμαστε είναι ένας τρόπος να μπορούμε να επιστρέψουμε δύο διαφορετικές καταχωρήσεις από τον πίνακα Cities, μια για την προέλευση και μια για τον προορισμό, για κάθε αποτέλεσμα. Αν είχαμε δύο αντίγραφα του πίνακα, ένα με όνομα Origins και ένα με όνομα Destinations, αυτό θα ήταν πολύ εύκολο να γίνει, αλλά γιατί να έχουμε δύο πίνακες που να περιέχουν την ίδια ακριβώς λίστα των πόλεων;<br
/> Η λύση είναι να δώσουμε στον πίνακα Cities δύο διαφορετικά προσωρινά ονόματα (ψευδώνυμα, aliases) για τους σκοπούς αυτού του ερωτήματος (query). Αν γράψουμε μετά από το όνομα ενός πίνακα την έκφραση AS Alias στο τμήμα FROM του ερωτήματος SELECT, μπορούμε να του δώσουμε ένα προσωρινό όνομα με το οποίο να αναφερόμαστε σ’ αυτό οπουδήποτε στο ερώτημα. Ακολουθεί το παραπάνω ερώτημα ξανά, αλλά αυτή τη φορά έχουμε δώσει στον πίνακα Cities το ψευδώνυμο (alias) Origins.</p><pre name="code" class="html">
mysql&gt; SELECT Flights.Number, Origins.Name
-&gt; FROM Flights, Cities AS Origins
-&gt; WHERE Flights.Origin = Origins.ID;
</pre><p>Αναφερόμενοι στον πίνακα Cities δύο φορές, χρησιμοποιώντας δύο διαφορετικά ψευδώνυμα (aliases), μπορούμε να χρησιμοποιήσουμε μια ένωση (join) τριών πινάκων, όπου οι δύο από τους πίνακες θα είναι ουσιαστικά ίδιοι, για να πάρουμε το αποτέλεσμα που θέλουμε :</p><pre name="code" class="html">
mysql&gt; SELECT Flights.Number, Origins.Name,
-&gt;        Destinations.Name
-&gt; FROM Flights, Cities AS Origins,
-&gt;      Cities AS Destinations
-&gt; WHERE Flights.Origin = Origins.ID
-&gt; AND Flights.Destination = Destinations.ID;
+--------+-----------+----------+
| Number | Name      | Name     |
+--------+-----------+----------+
| CP110  | Montreal  | Sydney   |
| CP226  | Sydney    | Montreal |
| QF2026 | Melbourne | Sydney   |
...      ...         ...
</pre><p>Μπορούμε επίσης να ορίσουμε ψευδώνυμα για τα ονόματα στηλών. Θα μπορούμε να το χρησιμοποιήσουμε αυτό, για παράδειγμα, για να διαχωρίσουμε τις δύο στήλες &#8220;Name&#8221; στον παραπάνω πίνακα αποτελεσμάτων :</p><pre name="code" class="html">
mysql&gt; SELECT F.Number, O.Name AS Origin,
-&gt;        D.Name AS Destination
-&gt; FROM Flights AS F, Cities AS O, Cities AS D
-&gt; WHERE F.Origin = O.ID AND F.Destination = D.ID;
+--------+-----------+-------------+
| Number | Origin    | Destination |
+--------+-----------+-------------+
| CP110  | Montreal  | Sydney      |
| CP226  | Sydney    | Montreal    |
| QF2026 | Melbourne | Sydney      |
...      ...         ...
</pre><h1>Η Έκφραση GROUP BY</h1><p>Στα προηγούμενα, είχαμε δει το παρακάτω query, το οποίο μας εμφανίζει πόσα jokes είναι αποθηκευμένα στον πίνακα Jokes :</p><pre name="code" class="html">
mysql&gt; SELECT COUNT(*) FROM Jokes;
+----------+
| COUNT(*) |
+----------+
|        4 |
+----------+
</pre><p>Η συνάρτηση COUNT() της MySQL ανήκει σε μια ειδική κατηγορία συναρτήσεων άθροισης (summary functions) ή συναρτήσεων ομαδοποίησης (group-by functions). Σ’ αντίθεση μ’ άλλες συναρτήσεις οι οποίες επηρεάζουν τις καταχωρήσεις στο αποτέλεσμα του ερωτήματος SELECT, οι συναρτήσεις άθροισης ομαδοποιούν μαζί όλα τα αποτελέσματα και επιστρέφουν ένα μόνο αποτέλεσμα.<br
/> Στο παραπάνω παράδειγμα, η συνάρτηση COUNT() επιστρέφει τον συνολικό αριθμό των γραμμών του αποτελέσματος.<br
/> Ας υποθέσουμε ότι θέλουμε να εμφανίσουμε μια λίστα των συγγραφέων με τον αριθμό των jokes που αντιστοιχεί στον καθένα. Η πρώτη μας σκέψη θα ήταν να πάρουμε μια λίστα των ονομάτων και των ID’s όλων των συγγραφέων και μετά να χρησιμοποιήσουμε τη συνάρτηση COUNT() για να μετρήσουμε τον αριθμό των αποτελεσμάτων όταν κάνουμε SELECT στα jokes με το ID του κάθε συγγραφέα. Ο PHP κώδικας θα είναι ως εξής :</p><pre name="code" class="html">
// Μια λίστα όλων των συγγραφέων
$authors = mysql_query( "SELECT Name, ID FROM Authors" );
// Επεξεργασία του κάθε συγγραφέα
while ($author = mysql_fetch_array($authors)) {
$name = $author["Name"];
$id = $author["ID"];
// Μέτρηση των jokes που ανήκουν σ' αυτόν τον συγγραφέα
$result = mysql_query(
"SELECT COUNT(*) AS NumJokes ".
"FROM Jokes WHERE AID=$id" );
$row = mysql_fetch_array($result);
$numjokes = $row["NumJokes"];
// Εμφάνιση του συγγραφέα και του αριθμού των jokes
echo("&lt;P&gt;$name ($numjokes jokes)&lt;/P&gt;");
}
</pre><p>Χρησιμοποιήσαμε το AS στο δεύτερο query παραπάνω για να δώσουμε ένα φιλικότερο όνομα (NumJokes) στο αποτέλεσμα της COUNT(*). Η τεχνική αυτή θα δουλέψει αλλά θα χρειασθεί n+1 ξεχωριστά ερωτήματα, όπου n είναι ο αριθμός των συγγραφέων στη βάση δεδομένων. Υπάρχει, όμως, μια λύση σ’ αυτό.<br
/> Προσθέτοντας την έκφραση GROUP BY σ’ ένα ερώτημα SELECT, μπορούμε να πούμε στην MySQL να ομαδοποιήσει (group) τα αποτελέσματα του ερωτήματος σε σύνολα που να έχουν την ίδια τιμή στις στήλες που έχουμε καθορίσει. Οι συναρτήσεις άθροισης, όπως είναι η COUNT(), επενεργούν μετά σ’ αυτές τις ομάδες και όχι στο συνολικό αποτέλεσμα.<br
/> Το ακόλουθο query, για παράδειγμα, εμφανίζει τον αριθμό των jokes που έχουν αποδοθεί σε κάθε συγγραφέα στη βάση δεδομένων :</p><pre name="code" class="html">
mysql&gt; SELECT Authors.Name, COUNT(*) AS NumJokes
-&gt; FROM Jokes, Authors
-&gt; WHERE AID = Authors.ID
-&gt; GROUP BY AID;
+-----------------+----------+
| Name            | NumJokes |
+-----------------+----------+
| Kevin Yank      |        3 |
| Joan Smith      |        1 |
| Ted E. Bear     |        5 |
+-----------------+----------+
</pre><p>Ομαδοποιώντας τα αποτελέσματα ως προς το ID του συγγραφέα (AID), παίρνουμε μια ταξινόμηση των αποτελεσμάτων για τον κάθε συγγραφέα. Θα μπορούσαμε να είχαμε χρησιμοποιήσει και την έκφραση GROUP BY Authors.ID και να πάρουμε το ίδιο αποτέλεσμα.</p><h1>Η Έκφραση LEFT JOIN</h1><p>Μπορούμε να δούμε από τα παραπάνω αποτελέσματα ότι ο Kevin Yank έχει τρία jokes στο όνομά του, ο Joan Smith έχει ένα και ο Ted E. Bear έχει πέντε. Αυτό που δεν δείχνουν αυτά τα αποτελέσματα είναι ότι υπάρχει ένας τέταρτος συγγραφέας, η Amy Mathieson, που δεν έχει κανένα joke στο όνομά της. Εφόσον δεν υπάρχουν καταχωρήσεις στον πίνακα Jokes με AID&#8217;s που να ταιριάζει το δικό της ID, δεν θα υπάρχουν αποτελέσματα που να ικανοποιούν την έκφραση WHERE στο παραπάνω ερώτημα γι’ αυτήν και συνεπώς θα αποκλειστεί από τον πίνακα των αποτελεσμάτων.<br
/> Η MySQL παρέχει μια άλλη μέθοδο για την ένωση (joining) πινάκων, δηλ. την εμφάνιση πληροφοριών από πολλούς πίνακες ταυτόχρονα, που απoκαλείται left join, και είναι σχεδιασμένη γι’ αυτήν ακριβώς την κατάσταση. Για να κατανοήσουμε πώς διαφέρουν τα left joins από τα standard joins, πρέπει πρώτα να θυμηθούμε πώς δουλεύουν τα standard joins.<br
/> Η MySQL εκτελεί ένα standard join δύο πινάκων εμφανίζοντας όλους τους δυνατούς συνδυασμούς των γραμμών αυτών των πινάκων. Σε μια απλή περίπτωση, ένα standard join δύο πινάκων με δύο γραμμές για τον καθένα θα περιέχει τέσσερις γραμμές. Αφού υπολογισθούν οι γραμμές του αποτελέσματος, η MySQL μετά κοιτάει την έκφραση WHERE για να πάρει οδηγίες για το ποιες γραμμές πρέπει να εμφανισθούν, όπως για παράδειγμα εκείνες που η στήλη AID του πίνακα 1 θα ταιριάζει με τη στήλη ID του πίνακα 2.<br
/> Ο λόγος που το παραπάνω δεν ικανοποιεί τους σκοπούς μας είναι ότι θα θέλαμε να συμπεριλάβουμε επίσης και τις γραμμές του πίνακα 1 (Authors) που δεν έχουν κάποιες γραμμές που να ταιριάζουν στον πίνακα 2 (Jokes). Ένα left join κάνει ό,τι ακριβώς χρειαζόμαστε, αναγκάζοντας μια γραμμή να εμφανισθεί στα αποτελέσματα για κάθε γραμμή του πρώτου (αριστερού) πίνακα, ακόμη κι αν δεν βρεθούν καταχωρήσεις που να ταιριάζουν στον δεύτερο (δεξιό) πίνακα. Αυτές οι καταχωρήσεις παίρνουν τιμές NULL γι’ όλες τις στήλες του δεξιού πίνακα.<br
/> Για να κάνουμε ένα left join ανάμεσα σε δύο πίνακες στην MySQL, διαχωρίζουμε τα ονόματα των δύο πινάκων στην έκφραση FROM με το LEFT JOIN αντί με κόμμα. Γράφουμε μετά το όνομα του δεύτερου πίνακα με ON &lt;συνθήκη&gt;, όπου η &lt;συνθήκη&gt; καθορίζει τα κριτήρια ταιριάσματος των γραμμών στους δύο πίνακες. Ακολουθεί το αναθεωρημένο ερώτημα για την εμφάνιση των συγγραφέων με τον αριθμό των jokes που τους έχει αποδοθεί :</p><pre name="code" class="html">
mysql&gt; SELECT Authors.Name, COUNT(*) AS NumJokes
-&gt; FROM Authors LEFT JOIN Jokes
-&gt; ON AID = Authors.ID
-&gt; GROUP BY AID;
+---------------+----------+
| Name          | NumJokes |
+---------------+----------+
| Amy Mathieson |        1 |
| Kevin Yank    |        3 |
| Joan Smith    |        1 |
| Ted E. Bear   |        5 |
+---------------+----------+
</pre><p>Πρέπει να έχουμε υπόψη μας ότι η συνάρτηση COUNT(*) μετράει τον αριθμό των γραμμών που επιστρέφονται για κάθε συγγραφέα. Αν κοιτάξουμε στα μη ομαδοποιημένα αποτελέσματα του LEFT JOIN, θα δούμε τα εξής :</p><pre name="code" class="html">
mysql&gt; SELECT Authors.Name, Jokes.ID AS JokeID
-&gt; FROM Authors LEFT JOIN Jokes
-&gt; ON AID = Authors.ID;
+---------------+--------+
| Name          | JokeID |
+---------------+--------+
| Kevin Yank    |      1 |
| Kevin Yank    |      2 |
| Kevin Yank    |      4 |
| Joan Smith    |      3 |
| Ted E. Bear   |      5 |
| Ted E. Bear   |      6 |
| Ted E. Bear   |      7 |
| Ted E. Bear   |      8 |
| Ted E. Bear   |      9 |
| Amy Mathieson |   NULL |
+---------------+--------+
</pre><p>Τώρα η Amy Mathieson έχει μια γραμμή με τιμή NULL. Το ότι η τιμή του Joke ID είναι NULL δεν επηρεάζει την συνάρτηση COUNT(*) αυτή το μετράει σαν μια γραμμή. Αν αντί για το *, προσδιορίσουμε το όνομα μιας στήλης, όπως Jokes.ID, θα αγνοήσει τις τιμές NULL αυτής της στήλης και θα μας δώσει το αποτέλεσμα που ψάχνουμε :</p><pre name="code" class="html">
mysql&gt; SELECT Authors.Name, COUNT(Jokes.ID) AS NumJokes
-&gt; FROM Authors LEFT JOIN Jokes
-&gt; ON AID = Authors.ID
-&gt; GROUP BY AID;
+---------------+----------+
| Name          | NumJokes |
+---------------+----------+
| Amy Mathieson |        0 |
| Kevin Yank    |        3 |
| Joan Smith    |        1 |
| Ted E. Bear   |        5 |
+---------------+----------+
</pre><h1>Η Έκφραση HAVING</h1><p>Τι γίνεται, όμως, αν θελήσουμε μια λίστα μόνο εκείνων των συγγραφέων που δεν έχουν κανένα joke στο όνομά τους; Ας δούμε πρώτα το ερώτημα που θα επέλεγαν οι περισσότεροι χρήστες :</p><pre name="code" class="html">
mysql&gt; SELECT Authors.Name, COUNT(Jokes.ID) AS NumJokes
-&gt; FROM Authors LEFT JOIN Jokes
-&gt; ON AID = Authors.ID
-&gt; WHERE NumJokes = 0
-&gt; GROUP BY AID;
ERROR 1054: Unknown column 'NumJokes' in 'where clause'
</pre><p>Ο λόγος που η έκφραση WHERE NumJokes = 0 δεν μας έκανε τη δουλειά είναι επειδή οι συνθήκες στην έκφραση WHERE επηρεάζουν τις καταχωρήσεις που έχουν επιλεγεί πριν ομαδοποιηθούν σύμφωνα με την έκφραση GROUP BY.<br
/> Έτσι, αν θελήσουμε να αποκλείσουμε από το μέτρημα τα jokes που περιέχουν τη λέξη &#8220;chicken&#8221;, θα μπορούσαμε να χρησιμοποιήσουμε την έκφραση WHERE, όμως εφόσον η στήλη NumJokes δεν υπάρχει πριν επενεργήσει η GROUP BY, θα πρέπει να χρησιμοποιήσουμε μια διαφορετική μέθοδο για να ορίσουμε συνθήκες.<br
/> Οι συνθήκες που επηρεάζουν τα αποτελέσματα αφού έχει γίνει η ομαδοποίηση (grouping) πρέπει να εμφανισθούν σε μια ειδική έκφραση HAVING. Έτσι λοιπόν, το σωστό ερώτημα είναι το εξής :</p><pre name="code" class="html">
mysql&gt; SELECT Authors.Name, COUNT(Jokes.ID) AS NumJokes
-&gt; FROM Authors LEFT JOIN Jokes
-&gt; ON AID = Authors.ID
-&gt; GROUP BY AID
-&gt; HAVING NumJokes = 0;
+---------------+----------+
| Name          | NumJokes |
+---------------+----------+
| Amy Mathieson |        0 |
+---------------+----------+
</pre><p>Μερικές συνθήκες εργάζονται και στις δύο εκφράσεις HAVING και WHERE. Για παράδειγμα, αν θελήσουμε να αποκλείσουμε έναν συγκεκριμένο συγγραφέα με το όνομά του, θα μπορούσαμε να χρησιμοποιήσουμε το Authors.Name != &#8220;AuthorName&#8221; σε μια από τις εκφράσεις WHERE ή HAVING, επειδή αν φιλτράρουμε τον συγγραφέα πριν ή μετά από την ομαδοποίηση, θα πάρουμε τα ίδια αποτελέσματα.<br
/> Σε μερικές περιπτώσεις, είναι πάντα καλύτερο να χρησιμοποιούμε την έκφραση WHERE, επειδή η MySQL είναι καλύτερη στο να βελτιστοποιεί εσωτερικά τέτοια ερωτήματα και έτσι εκτελούνται ταχύτερα.</p> ]]></content:encoded> <wfw:commentRss>http://greektuts.net/php-intro-part4/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Eiσαγωγή στην PHP Μέρος 3</title><link>http://greektuts.net/php-intro-part3/</link> <comments>http://greektuts.net/php-intro-part3/#comments</comments> <pubDate>Sat, 05 Jun 2010 06:22:55 +0000</pubDate> <dc:creator>Pantso</dc:creator> <category><![CDATA[PHP]]></category> <category><![CDATA[intro]]></category> <category><![CDATA[introduction]]></category> <category><![CDATA[εισαγωγή στην php μέρος 3]]></category> <guid
isPermaLink="false">http://greektuts.net/?p=3915</guid> <description><![CDATA[Στο δεύτερο μέρος της εισαγωγής στην PHP μιλήσαμε για τα Regular Expressions, για την μορφωποίηση των κειμένων, τις παραγράφους και τους υπερσύνδεσμους. Στο τρίτο μέρος, θα μιλήσουμε περί περιεχομένου, θα δούμε κάποια προχωρημένα πράγματα για SQL, και θα δούμε τέλος και την ταξινόμηση με την Order By]]></description> <content:encoded><![CDATA[<h1><strong>Διαχωρισμός Κειμένου σε Σελίδες</strong></h1><p>Αν και κανένα joke δεν είναι πιθανό να είναι τόσο μεγάλο που να χρειάζεται περισσότερες από μία σελίδες, πολλά content-driven sites περιέχουν μεγάλο περιεχόμενο που είναι συχνά καλύτερο να παρουσιασθεί διασπασμένο σε σελίδες. Υπάρχει μια ακόμη συνάρτηση στην PHP που το κάνει αυτό πολύ εύκολα. Η <em>split</em><em>()</em> είναι μια συνάρτηση που δέχεται μια κανονική έκφραση και ένα string κειμένου και χρησιμοποιεί ταιριάσματα για την κανονική έκφραση για να διασπάσει το κείμενο σ’ έναν πίνακα (array). Ας δούμε το ακόλουθο παράδειγμα :</p><pre name="code" class="php">
$regexp="[ \n\r\t]+";   // Ένας ή περισσότεροι whitespace characters
$text="This is a test.";
$textarray=split($regexp, $text);
echo("$textarray[0]&lt;BR&gt;");         // Εμφανίζει "This&lt;BR&gt;"
echo("$textarray[1]&lt;BR&gt;");         // Εμφανίζει "is&lt;BR&gt;"
echo("$textarray[2]&lt;BR&gt;");         // Εμφανίζει "a&lt;BR&gt;"
echo("$textarray[3]&lt;BR&gt;");         // Εμφανίζει "test.&lt;BR&gt;"
</pre><p>Αν αντί να αναζητούμε έναν whitespace character αναζητούμε ένα [PAGEBREAK] tag και αντί να εμφανίζουμε όλα τα κομμάτια του κειμένου εμφανίσουμε μόνο τη σελίδα που μας ενδιαφέρει, η οποία δείχνεται από μια μεταβλητή $page που μεταβιβάζεται μαζί με την αίτηση για τη σελίδα (page request), για παράδειγμα, μπορούμε να διαιρέσουμε το περιεχόμενο σε σελίδες.</p><pre name="code" class="php">
// Αν δεν έχει καθορισθεί κάποια σελίδα, default είναι η
// πρώτη σελίδα ($page = 0)
if (!isset($page)) $page = 0;
// Διαιρούμε το κείμενο σ’ έναν πίνακα (array) από σελίδες
$textarray=split("\[PAGEBREAK]", $text);
// Επιλέγουμε τη σελίδα που θέλουμε
$pagetext=$textarray[$page];
$regexp="[ \n\r\t]+";   // Ένας ή περισσότεροι whitespace characters
$text="This is a test.";
$textarray=split($regexp, $text);
echo("$textarray[0]&lt;BR&gt;");         // Εμφανίζει "This&lt;BR&gt;"
echo("$textarray[1]&lt;BR&gt;");         // Εμφανίζει "is&lt;BR&gt;"
echo("$textarray[2]&lt;BR&gt;");         // Εμφανίζει "a&lt;BR&gt;"
echo("$textarray[3]&lt;BR&gt;");         // Εμφανίζει "test.&lt;BR&gt;"
</pre><p>Αν αντί να αναζητούμε έναν whitespace character αναζητούμε ένα [PAGEBREAK] tag και αντί να εμφανίζουμε όλα τα κομμάτια του κειμένου εμφανίσουμε μόνο τη σελίδα που μας ενδιαφέρει, η οποία δείχνεται από μια μεταβλητή $page που μεταβιβάζεται μαζί με την αίτηση για τη σελίδα (page request), για παράδειγμα, μπορούμε να διαιρέσουμε το περιεχόμενο σε σελίδες.</p><pre name="code" class="php">
// Αν δεν έχει καθορισθεί κάποια σελίδα, default είναι η
// πρώτη σελίδα ($page = 0)
if (!isset($page)) $page = 0;
// Διαιρούμε το κείμενο σ’ έναν πίνακα (array) από σελίδες
$textarray=split("\[PAGEBREAK]", $text);
// Επιλέγουμε τη σελίδα που θέλουμε
$pagetext=$textarray[$page];
</pre><p>Φυσικά, θα θελήσουμε να έχουμε κάποιον τρόπο μετακίνησης ανάμεσα στις σελίδες. Θα τοποθετήσουμε έναν σύνδεσμο (link) προς την προηγούμενη σελίδα στην κορυφή της τρέχουσας σελίδας και έναν σύνδεσμο προς την επόμενη σελίδα στη βάση της τρέχουσας σελίδας. Αν αυτή είναι η πρώτη σελίδα δεν θα χρειασθούμε ένα link προς την προηγούμενη σελίδα. Γνωρίζουμε ότι βρισκόμαστε στην πρώτη σελίδα αν το $page είναι ίσο με 0. Παρόμοια, δεν χρειαζόμαστε ένα link προς την επόμενη σελίδα όταν βρισκόμαστε στην τελευταία σελίδα.</p><p>Για να είμαστε σίγουροι ότι βρισκόμαστε στην τελευταία σελίδα, χρειαζόμαστε μια συνάρτηση της PHP με όνομα <em>count</em><em>()</em>, η οποία δέχεται έναν πίνακα (array) και επιστρέφει τον αριθμό των στοιχείων του πίνακα. Αν μεταβιβάσουμε τον πίνακα των σελίδων, η count() θα μας πει πόσες σελίδες υπάρχουν. Αν υπάρχουν 10 σελίδες, τότε το $textarray[9] θα περιέχει την τελευταία σελίδα. Έτσι, γνωρίζουμε ότι βρισκόμαστε στην τελευταία σελίδα αν το $page είναι ίσο με count($textarray) – 1.</p><p>Ο κώδικας για τα links μετάβασης ανάμεσα στις σελίδες είναι ο εξής :</p><pre name="code" class="php">
if ($page != 0) {
$prevpage = $page - 1;
echo("&lt;P&gt;&lt;A HREF=\"$PHP_SELF?id=$id&amp;page=$prevpage\"&gt;".
"Προηγούμενη Σελίδα&lt;/A&gt;&lt;/P&gt;");
}
// Το περιεχόμενο της σελίδας εμφανίζεται εδώ …
if ($page &lt; count($textarray) - 1) {
$nextpage = $page + 1;
echo("&lt;P&gt;&lt;A HREF=\"$PHP_SELF?id=$id&amp;page=$nextpage\"&gt;".
"Επόμενη Σελίδα&lt;/A&gt;&lt;/P&gt;");
}
</pre><p>Ολόκληρος ο κώδικας για την εμφάνιση του κειμένου του joke είναι ως εξής :</p><pre name="code" class="php">
&lt;!-- joke.php --&gt;
...
// Παίρνουμε (get) το κείμενο του joke από τη βάση δεδομένων
$joke = mysql_query("SELECT JokeText FROM Jokes ".
"WHERE ID=$id");
$joke = mysql_fetch_array($joke);
$joketext = $joke["JokeText"];
// Φιλτράρουμε τον HTML κώδικα
$joketext = htmlspecialchars($joketext);
// Αν δεν έχει καθορισθεί κάποια σελίδα, default είναι η πρώτη σελίδα
($page = 0)
if (!isset($page)) $page = 0;
// Διαιρούμε το κείμενο σ’ έναν πίνακα (array) από σελίδες
$textarray=split("\[PAGEBREAK]",$joketext);
// Επιλέγουμε τη σελίδα που θέλουμε
$joketext=$textarray[$page];
// Bold και italics
$joketext = eregi_replace("\[b]","&lt;B&gt;", $joketext);
$joketext = eregi_replace("\[eb]","&lt;/B&gt;", $joketext);
$joketext = eregi_replace("\[i]","&lt;I&gt;", $joketext);
$joketext = eregi_replace("\[ei]","&lt;/I&gt;", $joketext);
// Παράγραφοι και αλλαγές γραμμών
$joketext = ereg_replace("\r", "", $joketext);
$joketext = ereg_replace("\n\n", "&lt;P&gt;", $joketext);
$joketext = ereg_replace("\n", "&lt;BR&gt;", $joketext);
// Υπερσύνδεσμοι (Hyperlinks)
$joketext = ereg_replace(
"\[L]([-_./a-zA-Z0-9!&amp;%#?,'=:~]+)\[EL]",
"&lt;A HREF=\"\\1\"&gt;\\1&lt;/A&gt;", $joketext);
$joketext = ereg_replace(
"\[L=([-_./a-zA-Z0-9!&amp;%#?,'=:~]+)]".
"([-_./a-zA-Z0-9 !&amp;%#?,'=:~]+)\[EL]",
"&lt;A HREF=\"\\1\"&gt;\\2&lt;/A&gt;", $joketext);
if ($page != 0) {
$prevpage = $page - 1;
echo("&lt;P&gt;&lt;A HREF=\"$PHP_SELF?id=$id&amp;page=$prevpage\"&gt;".
"Προηγούμενη Σελίδα&lt;/A&gt;&lt;/P&gt;");
}
echo( "&lt;P&gt;$joketext" );
if ($page &lt; count($textarray) - 1) {
$nextpage = $page + 1;
echo("&lt;P&gt;&lt;A HREF=\"$PHP_SELF?id=$id&amp;page=$nextpage\"&gt;".
"Επόμενη Σελίδα&lt;/A&gt;&lt;/P&gt;");
}
...
</pre><h1><strong>Αυτόματη Υποβολή Περιεχομένου</strong></h1><p>Θα δούμε τώρα πώς μπορούμε να δεχόμαστε jokes αλλά να μην εμφανίζονται αμέσως στο site. Θα προσθέσουμε μια νέα στήλη στον πίνακα Jokes με όνομα Visible η οποία θα δέχεται μόνο μία από δύο τιμές : &#8216;Y&#8217; και &#8216;N&#8217;. Τα νέα jokes που θα υποβάλλονται θα γίνονται ίσα με Visible=&#8217;N&#8217; αυτόματα και δεν θα μπορούν να αποκλειστούν από το να εμφανισθούν στο site, προσθέτοντας απλά την έκφραση WHERE Visible=&#8217;Y&#8217; σ’ ένα ερώτημα (query) του πίνακα Jokes για το οποίο τα αποτελέσματα προορίζονται για κοινή θέα.</p><p>Τα jokes που έχουν τη στήλη Visible=&#8217;N&#8217; θα βρίσκονται στη βάση δεδομένων περιμένοντας τροποποίηση από έναν content manager, ο οποίος θα μπορεί να τα τροποποιήσει πριν τα κάνει ορατά ή απλά να τα διαγράψει αμέσως. Η δημιουργία μιας στήλης που μπορεί να περιέχει μία από δύο τιμές, η μια από τις οποίες είναι η προκαθορισμένη (default), έχει να κάνει μ’ ένα νέο είδος στήλης της MySQL που αποκαλείται <em>ENUM</em> :</p><pre name="code" class="php">
mysql&gt; ALTER TABLE Jokes ADD COLUMN
-&gt; Visible ENUM('N', 'Y') NOT NULL;
</pre><p>Η πρώτη τιμή που υπάρχει στις παρενθέσεις, δηλ. το &#8216;N&#8217; στην προκειμένη περίπτωση, είναι η προκαθορισμένη (default) τιμή, η οποία εκχωρείται στις νέες καταχωρήσεις αν δεν έχει καθορισθεί μια τιμή στην εντολή INSERT.</p><h1><strong>Προχωρημένη </strong><strong>SQL</strong></h1><p>Καθώς έχουμε δουλέψει με το παράδειγμα ενός Internet Joke Database website, είχαμε την ευκαιρία να εξερευνήσουμε τις περισσότερες πλευρές της Structured Query Language (SQL), από την βασική μορφή του ερωτήματος CREATE TABLE μέχρι τους δύο τρόπους σύνταξης των ερωτημάτων INSERT. Θα δούμε τώρα μερικά ακόμα τρικ της SQL που δεν τα έχουμε συναντήσει.</p><h1><strong>Ταξινόμηση με την </strong><strong>ORDER</strong><strong> </strong><strong>BY</strong></h1><p>Η <em>Order</em><em> </em><em>By</em> είναι μια προαιρετική έκφραση σ’ ένα ερώτημα SELECT με την οποία μπορούμε να καθορίσουμε μια στήλη (column) για να ταξινομήσουμε τον πίνακα των αποτελεσμάτων. Για παράδειγμα, για να ταξινομήσουμε με βάση τη στήλη Name του πίνακα Authors, δίνουμε την εξής εντολή :</p><pre name="code" class="php">
mysql&gt; SELECT Name, eMail FROM Authors ORDER BY Name;
+-----------------+----------------------+
| Name            | eMail                |
+-----------------+----------------------+
| Antonopoulos Antonis| ant@hellas.gr |
| Basileiadis Basileios| bas@hellas.gr|
| Konstantinou Konstantinos| kon@hellas.gr |
| Papadopoulos Nikolaos|pap@hellas.gr |
+-----------------+----------------------+
</pre><p>Αν προσθέσουμε τη λέξη κλειδί <em>DESC</em> μετά από το όνομα της στήλης ταξινόμησης, τα αποτελέσματα θα εμφανισθούν σε φθίνουσα σειρά, ως εξής :</p><pre name="code" class="php">
mysql&gt; SELECT Name, eMail FROM Authors ORDER BY Name DESC;
+-----------------+----------------------+
| Name            | eMail                |
+-----------------+----------------------+
| Papadopoulos Nikolaos | pap@hellas.gr|
| Konstantinou Konstantinos | kon@hellas.gr|
| Basileiadis Basileios| bas@hellas.gr|
| Antonopoulos Antonis|ant@hellas.gr|
+-----------------+----------------------+
</pre><p>Μπορούμε να ταξινομήσουμε και με βάση περισσότερες από μία στήλες, χωρίζοντάς τες με κόμμα στην έκφραση ORDER BY, οπότε η MySQL θα ταξινομήσει τις καταχωρήσεις με βάση την πρώτη στήλη, μετά με βάση τη δεύτερη στήλη όπου υπάρχουν ίδιες τιμές στην πρώτη στήλη κοκ. Μπορούμε να χρησιμοποιήσουμε τη λέξη κλειδί DESC σε όποια στήλη θέλουμε στην έκφραση ORDER BY για να αντιστρέψουμε τη σειρά ταξινόμησης.</p><h1><strong>Η Έκφραση </strong><strong>LIMIT</strong></h1><p>Συχνά θα εργαζόμαστε μ’ έναν μεγάλο πίνακα μιας βάσης δεδομένων, αλλά θα μας ενδιαφέρουν λίγες μόνο καταχωρήσεις του. Ας υποθέσουμε ότι θέλουμε να παρακολουθούμε τη δημοτικότητα των διάφορων jokes στο site. Θα μπορούμε να προσθέσουμε μια στήλη με όνομα TimesViewed στον πίνακα Jokes.</p><p>Ξεκινώντας με μια τιμή 0 για τα καινούργια jokes και προσθέτοντας το 1 στην τιμή του joke που ζητήθηκε κάθε φορά που εμφανίζεται η σελίδα του joke, θα μπορούμε να παρακολουθούμε πόσες φορές έχει διαβασθεί το κάθε joke στη βάση δεδομένων.</p><p>Ο PHP κώδικας για το query που αυξάνει κατά 1 τη στήλη TimesViewed ενός joke μ’ ένα δεδομένο ID, είναι ως εξής :</p><pre name="code" class="php">
$sql = "UPDATE Jokes SET TimesViewed=TimesViewed+1 ".
"WHERE ID=$id";
if (!mysql_query($sql)) {
echo("&lt;P &gt; Λάθος στην πρόσθεση ".
"γι' αυτό το joke! &lt;/P&gt;\n");
}
</pre><p>Μια κοινή χρήση αυτού του μετρητή θα ήταν για να παρουσιάσουμε μια λίστα των &#8220;Top 10 Jokes&#8221; στην πρώτη σελίδα του site, για παράδειγμα. Μπορούμε να χρησιμοποιήσουμε την έκφραση <em>ORDER</em><em> </em><em>BY</em><em> </em><em>TimesViewed</em><em> </em><em>DESC</em> για να εμφανίσουμε τα jokes από τις υψηλότερες προς τις χαμηλότερες τιμές της στήλης TimesViewed. Θα πρέπει απλά να επιλέξουμε τις 10 πρώτες τιμές από την κορυφή της λίστας.</p><p>Με την έκφραση (clause) <em>LIMIT</em> μπορούμε να καθορίσουμε ότι θέλουμε έναν μόνο συγκεκριμένο αριθμό αποτελεσμάτων. Σύμφωνα με το παραπάνω παράδειγμα, χρειαζόμαστε μόνο τα 10 πρώτα :</p><pre name="code" class="php">
$sql = "SELECT * FROM Jokes ORDER BY TimesViewed
DESC LIMIT 10";
</pre><p>Επίσης, θα μπορούμε να αποφύγουμε τη λέξη κλειδί DESC και να εμφανίσουμε τα 10 λιγότερο δημοφιλή jokes. Το επόμενο query θα εμφανίσει από το 21<sup>ο</sup> έως το 25<sup>ο</sup> πιο δημοφιλή jokes :</p><pre name="code" class="php">
$sql = "SELECT * FROM Jokes ORDER BY TimesViewed
DESC LIMIT 20, 5";
</pre><p>Πρέπει να έχουμε υπόψη μας ότι η πρώτη καταχώρηση στη λίστα των αποτελεσμάτων έχει αριθμό 0 και έτσι η 21<sup>η</sup> καταχώρηση της λίστας θα έχει αριθμό 20.</p><h1><strong>Οι Εκφράσεις </strong><strong>LOCK</strong><strong> και </strong><strong>UNLOCK</strong></h1><p>Στο ερώτημα UPDATE που χρησιμοποιήσαμε παραπάνω, υπάρχει ένας μικρός κίνδυνος. Τι θα συμβεί αν τη στιγμή που αλλάζει η τιμή της στήλης TimesViewed, κάποιος άλλος χρήστης εμφανίσει το ίδιο joke; Το PHP script θα εκτελεσθεί για δεύτερη φορά για την καινούργια αίτηση (request). Όταν εκτέλεσε το SELECT για να πάρει την τρέχουσα τιμή της στήλης TimesViewed, θα πήρε την ίδια τιμή με το πρώτο script, επειδή η τιμή δεν έχει ακόμη ενημερωθεί.</p><p>Και τα δύο scripts θα προσθέσουν μετά το 1 στην ίδια τιμή και θα γράψουν την καινούργια τιμή στον πίνακα. Το αποτέλεσμα θα είναι ότι δύο χρήστες είδαν το joke, αλλά ο μετρητής TimesViewed αυξήθηκε μόνο κατά 1. Για να αποφύγουμε προβλήματα όπως το παραπάνω, μπορούμε να κλειδώσουμε έναν ή περισσότερους πίνακες με τους οποίους εργαζόμαστε σ’ ένα ερώτημα και να έχουμε έτσι αποκλειστική πρόσβαση σ’ αυτούς για όσο διαρκεί το ερώτημα. Η σύνταξη για το κλείδωμα ενός πίνακα είναι ως εξής :</p><pre name="code" class="php">
LOCK TABLES tblName { READ | WRITE }
</pre><p>Όταν κλειδώνουμε έναν πίνακα, πρέπει να καθορίσουμε αν θέλουμε ένα &#8220;read lock&#8221; ή ένα &#8220;write lock&#8221;. Το πρώτο εμποδίζει άλλες διεργασίες από το να κάνουν αλλαγές στον πίνακα αλλά επιτρέπει σ’ άλλες να διαβάσουν τον πίνακα. Το δεύτερο απαγορεύει όλες τις προσβάσεις στον πίνακα.</p><p>Όταν τελειώσουμε την εργασία μας μ’ έναν πίνακα που έχουμε κλειδώσει, πρέπει να απελευθερώσουμε το κλείδωμα για να μπορέσουν να έχουν οι άλλες διεργασίες πρόσβαση στον πίνακα ξανά :</p><h3>UNLOCK TABLES</h3><p>Ακολουθεί ένα παράδειγμα ενός PHP κώδικα :</p><pre name="code" class="php">
mysql_query("LOCK TABLES inventory WRITE, shipping WRITE");
// … εντολές …
mysql_query("UNLOCK TABLES");
</pre>]]></content:encoded> <wfw:commentRss>http://greektuts.net/php-intro-part3/feed/</wfw:commentRss> <slash:comments>6</slash:comments> </item> <item><title>PHP και MySQL</title><link>http://greektuts.net/php-and-mysql/</link> <comments>http://greektuts.net/php-and-mysql/#comments</comments> <pubDate>Tue, 25 May 2010 06:30:10 +0000</pubDate> <dc:creator>cn92</dc:creator> <category><![CDATA[+]]></category> <category><![CDATA[MySQL]]></category> <category><![CDATA[PHP]]></category> <category><![CDATA[cnet92]]></category> <category><![CDATA[Nikos]]></category> <category><![CDATA[sql]]></category> <category><![CDATA[Xatzidakis]]></category> <category><![CDATA[βάσεις δεδομένων]]></category> <category><![CDATA[βάση]]></category> <category><![CDATA[δεδομένων]]></category> <category><![CDATA[Νίκος Χατζηδάκης]]></category> <category><![CDATA[Προγραμματισμός]]></category> <guid
isPermaLink="false">http://greektuts.net/?p=3863</guid> <description><![CDATA[Σε αυτό το πολύ αναλυτικό βοήθημα, από τον Νίκο Χατζηδάκη, θα δούμε πως μπορούμε να χρησιμοποιήσουμε την PHP και να γράψουμε κώδικα και εντολές, ώστε να συνδεθούμε με μία βάση δεδομένων, να προσθέσουμε εγγραφές, να επεξεργαστούμε εγγραφές, και τέλος πως να αφαιρέσουμε και να προβάλουμε τις εγγραφές της.]]></description> <content:encoded><![CDATA[<h1>Σύνδεση με βάση δεδομένων</h1><p>Δημιουργούμε ένα αρχείο dbconn.php με τον παρακάτω κώδικα</p><pre name="code" class="php">
&lt;?php
function dbconnect() {
// Σύνδεση με διακομιστή
$db_connect = mysql_connect("localhost", "db_user", "db_password")
or die ("Αποτυχία σύνδεσης στον διακομιστή");
// Αν χρησιμοποιείτε κωδικοποίηση utf8 και δεν σας εμφανίζει σωστά τα
ελληνικά
// mysql_query("SET NAMES 'utf8'", $db_connect);
// Επιλογή βάσης δεδομένων
$db_select = mysql_select_db("db_name", $db_connect)
or die ("Αποτυχία επιλογής βάσης δεδομένων");
}
?&gt;
</pre><p>Με το παρακάτω, συνδεόμαστε στην mysql</p><pre name="code" class="php">
mysql_connect("localhost", "db_user", "db_password")
</pre><p>Μην ξεχάσετε να αντικαταστήσετε τα localhost ο host της βάσης db_user το όνομα του χρήστη της βάσης db_password ο κωδικός του χρήστη της βάσης db_name το όνομα της βάσης. or die (&#8220;Αποτυχία σύνδεσης στον διακομιστή&#8221;); Αν για κάποιο λόγο παρουσιαστεί πρόβλημα, εμφανίζεται το μήνυμα &#8220;Αποτυχία σύνδεσης στον διακομιστή&#8221;. Κάποιες φορές, όταν η βάση είναι κωδικοποιημένη σε utf8, τα ελληνικά γράμματα εμφανίζονται με ερωτηματικά. Για να το διορθώσουμε, εισάγουμε το παρακάτω:</p><pre name="code" class="php">
mysql_query("SET NAMES 'utf8'", $db_connect);
</pre><p>Τέλος επιλέγουμε το όνομα της βάσης</p><pre name="code" class="php">
$db_select = mysql_select_db("db_name", $db_connect)
</pre><p>Διευκολύνει να έχουμε την παραπάνω συνάρτηση σε ξεχωριστό αρχείο, και όποτε τη χρειαζόμαστε να το εισάγουμε. Έτσι, αν θέλουμε να αλλάξουμε για παράδειγμα τον κωδικό ή τον χρήστη, το κάνουμε σε ένα αρχείο. Για να εισάγουμε το αρχείο της συνάρτησης σε ένα άλλο αρχείο php χρησιμοποιούμε την εντολή include() ως εξής:</p><pre name="code" class="php">
&lt;?php
// Εισαγωγή του αρχείου με την συνάρτηση
include(“dbconn.php”);
// Καλούμε την συνάρτηση
dbconnect();
</pre><h2>ΕΝΤΟΛΕΣ</h2><pre name="code" class="php">
// Αποσύνδεση απο τον διακομιστή
/mysql_close($db_connect);
?&gt;
</pre><p>Αν και δεν είναι απαραίτητο να κάνουμε αποσύνδεση, καλό θα ήταν να μην το ξεχνάμε.</p><h1>Προσθήκη και ενημέρωση εγγραφών σε βάση δεδομένων</h1><p>Έστω ο πίνακας clients (id, name, surname) με το id ρυθμισμένο σε auto_increment ώστε να αυξάνεται μόνο του με κάθε εγγραφή που προσθέτουμε. Αρχικά δημιουργούμε ένα αρχείο add.php ή update.php και καλούμε τη συνάρτηση που δημιουργήσαμε πριν, ώστε να συνδεθούμε στη βάση δεδομένων.</p><pre name="code" class="php">
&lt;?php
// Εισαγωγή του αρχείου με την συνάρτηση
include(“dbconn.php”);
// Καλούμε την συνάρτηση
dbconnect();
…
// Αποσύνδεση απο τον διακομιστή
/mysql_close($db_connect);
?&gt;
</pre><p>Στη συνέχεια με τον παρακάτω κώδικα δηλώνουμε τι θέλουμε να εισάγουμε και που.</p><pre name="code" class="php">
// Προσθήκη δεδομένων
$qAdd = mysql_query("INSERT INTO clients (id, name, surname)
VALUES ('', 'Νίκος', 'Παπανικολάου')") or die
("Παρουσιάστηκε πρόβλημα κατά την εισαγωγή των αρχείων."));
if ($qAdd)
{
echo "Τα δεδομένα προστέθηκαν.";
}
</pre><p>Ενώ με τον παρακάτω τι θέλουμε να αλλάξουμε/επεξεργαστούμε.</p><pre name="code" class="php">
// Ενημέρωση δεδομένων
$qUpdate=mysql_query("UPDATE clients SET name = 'name', surname =
'surname' WHERE id='1' ");
if ($qUpdate)
{
echo "Τα δεδομένα ενημερώθηκαν.";
}
</pre><p>Έτσι το αρχείο add.php παίρνει την παρακάτω μορφή,</p><pre name="code" class="php">
&lt;?php
// Εισαγωγή του αρχείου με την συνάρτηση
include(“dbconn.php”);
// Καλούμε την συνάρτηση
dbconnect();
// Προσθήκη δεδομένων
$qAdd = mysql_query("INSERT INTO clients (id, name, surname)
VALUES ('', 'Νίκος', 'Παπανικολάου')") or die
("Παρουσιάστηκε πρόβλημα κατά την εισαγωγή των αρχείων."));
if ($qAdd)
{
echo "Τα δεδομένα προστέθηκαν.";
}
// Αποσύνδεση απο τον διακομιστή
/mysql_close($db_connect);
?&gt;
</pre><p>Ενώ το update.php την παρακάτω:</p><pre name="code" class="php">
&lt;?php
// Εισαγωγή του αρχείου με την συνάρτηση
include(“dbconn.php”);
// Καλούμε την συνάρτηση
dbconnect();
// Ενημέρωση δεδομένων
$qUpdate=mysql_query("UPDATE clients SET name = 'name', surname =
'surname' WHERE id='1' ");
if ($qUpdate)
{
echo "Τα δεδομένα ενημερώθηκαν.";
}
// Αποσύνδεση απο τον διακομιστή
/mysql_close($db_connect);
?&gt;
</pre><h1>Εμφάνιση εγγραφών από βάση δεδομένων</h1><p>Αρχικά δημιουργούμε ένα αρχείο index.php και καλούμε τη συνάρτηση που δημιουργήσαμε πριν, ώστε να συνδεθούμε στη βάση δεδομένων.</p><pre name="code" class="php">
&lt;?php
// Εισαγωγή του αρχείου με την συνάρτηση
include(“dbconn.php”);
// Καλούμε την συνάρτηση
dbconnect();
…
// Αποσύνδεση απο τον διακομιστή
/mysql_close($db_connect);
?&gt;
</pre><p>Στη συνέχεια με τον παρακάτω κώδικα «τραβάμε» τα αποτελέσματα από την βάση μας.</p><pre name="code" class="php">
// Ερώτημα προς την βάση
$q=mysql_query("SELECT * FROM clients ");
$num = mysql_num_rows($q);
// Αν υπάρχουν αποτελέσματα
if ($num &gt; 0 ) {
$i=0;
while ($i &lt; $num) {
// Δημιουργία σύντομων ονομάτων μεταβλητών
$name = mysql_result($q,$i,"name");
$surname = mysql_result($q,$i,"surname");
// Εκτύπωση μεταβλητών
echo "Όνομα: $name&lt;br /&gt;";
echo "Επώνυμο: $surname &lt;br /&gt;";
// Αν δεν υπάρχουν αποτελέσματα
++$i; } } else { echo "Δεν έχουν καταχωρηθεί δεδομένα για εσάς ακόμα."; }
</pre><p>Έτσι το αρχείο παίρνει την παρακάτω μορφή.</p><pre name="code" class="php">
&lt;?php
// Εισαγωγή του αρχείου με την συνάρτηση
include(“dbconn.php”);
// Καλούμε την συνάρτηση
dbconnect();
// Ερώτημα προς την βάση
$q=mysql_query("SELECT * FROM clients ");
$num = mysql_num_rows($q);
// Αν υπάρχουν αποτελέσματα
if ($num &gt; 0 ) {
$i=0;
while ($i &lt; $num) {
// Δημιουργία σύντομων ονομάτων μεταβλητών
$name = mysql_result($q,$i,"name");
$surname = mysql_result($q,$i,"surname");
// Εκτύπωση μεταβλητών
echo "Όνομα: $name&lt;br /&gt;";
echo "Επώνυμο: $surname &lt;br /&gt;";
// Αν δεν υπάρχουν αποτελέσματα
++$i; } } else { echo "Δεν έχουν καταχωρηθεί δεδομένα για εσάς ακόμα."; }
// Αποσύνδεση απο τον διακομιστή
/mysql_close($db_connect);
?&gt;
</pre><p>Μπορούμε να συμπεριλάβουμε και διάφορα κριτίρια στην αναζήτησή μας, όπως αν το όνομα είναι «Νίκος». Αυτό γίνεται προστέτοντας στο mysql query το WHERE name=’Νίκος’</p><pre name="code" class="php">
$q=mysql_query("SELECT * FROM clients WHERE name=’Νίκος’");
</pre><h1>Διαγραφή εγγραφών από βάση δεδομένων</h1><p>Αρχικά δημιουργούμε ένα αρχείο delete.php και καλούμε τη συνάρτηση που δημιουργήσαμε πριν, ώστε να συνδεθούμε στη βάση δεδομένων.</p><pre name="code" class="php">
&lt;?php
// Εισαγωγή του αρχείου με την συνάρτηση
include(“dbconn.php”);
// Καλούμε την συνάρτηση
dbconnect();
…
// Αποσύνδεση απο τον διακομιστή
/mysql_close($db_connect);
?&gt;
</pre><p>Στη συνέχεια με τον παρακάτω κώδικα δηλώνουμε τι θέλουμε να διαγράψουμε.</p><pre name="code" class="php">
// Αφαίρεση δεδομένων
$qRemove = mysql_query("DELETE FROM clients WHERE id='1' ");
if ($qRemove)
{
echo "Τα δεδομένα αφαιρέθηκαν.";
}
Έτσι το αρχείο παίρνει την παρακάτω μορφή.
&lt;?php
// Εισαγωγή του αρχείου με την συνάρτηση
include(“dbconn.php”);
// Καλούμε την συνάρτηση
dbconnect();
// Αφαίρεση δεδομένων
$qRemove = mysql_query("DELETE FROM clients WHERE id='1' ");
if ($qRemove)
{
echo "Τα δεδομένα αφαιρέθηκαν.";
}
// Αποσύνδεση απο τον διακομιστή
/mysql_close($db_connect);
?&gt;
</pre><p>Στα επόμενα βοηθήματα, θα δημιουργήσουμε φόρμες εισαγωγής, επεξεργασίας, προβολής και διαγραφής εγγραφών, και θα ασχοληθούμε με την επαλήθευση των δεδομένων που μας δίνει ο χρήστης.</p><p><strong><p
style="text-align: center; font-weight: bold;"><br><img
src="http://greektuts.net/images/GTMemberAccess.png" alt="Member Area" /> <br>Άν είστε ήδη συνδρομητής κάντε login με τα στοιχεία σας. Για να γίνετε συνδρομητής πατήστε <a
href="/wp-login.php?action=register">εδώ</a></p></strong></p> ]]></content:encoded> <wfw:commentRss>http://greektuts.net/php-and-mysql/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Eiσαγωγή στην PHP Μέρος 2</title><link>http://greektuts.net/php-part-2/</link> <comments>http://greektuts.net/php-part-2/#comments</comments> <pubDate>Thu, 13 May 2010 12:01:17 +0000</pubDate> <dc:creator>Pantso</dc:creator> <category><![CDATA[PHP]]></category> <category><![CDATA[άρθρο]]></category> <category><![CDATA[βοήθημα]]></category> <category><![CDATA[Γλώσσα Προγραμματισμού]]></category> <category><![CDATA[Εισαγωγη στην PHP]]></category> <category><![CDATA[Μέρος 2]]></category> <guid
isPermaLink="false">http://greektuts.net/?p=3723</guid> <description><![CDATA[Στο πρώτο μέρος της εισαγωγής στην PHP κάναμε τα πρώτα μας βήματα σε αυτήν την γλώσσα προγραμματισμού Σε αυτό το άρθρο θα δούμε το δεύτερο μέρος της εισαγωγής στην PHP, συνέχίζοντας από εκεί που είχαμε μείνει. Θα μιλήσουμε για τα Regular Expressions, για την μορφωποίηση των κειμένων, τις παραγράφους και τους υπερσύνδεσμους.]]></description> <content:encoded><![CDATA[<h1>Οι Κανονικές Εκφράσεις (Regular Expressions)</h1><p>Μια κανονική έκφραση (regular expression) είναι ένα κομμάτι (string) κειμένου που περιέχει ειδικούς κωδικούς που του δίνουν τη δυνατότητα να μπορεί να χρησιμοποιηθεί με κάποιες συναρτήσεις της PHP για εντοπισμό και διαχείριση κειμένου. Για να μπορέσουμε να χρησιμοποιήσουμε μια κανονική έκφραση, πρέπει να είμαστε εξοικειωμένοι με τις συναρτήσεις των κανονικών εκφράσεων που υπάρχουν στην PHP. Η ereg() είναι η βασικότερη απ’ αυτές και μπορεί να χρησιμοποιηθεί για να καθορίσουμε αν μια κανονική έκφραση ικανοποιείται από ένα συγκεκριμένο string κειμένου. Ας δούμε τον επόμενο κώδικα :</p><pre name="code" class="php">
$text = "Κανόνες της PHP!";
if (ereg("PHP", $text)) {
echo( '$το κείμενο περιέχει το string "PHP".' );
} else {
echo( '$το κείμενο δεν περιέχει το string "PHP".' );
}
</pre><p>Σ’ αυτό το παράδειγμα, η κανονική έκφραση ικανοποιείται επειδή το string που είναι αποθηκευμένο στη μεταβλητή $text περιέχει το PHP. Ο παραπάνω κώδικας θα εξάγει συνεπώς τα εξής :</p><blockquote><p>$το κείμενο περιέχει το string &#8220;PHP&#8221;.</p></blockquote><p>Δεν πρέπει να ξεχνάμε όταν τα μονά εισαγωγικά αποτρέπουν την PHP από το να εμφανίσει την τιμή της μεταβλητής $text.<br
/> Η eregi() είναι μια συνάρτηση που συμπεριφέρεται σχεδόν παρόμοια με την ereg(), εκτός από το ότι αγνοεί τα πεζά και τα κεφαλαία γράμματα όταν αναζητά ταιριάσματα :</p><pre name="code" class="php">
$text = "Τι είναι η Php;";
if (eregi("PHP", $text)) {
echo( '$το κείμενο περιέχει το string "PHP".' );
} else {
echo( '$το κείμενο δεν περιέχει το string "PHP".' );
}
</pre><p>Αυτό εμφανίζει πάλι το ίδιο μήνυμα :</p><blockquote><p> $το κείμενο περιέχει το string &#8220;PHP&#8221;.</p></blockquote><p>Θα δούμε μερικά παραδείγματα για να μάθουμε τη βασική σύνταξη των κανονικών εκφράσεων. Πρώτα απ’ όλα, το σύμβολο caret () μπορεί να χρησιμοποιηθεί για να δείξει την αρχή ενός string, ενώ το σύμβολο του δολαρίου ($) χρησιμοποιείται για να δείξει το τέλος :</p><blockquote><p>PHP                // Ταιριάζει με το &#8220;What is PHP?&#8221;<br
/> PHP             // Ταιριάζει με το &#8220;PHP rules!&#8221;, όχι με το &#8220;What is PHP?&#8221;<br
/> PHP$              // Ταιριάζει με το &#8220;I love PHP&#8221;, όχι με το &#8220;What is PHP?&#8221;<br
/> PHP$           // Ταιριάζει με το &#8220;PHP&#8221; και τίποτα άλλο</p></blockquote><p>Προφανώς, θα υπάρχουν φορές που θα θέλουμε να χρησιμοποιήσουμε τα σύμβολα ^, $ ή και άλλους ειδικούς χαρακτήρες για να συμπεριλάβουμε τον αντίστοιχο χαρακτήρα στο string αναζήτησης. Για να αφαιρέσουμε το ειδικό νόημα ενός χαρακτήρα, προτάσσουμε τον χαρακτήρα \ (backslash), ως εξής :</p><pre name="code" class="php">
\$\$\$  // Ταιριάζει με το "Show me the $$$!"
</pre><p>Οι αγκύλες μπορούν να χρησιμοποιηθούν για να ορίσουν ένα σύνολο χαρακτήρων που μπορεί να ταιριάξει. Για παράδειγμα, η ακόλουθη κανονική έκφραση ταιριάζει μ’ ένα μόνο από τα ψηφία 1 έως 5.</p><blockquote><p> [12345]   // Ταιριάζει με το &#8220;1&#8243; και το &#8220;3&#8243;, αλλά όχι με το &#8220;a&#8221; ή το &#8220;12&#8243;</p></blockquote><p>Μπορούμε να καθορίσουμε και περιοχές αριθμών ή γραμμάτων.</p><blockquote><p>[1-5]               // Το ίδιο όπως προηγουμένως<br
/> [a-z]               // Ταιριάζει μ’ ένα οποιοδήποτε πεζό γράμμα<br
/> [0-9a-zA-Z]   // Ταιριάζει μ’ ένα οποιοδήποτε γράμμα ή ψηφίο</p></blockquote><p>Οι χαρακτήρες ?, + και * έχουν επίσης ειδικό νόημα. Συγκεκριμένα, το ? σημαίνει ότι ο προηγούμενος χαρακτήρας είναι προαιρετικός, το + σημαίνει έναν ή περισσότερους από τους προηγούμενους χαρακτήρες και το * σημαίνει κανέναν ή έναν από τους προηγούμενους χαρακτήρες.</p><blockquote><p> bana?na        // Ταιριάζει με τα &#8220;banana&#8221; και &#8220;banna&#8221;,<br
/> // αλλά όχι με το &#8220;banaana&#8221;<br
/> bana+na        // Ταιριάζει με τα &#8220;banana&#8221; και &#8220;banaana&#8221;,<br
/> // αλλά όχι με το &#8220;banna&#8221;<br
/> bana*na        // Ταιριάζει με τα &#8220;banna&#8221;, &#8220;banana&#8221; και &#8220;banaaana&#8221;,<br
/> // αλλά όχι με το &#8220;bnana&#8221;<br
/> [a-zA-z]+$  // Ταιριάζει μ’ ένα οποιοδήποτε string που έχει έναν<br
/> // τουλάχιστον χαρακτήρα</p></blockquote><p>Οι παρενθέσεις μπορούν να χρησιμοποιηθούν για να ομαδοποιήσουμε strings και να εφαρμόσουμε τα ?, + ή * σ’ αυτά σαν σύνολο.</p><blockquote><p>ba(na)+na     // Ταιριάζει με τα &#8220;banana&#8221; και &#8220;banananana&#8221;,<br
/> // αλλά όχι με το &#8220;bana&#8221; ή το &#8220;banaana&#8221;</p></blockquote><p>Ακολουθούν μερικοί κωδικοί για να μπορέσουμε να ταιριάξουμε τους ειδικούς χαρακτήρες στις κανονικές εκφράσεις :</p><blockquote><p>\n         // Ταιριάζει μ’ έναν χαρακτήρα νέας γραμμής (newline character)<br
/>          // Ταιριάζει μ’ έναν οποιονδήποτε χαρακτήρα εκτός από τον<br
/> // χαρακτήρα νέας γραμμής<br
/> \r         // Ταιριάζει μ’ έναν χαρακτήρα carriage return<br
/> \t          // Ταιριάζει με τον χαρακτήρα tab</p></blockquote><h1>Αντικατάσταση Strings με Κανονικές Εκφράσεις</h1><p>Χρησιμοποιώντας την ereg() ή την eregi() με τη σύνταξη των κανονικών εκφράσεων που μόλις είδαμε, μπορούμε να εντοπίσουμε εύκολα την παρουσία tags σ’ ένα δεδομένο string κειμένου. Αυτό που πρέπει να κάνουμε, όμως, είναι να σημειώσουμε με ακρίβεια αυτά τα tags και να τα αντικαταστήσουμε με κατάλληλα HTML tags.<br
/> Για να γίνει αυτό, πρέπει να δούμε μερικές ακόμα συναρτήσεις κανονικών εκφράσεων που υπάρχουν στην PHP :</p><pre name="code" class="php">
 ereg_replace()
</pre><pre name="code" class="php">
eregi_ replace().
</pre><p>Η ereg_replace(), σαν την ereg(), δέχεται μια κανονική έκφραση και ένα string κειμένου και προσπαθεί να ταιριάξει την κανονική έκφραση με το string. Επιπλέον, όμως, η ereg_replace() δέχεται ένα δεύτερο string κειμένου και αντικαθιστά κάθε ταίριασμα της κανονικής έκφρασης σ’ αυτό το string. Η σύνταξη της ereg_replace() είναι ως εξής :</p><pre name="code" class="php">
$newstring = ereg_replace(, ,
);
</pre><p>όπου η  είναι η  κανονική έκφραση και το  είναι το string που θα αντικαταστήσει τα ταιριάσματα στην  όπου υπάρχει το<br
/> . Η συνάρτηση επιστρέφει το νέο string που προκύπτει από τη λειτουργία της αντικατάστασης. Στην παραπάνω πρόταση, αυτό απoθηκεύεται στη μεταβλητή $newstring.<br
/> Η eregi_replace(), όπως είναι αναμενόμενο, είναι παρόμοια με την ereg_replace(), εκτός από το ότι δεν ελέγχει τα πεζά/κεφαλαία όταν κάνει αναζήτηση για ταιριάσματα.<br
/> Είμαστε τώρα έτοιμοι να αρχίσουμε να δημιουργούμε τη δική μας προσαρμοσμένη γλώσσα σήμανσης (custom markup language).</p><h1>Έντονο και Πλάγιο Κείμενο</h1><p>Θα ξεκινήσουμε υλοποιώντας tags για να δημιουργήσουμε έντονο και πλάγιο κείμενο. Ας υποθέσουμε ότι θέλουμε το [B] να ξεκινάει το έντονο κείμενο (bold text) και το [EB] να τελειώνει το έντονο κείμενο. Προφανώς, θα πρέπει να αντικαταστήσουμε το [B] με το <strong> και το [EB] με το </strong>.<br
/> Η λειτουργία αυτή αποτελεί μια απλή εφαρμογή της συνάρτησης eregi_replace() :</p><pre name="code" class="php">
$joketext = eregi_replace("\[b]", "<strong>", $joketext);
$joketext = eregi_replace("\[eb]", "</strong>", $joketext);
</pre><p>Εφόσον το [ κανονικά δείχνει την αρχή ενός συνόλου αποδεκτών χαρακτήρων σε μια κανονική έκφραση, τοποθετούμε τον χαρακτήρα \ (backslash) πριν απ’ αυτόν για να αφαιρέσουμε το ειδικό νόημα που έχει. Χωρίς ένα αντίστοιχο [, το ] χάνει το ειδικό νόημα που έχει και δεν χρειάζεται συνεπώς έναν χαρακτήρα backslash, αν και θα μπορούσαμε να τοποθετήσουμε ένα backslash μπροστά του επίσης.<br
/> Παρατηρούμε επίσης, ότι, εφόσον χρησιμοποιούμε τη συνάρτηση eregi_replace(), η οποία δεν ξεχωρίζει τα πεζά από τα κεφαλαία γράμματα (case insensitive), το [B] και το [b] θα εργάζονται σαν tags στη δική μας προσαρμοσμένη γλώσσα σήμανσης (custom markup language).<br
/> Το πλάγιο κείμενο μπορεί να γίνει με τον ίδιο τρόπο :</p><pre name="code" class="php">
$joketext = eregi_replace("\[i]", "<em>", $joketext);
$joketext = eregi_replace("\[ei]", "</em>", $joketext);
</pre><h1>Οι Παράγραφοι</h1><p>Ενώ μπορούμε να δημιουργήσουμε tags για παραγράφους όπως ακριβώς κάναμε για το έντονο και πλάγιο κείμενο, υπάρχει και μια πιο απλή λύση. Εφόσον ο χρήστης θα καταχωρήσει το περιεχόμενο σ’ ένα πεδίο φόρμας (form field) που θα του δίνει τη δυνατότητα να μορφοποιήσει το κείμενο χρησιμοποιώντας το πλήκτρο enter, θα ορίσουμε το linefeed (\n) να δείχνει μια αλλαγή γραμμής (line break) και το διπλό linefeed (\n\n) να δείχνει μια νέα παράγραφο. Φυσικά, εφόσον τα PC&#8217;s παριστάνουν τις νέες γραμμές σαν ένα ζευγάρι του linefeed με το carriage return (\n\r) θα πρέπει πρώτα να αφαιρέσουμε τα carriage returns. Ο κώδικας γι’ όλα αυτά είναι ο εξής :</p><pre name="code" class="php">
// Αφαιρεί τα carriage returns
$joketext = ereg_replace("\r", "", $joketext);
// Χειρισμός των παραγράφων
$joketext = ereg_replace("\n\n", "
", $joketext);
// Χειρισμός των αλλαγών γραμμής (line breaks)
$joketext = ereg_replace("\n", "
", $joketext);
</pre><p>Το κείμενο θα εμφανίζεται τώρα σε παραγράφους όπως θα ανέμενε ο χρήστης και δεν χρειάζεται να μάθει να δημιουργεί προσαρμοσμένα tags για να το κάνει.</p><h1>Οι Υπερσύνδεσμοι (Hyperlinks)</h1><p>Ενώ μπορεί να φανεί ανόητο το να υποστηρίζουμε τους υπερσυνδέσμους (hyperlinks) στο κείμενο των jokes, αυτό το χαρακτηριστικό έχει νόημα σ’ άλλες εφαρμογές. Οι υπερσύνδεσμοι είναι λίγο περισσότερο πολύπλοκοι από την απλή μετατροπή ενός κώδικα σ’ ένα HTML tag. Πρέπει να μπορούμε να εξάγουμε ένα URL όπως και το κείμενο που πρέπει να εμφανίζεται σαν ο σύνδεσμος (link).<br
/> Ένα άλλο χαρακτηριστικό των συναρτήσεων ereg_replace() και eregi_replace() θα φανεί εδώ. Περιβάλλοντας ένα τμήμα της κανονικής έκφρασης με παρενθέσεις, μπορούμε να αποσπάσουμε το αντίστοιχο τμήμα του κειμένου που ταιριάζει και να το χρησιμοποιήσουμε στο string αντικατάστασης με τον κώδικα \\n, όπου το n είναι 1 για το πρώτο τμήμα της κανονικής έκφρασης που βρίσκεται σε παρενθέσεις, 2 για το δεύτερο και έως 9 για το ένατο. Ας δούμε το ακόλουθο παράδειγμα :</p><pre name="code" class="php">
$text = "banana";
$text = eregi_replace("(.*)(nana)", "\\2\\1", $text);
echo($text);               // εμφανίζει "nanaba"
</pre><p>Στο παραπάνω, το \\1 αντικαθίσταται με το ba στο string αντικατάστασης, το οποίο αντιστοιχεί στο (.*) (κανένας ή περισσότεροι χαρακτήρες διάφοροι της νέας γραμμής, new line) στην κανονική έκφραση. Το \\2 αντικαθίσταται με το nana, το οποίο αντιστοιχεί στο (nana) στην κανονική έκφραση.<br
/> Η ίδια αρχή μπορεί να χρησιμοποιηθεί για να δημιουργήσουμε τους υπερσυνδέσμους μας (hyperlinks). Θα ξεκινήσουμε με μια απλή φόρμα ενός link, όπου το κείμενο του link είναι το ίδιο με το URL. Θέλουμε να υποστηρίξουμε την εξής σύνταξη :</p><pre name="code" class="php">
Visit [L]http://www.php.net/[EL].
</pre><p>Ο αντίστοιχος HTML κώδικας είναι ο εξής :</p><pre name="code" class="html">
Visit <a href="http://www.php.net/"> http://www.php.net/ </a>
</pre><p>Πρώτα, χρειαζόμαστε μια κανονική έκφραση που θα ταιριάζει με τους συνδέσμους (links) αυτής της φόρμας, ως εξής :</p><pre name="code" class="php">
\[L][-_./a-zA-Z0-9!&amp;%#?,'=:~]+\[EL]
</pre><p>Ξανά, έχουμε τοποθετήσει backslashes μπροστά από τις αγκύλες στα [L] και [EL] για να δείξουμε ότι θα τα αντιμετωπίσουμε κυριολεκτικά. Χρησιμοποιούμε μετά αγκύλες (square brackets) για να εμφανίσουμε όλους τους χαρακτήρες που θέλουμε να δεχθούμε σαν μέρος του URL. Τοποθετούμε ένα + μετά από τις αγκύλες για να δείξουμε ότι το URL θα αποτελείται από έναν ή περισσότερους χαρακτήρες που παίρνονται από τη λίστα.<br
/> Για να εξάγουμε το link, θα πρέπει να βρούμε το URL και να το εξάγουμε σαν το HREF attribute του tag Α καθώς και σαν το κείμενο του link. Για να βρούμε το URL, περιβάλλουμε το αντίστοιχο τμήμα της κανονικής έκφρασης με παρενθέσεις :</p><pre name="code" class="php">
\[L]([-_./a-zA-Z0-9!&amp;%#?,'=:~]+)\[EL]
</pre><p>Έτσι, κάνουμε τη μετατροπή link με τον εξής κώδικα :</p><pre name="code" class="php">
$joketext = ereg_replace(
"\[L]([-_./a-zA-Z0-9!&amp;%#?,'=:~]+)\[EL]",
"<a href="\">\\1</a>", $joketext);
</pre><p>Έπρεπε να τοποθετήσουμε backslashes μπροστά από τα διπλά εισαγωγικά στον HTML κώδικα για να μην τα μπερδέψει η PHP με τα εισαγωγικά που περιβάλλουν το string αντικατάστασης. Το \\1 αντικαθίσταται με το URL για το link και η έξοδος είναι η αναμενόμενη.<br
/> Θα θέλαμε επίσης να υποστηρίξουμε τα hyperlinks που περιέχουν κείμενο link που διαφέρει από τα δικά τους URL. Ας υποθέσουμε ότι η μορφή του link μας είναι ως εξής :</p><pre name="code" class="php">
Check out [L=http://www.php.net/]PHP[EL].
</pre><p>Ακολουθεί η κανονική έκφραση :</p><pre name="code" class="php">
\[L=([-_./a-zA-Z0-9!&amp;%#?,'=:~]+)]([-_./a-zA-Z0-9 !&amp;%#?,'=:~]+)\[EL]
</pre><p>Το παραπάνω κάνει αυτό ακριβώς που θέλουμε, καθώς βρίσκει και το URL (\\1) και το κείμενο (\\2) για το link. Ο PHP κώδικας για να γίνει η αντικατάσταση είναι ο εξής :</p><pre name="code" class="php">
$joketext = ereg_replace(
"\[L=([-_./a-zA-Z0-9!&amp;%#?,'=:~]+)]".
"([-_./a-zA-Z0-9 !&amp;%#?,'=:~]+)\[EL]",
"<a href="\">\\2</a>", $joketext);
</pre>]]></content:encoded> <wfw:commentRss>http://greektuts.net/php-part-2/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Δημιουργήστε Μια Απλή Φόρμα Επικοινωνίας Σε PHP</title><link>http://greektuts.net/simple-php-contact-form/</link> <comments>http://greektuts.net/simple-php-contact-form/#comments</comments> <pubDate>Mon, 28 Sep 2009 11:34:52 +0000</pubDate> <dc:creator>Pantso</dc:creator> <category><![CDATA[PHP]]></category> <category><![CDATA[contact form]]></category> <category><![CDATA[επικοινωνία]]></category> <category><![CDATA[φόρμα]]></category> <category><![CDATA[φόρμα επικοινωνίας]]></category> <guid
isPermaLink="false">http://greektuts.net/?p=1415</guid> <description><![CDATA[Πολλές φορές χρειάζεται να φτιάξουμε μια φόρμα επικοινωνίας για την ιστοσελίδα μας, με τα πεδία και την λειτουργικότητα που εμείς θέλουμε. Σε αυτό το βοήθημα θα δούμε πως μπορούμε να δημιουργήσουμε μια απλή φόρμα επικοινωνίας από το μηδέν, γράφοντας κώδικα σε PHP και HTML.]]></description> <content:encoded><![CDATA[<p>Πρώτα από όλα θα πρέπει να δημιουργήσουμε το αρχείο που θα περιέχει την φόρμα επικοινωνίας. Το αρχείο αυτό θα ονομάζεται contact.html. Για να το δημιουργήσουμε μπορούμε πολύ απλά να δημιουργήσουμε ένα κενό αρχείο κειμένου (txt) και να το μετονομάσουμε σε contact.html.</p><h3><strong>Η Φόρμα Επικοινωνίας</strong></h3><p>Ανοίγοντας το νέο αρχείο που δημιουργήσαμε θα αρχίσουμε να γράφουμε τον κώδικα την φόρμας. Η φόρμα συν των άλλων θα έχει radio buttons, drop down selections και checkboxes, απλά για να δούμε την λειτουργία τους.</p><pre name="code" class="html">
&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Language" content="en-us"&gt;
&lt;meta http-equiv="Content-Type" content="text/html; charset=windows-1252"&gt;
&lt;title&gt;My Contact Form&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;form method="POST" action="mailer.php"&gt;
 ONOMA:
 &lt;input type="text" name="name" size="19"&gt;&lt;br&gt;
 &lt;br&gt;
 EMail:
 &lt;input type="text" name="email" size="19"&gt;&lt;br&gt;
 &lt;br&gt;
 &lt;input type="checkbox" name="check[]" value="blue"&gt; MPLE&lt;br&gt;
 &lt;input type="checkbox" name="check[]" value="green"&gt; PRASSINO&lt;br&gt;
 &lt;input type="checkbox" name="check[]" value="orange"&gt; PORTOKALI &lt;br&gt;
 &lt;br&gt;
 &lt;input type="radio" value="yes" name="radio"&gt; NAI&lt;br&gt;
 &lt;input type="radio" value="no" name="radio"&gt; OXI
 &lt;br&gt;
 &lt;br&gt;
 &lt;select size="1" name="drop_down"&gt;
 &lt;option&gt;php&lt;/option&gt;
 &lt;option&gt;xml&lt;/option&gt;
 &lt;option&gt;asp&lt;/option&gt;
 &lt;option&gt;jsp&lt;/option&gt;
 &lt;/select&gt;&lt;br&gt;
 &lt;br&gt;
 MHNYMA:&lt;br&gt;
 &lt;textarea rows="9" name="message" cols="30"&gt;&lt;/textarea&gt;&lt;br&gt;
 &lt;br&gt;
 &lt;input type="submit" value="Submit" name="submit"&gt;
&lt;/form&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre><p>Ο παραπάνω κώδικας, δημιουργεί τον πίνακα στον οποίο εμπεριέχεται η φόρμα επικοινωνίας μας. Πρέπει να προσέξουμε στις τιμές που έχει κάθε πεδίο, ώστε να μπορέσουμε να τα αποστείλουμε σωστά στο δεύτερο αρχείο μας που θα αναλάβει να αποστέιλει το email.</p><h3><strong>Αποστολή Των Στοιχείων</strong></h3><p>Έχοντας τελειώσει με την φόρμα μας, πρέπει να δημιουργήσουμε ένα δεύτερο αρχείο με όνομα mailer.php, το οποίο θα αποστέλλει τα στοιχεία που συμπληρώνει ο χρήστης στο email που θα επιλέξουμε . Μέσα σε αυτό θα επικολλήσουμε τον κώδικα που ακολουθεί</p><pre name="code" class="php">
&lt;?php
if(isset($_POST['submit'])) {
 $to = "email@email.gr";
 $subject = "Form Contact Form";
 $name_field = $_POST['name'];
 $email_field = $_POST['email'];
 $message = $_POST['message'];
 $option = $_POST['radio'];
 $dropdown = $_POST['drop_down'];
 foreach($_POST['check'] as $value) {
 $check_msg .= "Checked: $value\n";
 }
 $body = "From: $name_field\n E-Mail: $email_field\n $check_msg Option: $option\n Drop-Down: $dropdown\n Message:\n $message\n";
 echo "Your Mail Was Sent To $to!";
 mail($to, $subject, $body);
} else {
 echo "Error";
}
?&gt;
</pre><p>Ο παραπάνω κώδικας αναλαμβάνει να αποστείλει όλα τα στοιχεία που έχει εισάγει ο χρήστης στο email μας. Αυτό το κάνει παίρνοντας τις αξίες email,message,radio,drop_down,checkbox και name απο την φόρμα επικοινωνίας μας. Μας στέλνει λοιπόν ένα email με όλες τις επιλογές και τα στοιχεία που συμπλήρωσε ο χρήστης. Επίσης ειδοποιεί τον χρήστη αν το μήνυμα εστάλλει ή παρουσιάστηκε πρόβλημα.</p><p>Αντικαθιστούμε το email@email.gr με το email μας στο οποίο θέλουμε να λαμβάνουμε τα στοιχεία της φόρμας, και σώζουμε τα 2 αυτά αρχεία. Τώρα το μόνο που έμεινε είναι να ανεβάσουμε τα αρχεία μας στον server μας, και να δοκιμάσουμε την φόρμα που δημιουργήσαμε. Αυτό θα το κάνουμε αν περιηγηθούμε στην τοποθεσία που ανεβάσαμε τα αρχεία. Για παράδειγμα http://www.test.gr/contact.html.</p><p><strong>Μπορείτε να δείτε ένα παράδειγμα της φόρμας <a
href="http://demo.greektuts.net/contactform/contact.html">ΕΔΩ</a></strong></p><p><p
style="text-align: center; font-weight: bold;"><br><img
src="http://greektuts.net/images/GTMemberAccess.png" alt="Member Area" /> <br>Άν είστε ήδη συνδρομητής κάντε login με τα στοιχεία σας. Για να γίνετε συνδρομητής πατήστε <a
href="/wp-login.php?action=register">εδώ</a></p></p> ]]></content:encoded> <wfw:commentRss>http://greektuts.net/simple-php-contact-form/feed/</wfw:commentRss> <slash:comments>42</slash:comments> </item> <item><title>Eclipse Galileo: Δημιουργώντας το «Απόλυτο» Περιβάλλον Προγραμματισμού &#8211; Mέρος A</title><link>http://greektuts.net/eclipse-galileo/</link> <comments>http://greektuts.net/eclipse-galileo/#comments</comments> <pubDate>Sun, 20 Sep 2009 12:19:52 +0000</pubDate> <dc:creator>krap</dc:creator> <category><![CDATA[Java]]></category> <category><![CDATA[PHP]]></category> <category><![CDATA[Eclipse]]></category> <category><![CDATA[Galileo]]></category> <category><![CDATA[IDE]]></category> <category><![CDATA[Περιβάλλον Προγραμματισμού]]></category> <category><![CDATA[Προγραμματισμός]]></category> <guid
isPermaLink="false">http://greektuts.net/?p=1265</guid> <description><![CDATA[Όλοι οι προγραμματιστές στοχεύουν στο να κατασκευάσουν τη μία και μοναδική εφαρμογή που θα τους λύσει το οικονομικό τους πρόβλημα μια για πάντα. Μέχρις ότου όμως το πετύχουν, θα μπορούσαμε να πούμε πως το βασικότερο μέλημά τους είναι να κάνουν την προγραμματιστική τους ζωή ευκολότερη.]]></description> <content:encoded><![CDATA[<p>Στη σημερινή μας παρουσίαση, θα δούμε πως μπορούμε να αναπτύσσουμε προγράμματα σε κάποιες από τις γνωστότερες γλώσσες προγραμματισμού, κάνοντας χρήση ενός μόνον περιβάλλοντος ανάπτυξης, του Eclipse.<br
/> Στο πρώτο αυτό μέρος του όλου εγχειρήματος θα ασχοληθούμε με την ρύθμιση του Eclipse ώστε να φιλοξενεί προγράμματα σε Java και PHP scripts.</p><h2>Προαπαιτούμενα</h2><p>Για το συγκεκριμένο εγχειρίδιο θα θεωρήσουμε δεδομένη την ύπαρξη ενός Java Developement Kit – JDK. (Στα πλαίσια του παραδείγματος χρησιμοποιούμε το JDK 6 update 16 το οποίο μπορείτε να κατεβάσετε δωρεάν από <a
href="https://cds.sun.com/is-bin/INTERSHOP.enfinity/WFS/CDS-CDS_Developer-Site/en_US/-/USD/ViewProductDetail-Start?ProductRef=jdk-6u16-oth-JPR@CDS-CDS_Developer" target="_blank">εδώ</a>. Αποφύγετε να κατεβάσετε την έκδοση για 64bit διότι μπορεί η διαδικασία εγκατάστασης του Eclipse να διαφέρει από αυτήν που περιγράφουμε παρακάτω)</p><h2>Eclipse Galileo</h2><p>Παρακάτω θα σας δείξουμε πώς να εγκαταστήσετε την έκδοση Galileo του Eclipse. Όπως ήδη πολλοί από εσάς μπορεί να γνωρίζουν το Eclipse αποτελεί μια από τις γνωστότερες σουίτες προγραμματισμού και διατίθεται δωρεάν.</p><h2>Εγκατάσταση του Eclipse Galileo</h2><p>Επισκεπτόμαστε το www.eclipse.org/ και ακολουθούμε τον σύνδεσμο «Download Eclipse» όπως φαίνεται παρακάτω.</p><blockquote><p
style="text-align: center"><img
class="size-full wp-image-1274 aligncenter" src="http://static.greektuts.net/uploads/2009/09/image001.png" alt="image001" width="600" height="389" /></p></blockquote><p>Στη σελίδα που εμφανίζεται επιλέγουμε την έκδοση που μας ενδιαφέρει και ανάλογα με το λειτουργικό σύστημα που χρησιμοποιούμε κάνουμε κλικ στον κατάλληλο σύνδεσμο στα δεξιά. (Στα πλαίσια του παρόντος οδηγού θα ασχοληθούμε με την έκδοση «Eclipse IDE for Java Developers» ενώ η εγκατάσταση θα γίνει σε λειτουργικό σύστημα Windows).</p><blockquote><p
style="text-align: center"><img
class="size-full wp-image-1275 aligncenter" src="http://static.greektuts.net/uploads/2009/09/image002.png" alt="image002" width="600" height="442" /></p></blockquote><p>Αν όλα πήγαν καλά, αφότου ολοκληρωθεί η λήψη του πακέτου πρέπει να έχει φθάσει στον υπολογιστή μας ένα αρχείο με όνομα «eclipse-java-galileo-win32.rar». Αποσυμπιέζοντάς το προκύπτει ένας φάκελος με όνομα «eclipse» που περιέχει την εφαρμογή σε εκτελέσιμη μορφή.<br
/> Μετακινούμε τον φάκελο όπου μας βολεύει (π.χ. C:\Program Files\) και στη συνέχεια τον ανοίγουμε και κάνουμε διπλό κλικ στο «eclipse.exe».</p><blockquote><p
style="text-align: center"><img
class="size-full wp-image-1276 aligncenter" src="http://static.greektuts.net/uploads/2009/09/image003.png" alt="image003" width="600" height="502" /></p></blockquote><p>Πριν ανοίξει η κυρίως εφαρμογή καλούμαστε να επιλέξουμε τον φάκελο που θα χρησιμοποιεί το eclipse ως χώρο εργασίας (για να αποθηκεύει δηλαδή τα διάφορα projects μας). Δεν υπάρχει κάποιος περιορισμός ωστόσο πολλοί επιλέγουν να το δημιουργήσουν μέσα στον φάκελο του eclipse (στην περίπτωσή μας δηλαδή C:\Program Files\eclipse\workspace). Αν δεν θέλετε να ερωτάσθε κάθε φορά που ανοίγετε το Eclipse θα πρέπει να επιλέξετε το checkbox «Use this as the default and do not ask again».</p><blockquote><p
style="text-align: center"><img
class="size-full wp-image-1277 aligncenter" src="http://static.greektuts.net/uploads/2009/09/image004.png" alt="image004" width="600" height="411" /></p></blockquote><p>Μετά από αυτό η κύρια οθόνη του eclipse εμφανίζεται.</p><blockquote><p
style="text-align: center"><img
class="size-full wp-image-1278 aligncenter" src="http://static.greektuts.net/uploads/2009/09/image005.png" alt="image005" width="600" height="431" /></p></blockquote><p>Σε αυτό το σημείο η εγκατάσταση του Eclipse Galileo έχει ολοκληρωθεί.</p><h2>Δημιουργώντας το πρώτο μας Java πρόγραμμα με το Eclipse</h2><p>Ξεκινάμε δημιουργώντας ένα καινούριο Java Project (π.χ. TestEclipseJava).</p><blockquote><p
style="text-align: center"><img
class="size-full wp-image-1279 aligncenter" src="http://static.greektuts.net/uploads/2009/09/image006.png" alt="image006" width="600" height="431" /></p></blockquote><p>Δίνουμε ένα όνομα στο Project και επιλέγουμε «Next»</p><blockquote><p
style="text-align: center"><img
class="size-full wp-image-1280 aligncenter" src="http://static.greektuts.net/uploads/2009/09/image007.png" alt="image007" width="533" height="763" /></p></blockquote><p>Στην επόμενη οθόνη επιλέγουμε «Finish»</p><blockquote><p
style="text-align: center"><img
class="size-full wp-image-1281 aligncenter" src="http://static.greektuts.net/uploads/2009/09/image008.png" alt="image008" width="533" height="763" /></p></blockquote><p>Όπως μπορούμε να δούμε έχουμε επιστρέψει στο κεντρικό παράθυρο στο οποίο έχει δημιουργηθεί το Project με όνομα TestEclipseJava. Κάνοντας διπλό κλικ επάνω του εμφανίζεται το περιεχόμενό του. Κάνουμε δεξί κλικ στον φάκελο «src» και στη συνέχεια επιλέγουμε New &gt; Class.</p><blockquote><p
style="text-align: center"><img
class="size-full wp-image-1282 aligncenter" src="http://static.greektuts.net/uploads/2009/09/image009.png" alt="image009" width="600" height="433" /></p></blockquote><p>Στο επόμενο παράθυρο ονομάζουμε το πακέτο (main) και την κλάση μας (Main) και αφού ενεργοποιήσουμε το checkbox «public static void main(String [] args)» κάνουμε κλικ στο «Finish».</p><blockquote><p
style="text-align: center"><img
class="size-full wp-image-1283 aligncenter" src="http://static.greektuts.net/uploads/2009/09/image010.png" alt="image010" width="542" height="633" /></p></blockquote><p>Παρατηρούμε ότι έχει δημιουργηθεί η κλάση Main. Το checkbox που επιλέξαμε μας δημιούργησε αυτόματα και την main μέθοδο, που αποτελεί την μέθοδο έναρξης του project μας. Τώρα το μόνο που μένει είναι να γράψουμε ένα μικρό κομμάτι κώδικα για να τεστάρουμε ότι μεταγλωττίζεται σωστά. Ας προσθέσουμε μέσα στην main μέθοδο την ακόλουθη εντολή:</p><pre lang="java">System.out.println(“Programming Java is fun w/ Eclipse IDE”);</pre><blockquote><p
style="text-align: center"><img
class="size-full wp-image-1284 aligncenter" src="http://static.greektuts.net/uploads/2009/09/image011.png" alt="image011" width="600" height="431" /></p></blockquote><p>Η παραπάνω εντολή θα τυπώσει, μετά τη μεταγλώττιση, το μήνυμα που υπάρχει μέσα στην παρένθεση.<br
/> Για να μεταγλωττίσουμε («τρέξουμε» σε προγραμματιστική αργκό) το πρόγραμμά μας κάνουμε δεξί κλικ στην κλάση Main &gt; Run As &gt; Java Application.</p><blockquote><p
style="text-align: center"><img
class="size-full wp-image-1285 aligncenter" src="http://static.greektuts.net/uploads/2009/09/image012.png" alt="image012" width="600" height="434" /></p></blockquote><p>Αν τρέχουμε το Eclipse για πρώτη φορά θα δούμε να εμφανίζεται η παρακάτω οθόνη.</p><blockquote><p
style="text-align: center"><img
class="size-full wp-image-1286 aligncenter" src="http://static.greektuts.net/uploads/2009/09/image013.png" alt="image013" width="347" height="455" /></p></blockquote><p>Επιλέξτε την κλάση Main.java αλλά και το «Always save sources before launching» και κατόπιν επιλέξτε ΟΚ</p><blockquote><p
style="text-align: center"><img
class="size-full wp-image-1287 aligncenter" src="http://static.greektuts.net/uploads/2009/09/image014.png" alt="image014" width="600" height="409" /></p></blockquote><p>Αν όλα πήγαν καλά βλέπετε στην κονσόλα σας ένα μήνυμα αντίστοιχο με αυτό της παραπάνω εικόνας και σας αξίζει μία ζεστή κούπα καφές ή τσάι .</p><h2>Εγκατάσταση εργαλείων PHP για Eclipse</h2><p>Ας διανθίσουμε την υποστήριξη της ολοκαίνουριας εγκατάστασης Eclipse μας με μία scripting γλώσσα αυτή τη φορά, την PHP.<br
/> Όπως και παραπάνω, θα θεωρήσουμε δεδομένη την ύπαρξη ενός διερμηνευτή PHP στο σύστημά μας. Το παρόν εγχειρίδιο χρησιμοποιεί τον διερμηνευτή PHP που βρίσκεται ενσωματωμένος στο πακέτο WAMP server το οποίο διατίθεται δωρεάν <a
href="http://www.wampserver.com/dl.php" target="_blank">εδώ</a>.<br
/> Για την εγκατάσταση του πρόσθετου που εμπεριέχει τα εργαλεία PHP επιλέγουμε από το μενού του Eclipse, Help &gt; Install New Software…</p><blockquote><p
style="text-align: center"><img
class="size-full wp-image-1288 aligncenter" src="http://static.greektuts.net/uploads/2009/09/image015.png" alt="image015" width="600" height="483" /></p></blockquote><p>Στο πεδίο Work with: επιλέγουμε &#8211; - All available sites &#8211; - .</p><blockquote><p
style="text-align: center"><img
class="size-full wp-image-1289 aligncenter" src="http://static.greektuts.net/uploads/2009/09/image016.png" alt="image016" width="600" height="481" /></p></blockquote><p>Αφότου φορτωθούν όλα τα διαθέσιμα πακέτα, ανοίγουμε το πακέτο «Programming Languages».</p><blockquote><p
style="text-align: center"><img
class="size-full wp-image-1290 aligncenter" src="http://static.greektuts.net/uploads/2009/09/image017.png" alt="image017" width="600" height="516" /></p></blockquote><p>Κατόπιν χρησιμοποιώντας το βελάκι στα αριστερά, από τα περιεχόμενά του επιλέγουμε «PHP Development Tools (PDT) SDK Feature».</p><blockquote><p
style="text-align: center"><img
class="size-full wp-image-1291 aligncenter" src="http://static.greektuts.net/uploads/2009/09/image018.png" alt="image018" width="600" height="516" /></p></blockquote><p>Επιλέγουμε «Next» στην επόμενη οθόνη</p><blockquote><p
style="text-align: center"><img
class="size-full wp-image-1292 aligncenter" src="http://static.greektuts.net/uploads/2009/09/image019.png" alt="image019" width="600" height="516" /></p></blockquote><p>Και τελικά φθάνουμε στην παρακάτω οθόνη στην οποία επιλέγουμε «Finish» αφότου αποδεχθούμε την άδεια εγκατάστασης επιλέγοντας «I accept the terms of the license agreements»</p><blockquote><p
style="text-align: center"><img
class="size-full wp-image-1293 aligncenter" src="http://static.greektuts.net/uploads/2009/09/image020.png" alt="image020" width="600" height="516" /></p></blockquote><p>Περιμένουμε να εγκατασταθούν τα πακέτα.</p><blockquote><p
style="text-align: center"><img
class="size-full wp-image-1294 aligncenter" src="http://static.greektuts.net/uploads/2009/09/image021.png" alt="image021" width="600" height="483" /></p></blockquote><p>Όταν τελειώσει η εγκατάσταση το Eclipse θα μας ζητήσει να επανεκκινηθεί. Επιλέγουμε «Yes».</p><blockquote><p
style="text-align: center"><img
class="size-full wp-image-1295 aligncenter" src="http://static.greektuts.net/uploads/2009/09/image022.png" alt="image022" width="532" height="165" /></p></blockquote><p>Το πρόσθετο για προγραμματισμό σε PHP έχει εγκατασταθεί και αφότου κάνουμε ορισμένες ρυθμίσεις μπορούμε να δημιουργήσουμε το πρώτο μας PHP script.<br
/> Εν αρχή ήν οι ρυθμίσεις όμως…<br
/> Από το μενού «Window» του Eclipse επιλέγουμε «Preferences»</p><blockquote><p
style="text-align: center"><img
class="size-full wp-image-1296 aligncenter" src="http://static.greektuts.net/uploads/2009/09/image030.png" alt="image030" width="600" height="483" /></p></blockquote><p>Στο παράθυρο που εμφανίζεται κάνουμε κλικ στο μενού PHP και κατόπιν στο υπομενού Debug.</p><blockquote><p
style="text-align: center"><img
class="size-full wp-image-1297 aligncenter" src="http://static.greektuts.net/uploads/2009/09/image031.png" alt="image031" width="600" height="523" /></p></blockquote><p>Δίπλα στην επιλογή PHP Executables κάνουμε κλικ στον σύνδεσμο «PHP Executables»</p><blockquote><p
style="text-align: center"><img
class="size-full wp-image-1298 aligncenter" src="http://static.greektuts.net/uploads/2009/09/image032.png" alt="image032" width="600" height="523" /></p></blockquote><p>Εμφανίζεται ένα παράθυρο το οποίο μας ζητά να δηλώσουμε τον φάκελο στον οποίο βρίσκεται το αρχείο «php.exe», το αρχείο «php.ini» και επίσης να δώσουμε ένα όνομα στο executable που δημιουργούμε. (Στην παρακάτω εικόνα φαίνονται οι κατάλογοι στους οποίους τοποθετεί ο WAMP Server, που χρησιμοποιείται στα πλαίσια του παρόντος οδηγού, τα αρχεία php.exe και php.ini. Άναλογα με την έκδοση και την εκάστοτε εγκατάσταση της PHP οι κατάλογοι αυτοί ενδέχεται να διαφέρουν).</p><blockquote><p
style="text-align: center"><img
class="size-full wp-image-1299 aligncenter" src="http://static.greektuts.net/uploads/2009/09/image034.png" alt="image034" width="576" height="429" /></p></blockquote><p>Επιλέγουμε «Finish» και εμφανίζεται το παράθυρο με δηλωμένο το καινούριο executable.</p><blockquote><p
style="text-align: center"><img
class="size-full wp-image-1300 aligncenter" src="http://static.greektuts.net/uploads/2009/09/image035.png" alt="image035" width="600" height="483" /></p></blockquote><h2>Δημιουργώντας το πρώτο μας PHP script με το Eclipse</h2><p>Αρχικά δημιουργούμε ένα καινούριο Project. Επειδή όμως δεν θέλουμε ένα Java Project, αλλά ένα PHP Project επιλέγουμε Project αντί Java Project όπως φαίνεται παρακάτω.</p><blockquote><p
style="text-align: center"><img
class="size-full wp-image-1301 aligncenter" src="http://static.greektuts.net/uploads/2009/09/image023.png" alt="image023" width="600" height="483" /></p></blockquote><p>Στο παράθυρο που εμφανίζεται επιλέγουμε «PHP Project»</p><blockquote><p
style="text-align: center"><img
class="size-full wp-image-1302 aligncenter" src="http://static.greektuts.net/uploads/2009/09/image024.png" alt="image024" width="525" height="500" /></p></blockquote><p>Δίνουμε ένα όνομα στο Project μας (π.χ. TestEclipsePHP) και επιλέγουμε «Next»</p><blockquote><p
style="text-align: center"><img
class="size-full wp-image-1303 aligncenter" src="http://static.greektuts.net/uploads/2009/09/image025.png" alt="image025" width="542" height="763" /></p></blockquote><p>Στην επόμενη οθόνη που εμφανίζεται επιλέγουμε την καρτέλα «Libraries», επιλέγουμε το «PHP Language Library» και κάνουμε κλικ στο «Remove» στα δεξιά. Επιλέγουμε «Next» για να συνεχίσουμε.</p><blockquote><p
style="text-align: center"><img
class="size-full wp-image-1304 aligncenter" src="http://static.greektuts.net/uploads/2009/09/image027.png" alt="image027" width="542" height="763" /></p></blockquote><p>Επιλέγουμε «Νext» χωρίς να κάνουμε κάποια αλλαγή.</p><blockquote><p
style="text-align: center"><img
class="size-full wp-image-1305 aligncenter" src="http://static.greektuts.net/uploads/2009/09/image028.png" alt="image028" width="542" height="763" /></p></blockquote><p>Φθάνουμε στο τελικό παράθυρο στο οποίο και επιλέγουμε «Finish».</p><blockquote><p
style="text-align: center"><img
class="size-full wp-image-1306 aligncenter" src="http://static.greektuts.net/uploads/2009/09/image029.png" alt="image029" width="542" height="763" /></p></blockquote><p>Το Project μας δημιουργείται και τοποθετείται ακριβώς κάτω από το Java Project που είχαμε κάνει στο πρώτο μέρος του οδηγού. Κάνουμε δεξί κλικ επάνω του &gt; New &gt; PHP File για να δημιουργήσουμε ένα νέο PHP αρχείο.</p><blockquote><p
style="text-align: center"><img
class="size-full wp-image-1307 aligncenter" src="http://static.greektuts.net/uploads/2009/09/image036.png" alt="image036" width="600" height="482" /></p></blockquote><p>Στην οθόνη που εμφανίζεται ονομάζουμε το αρχείο (π.χ. main.php) και επιλέγουμε «Next».</p><blockquote><p
style="text-align: center"><img
class="size-full wp-image-1308 aligncenter" src="http://static.greektuts.net/uploads/2009/09/image037.png" alt="image037" width="580" height="500" /></p></blockquote><p>Διατηρούμε την επιλογή «New Simple PHP File» και επιλέγουμε «Next».</p><blockquote><p
style="text-align: center"><img
class="size-full wp-image-1309 aligncenter" src="http://static.greektuts.net/uploads/2009/09/image038.png" alt="image038" width="580" height="500" /></p></blockquote><p>Παρατηρούμε ότι το αρχείο μας δημιουργήθηκε και τώρα μπορούμε να γράψουμε (αισίως!) λίγο κώδικα.</p><blockquote><p
style="text-align: center"><img
class="size-full wp-image-1310 aligncenter" src="http://static.greektuts.net/uploads/2009/09/image039.png" alt="image039" width="600" height="483" /></p></blockquote><p>Προσθέτουμε κάτω από την εντολή &lt;?php τις εντολές:</p><pre lang="php">echo(“Programming PHP using Eclipse is fun”);</pre><p>?&gt;</p><blockquote><p
style="text-align: center"><img
class="size-full wp-image-1311 aligncenter" src="http://static.greektuts.net/uploads/2009/09/image040.png" alt="image040" width="600" height="483" /></p></blockquote><p>Κάνουμε δεξί κλικ στο main.php &gt; Run As &gt; Run Configurations…</p><blockquote><p
style="text-align: center"><img
class="size-full wp-image-1312 aligncenter" src="http://static.greektuts.net/uploads/2009/09/image041.png" alt="image041" width="600" height="483" /></p></blockquote><p>Στην οθόνη που εμφανίζεται αποεπιλέγουμε το checkbox «Display debug information when running» και επιλέγουμε «Run». Αυτό το κάνουμε γιατί δεν έχουμε (ακόμη ) σετάρει κάποιον Debugger για PHP μέσω Eclipse.</p><blockquote><p
style="text-align: center"><img
class="size-full wp-image-1313 aligncenter" src="http://static.greektuts.net/uploads/2009/09/image042.png" alt="image042" width="600" height="485" /></p></blockquote><p>Αν η κονσόλα σας λέει «Programming PHP using Eclipse is fun» ή οτιδήποτε άλλο περιλάβατε μέσα στα εισαγωγικά της εντολής echo(“”) σας αξίζει μια δεύτερη κούπα καφές ή τσάι.<br
/> Αυτό ήταν το πρώτο μέρος του οδηγού «Eclipse Galileo: Δημιουργώντας το «απόλυτο» περιβάλλον προγραμματισμού». Μέχρι την επόμενη φορά, να είστε καλά και να προσέχετε τον εαυτό σας.</p> ]]></content:encoded> <wfw:commentRss>http://greektuts.net/eclipse-galileo/feed/</wfw:commentRss> <slash:comments>3</slash:comments> </item> <item><title>Εισαγωγη στην PHP</title><link>http://greektuts.net/php-part-1/</link> <comments>http://greektuts.net/php-part-1/#comments</comments> <pubDate>Sun, 29 Mar 2009 21:00:51 +0000</pubDate> <dc:creator>Pantso</dc:creator> <category><![CDATA[PHP]]></category> <category><![CDATA[Εισαγωγη στην PHP]]></category> <guid
isPermaLink="false">http://greektuts.net/?p=422</guid> <description><![CDATA[Σε αυτό το άρθρο θα κάνουμε τα πρώτα μας βήματα στην γλώσσα προγραμματισμού PHP.  ]]></description> <content:encoded><![CDATA[<h3></h3><p>Η PHP είναι μια γλώσσα προγραμματισμού για web servers, χρήσιμη για δυναμικές ιστοσελίδες, οι οποίες μπορούν να διασυνδέσουν με μια βάση δεδομένων. Η PHP είναι δωρεάν για χρήση, και είναι η δημοφιλέστερη για τους hosts Unix και Linux, αν και υπάρχουν εκδόσεις διαθέσιμες για τα Windows.</p><h3>Τι Είναι η Php</h3><p>Η γλώσσα προγραμματισμού Php (Hypertext PreProcessor) έχει το ιδιαίτερο χαρακτηριστικό ότι ο κώδικάς της πρώτα μεταγλωττίζεται στον server και μετά φορτώνεται σαν ένα κανονικό html έγγραφο, χωρίς ο χρήστης να είναι σε θέση να δει τον αρχικό κώδικα. Με την τεχνολογία της Php μπορούμε να δημιουργήσουμε δυναμικές ιστοσελίδες (dynamic web pages).<br
/> Ανταγωνιστικές της τεχνολογίας Php είναι η τεχνολογία ASP (Active Server Pages) της εταιρείας Microsoft καθώς και η τεχνολογία CFML (ColdFusion Markup Language). Θα δούμε ένα πολύ απλό αρχικό παράδειγμα.</p><h3>Το Πρώτο Παράδειγμα σε Php</h3><p>Γράφουμε τον παρακάτω κώδικα της Php σ&#8217; ένα αρχείο κειμένου με το Σημειωματάριο (Notepad) των Windows και τον αποθηκεύουμε με το όνομα Php01.php :</p><pre name="code" class="php">
echo "";
echo "Hello";
echo "";
?&gt;
</pre><p>Αποθηκεύουμε το παραπάνω αρχείο σ&#8217; έναν Web server και αν αυτός υποστηρίζει την τεχνολογία Php, θα δούμε το μήνυμα Hello στην οθόνη μας, ενώ αν επιχειρήσουμε να δούμε τον πηγαίο κώδικα (source code) θα υπάρχουν μόνο τα tags της HTML, χωρίς τις σημάνσεις της Php.<br
/> Οι ετικέτες (tags)  χρησιμοποιούνται για να δηλώσουμε ένα μπλοκ κώδικα Php. Για να είναι σε θέση ο web server να επεξεργαστεί τον κώδικα της Php, πρέπει να του πούμε πού αρχίζει και πού τελειώνει ένα μπλοκ κώδικα Php. Μπορούμε να τοποθετήσουμε κώδικα της HTML μέσα στον κώδικα της Php, ο οποίος θα εκτελεσθεί κανονικά.<br
/> Το παραπάνω παράδειγμα θα μπορούσε να είχε γραφεί και ως εξής :</p><pre name="code" class="php">
echo "Hello";
?&gt;</pre><p>Η εντολή echo χρησιμοποιείται για να στείλουμε ένα κείμενο (string) στον φυλλομετρητή (browser). Όλες οι εντολές της Php πρέπει να τελειώνουν με τον χαρακτήρα ; και μια εντολή μπορεί να επεκταθεί και σε περισσότερες από μία γραμμές. Όταν ο φυλλομετρητής ενός χρήστη ζητήσει μια σελίδα Php σαν την παραπάνω, ο server θα την επεξεργαστεί, θα μετατρέψει τον κώδικα Php σε καθαρή HTML μορφή και έτσι ο χρήστης δεν θα μπορέσει να δει τον αρχικό κώδικα Php.</p><h3>Οι Μεταβλητές στην Php</h3><p>Στην Php μπορούμε να χρησιμοποιήσουμε και μεταβλητές (variables) για να αποθηκεύουμε και να ανακτούμε δεδομένα που χρησιμοποιούμε συχνά. Όλες οι μεταβλητές πρέπει να αρχίζουν με τον χαρακτήρα $ και ένα απλό παράδειγμα κώδικα Php που χρησιμοποιεί μεταβλητές και εμφανίζει το ίδιο αποτέλεσμα με το πρώτο παράδειγμα είναι το εξής :</p><pre name="code" class="php">
$string="Hello";
echo "";
echo "$string";
echo "";
?&gt;
</pre><p>Το όνομα μιας μεταβλητής μπορεί να αποτελείται από γράμματα και ψηφία, αλλά πρέπει να ξεκινά οπωσδήποτε με γράμμα. Μπορεί να περιέχει και τον ειδικό χαρακτήρα _ (underscore). Οι μεταβλητές της Php μπορούν να περιέχουν κείμενο ή και αριθμούς :</p><pre name="code" class="php">
$string1="Florina";
$number1=2;
</pre><h3>Η Εντολή if στην Php</h3><p>Στο παρακάτω παράδειγμα, ο έλεγχος μεταβιβάζεται σε μία από τρεις εντολές ανάλογα με την τρέχουσα ώρα.</p><pre name="code" class="php">
$date=date("H");
echo ""
if ($date&lt;12) echo "Καλημέρα";
else if ($date&lt;18) echo "Καλό απόγευμα";
else echo "Καληνύχτα";
echo "";
?&gt;
</pre><p>Η συνάρτηση date(&#8220;H&#8221;) της Php επιστρέφει την ώρα του υπολογιστή σε 24ωρη μορφή και έτσι η μεταβλητή $date θα περιέχει ένα string με τιμές από 0 έως 23, το οποίο μπορούμε να χειριστούμε σαν έναν κανονικό αριθμό.</p><h3>Η Εντολή for στην Php</h3><p>Το παρακάτω παράδειγμα δείχνει τη χρήση της εντολής for στην Php, όπου εκτυπώνεται ένα μήνυμα 10 φορές.</p><pre name="code" class="php">
echo "";
for ($i=0; $i&lt;10; $i++){
echo "$i Florina
\n";
}
echo "";
?&gt;
</pre><h3>Η Μεταβλητή $HTTP_USER_AGENT της Php</h3><p>Θα χρησιμοποιήσουμε τώρα την Php για να εξακριβώσουμε ποιον φυλλομετρητή (browser) χρησιμοποιεί ο επισκέπτης της ιστοσελίδας μας. Για να γίνει αυτό θα ελέγξουμε το string user_agent που στέλνει ο φυλλομετρητής όταν κάνει την αίτησή του (request) για να φορτώσει τη σελίδα. Η πληροφορία για το ποιος φυλλομετρητής είναι αποθηκεύεται στην εξής μεταβλητή :</p><pre name="code" class="php">
$HTTP_USER_AGENT
</pre><p>και για να εμφανίσουμε την τιμή της, μπορούμε να γράψουμε την εξής εντολή Php :</p><pre name="code" class="php">
&lt; ?php echo $HTTP_USER_AGENT; ?&gt;
</pre><p>Για να δούμε όλες τις μεταβλητές που δημιουργούνται αυτόματα από τον Web server, μπορούμε να γράψουμε την εξής εντολή :</p><pre name="code" class="php">
&lt; ?php phpinfo(); ?&gt;
</pre><p>Η Php περιέχει τη συνάρτηση strstr(), η οποία ψάχνει να βρει αν υπάρχει ένα string μέσα σ&#8217; ένα άλλο string. Θα την χρησιμοποιήσουμε για να βρούμε αν το string &#8220;MSIE&#8221; υπάρχει μέσα στην τιμή της μεταβλητής $HTTP_USER_AGENT, δηλ. στην ουσία ψάχνουμε να βρούμε αν ο χρήστης χρησιμοποιεί τον Internet Explorer για να δει τη σελίδα μας.<br
/> Γράφουμε λοιπόν την εξής εντολή if της Php σε μια HTML σελίδα :</p><pre name="code" class="php">
if (strstr($HTTP_USER_AGENT, "MSIE")) {
?&gt;
<strong> Χρησιμοποιείτε τον Internet Explorer </strong>
} else {
?&gt;
<strong> Δεν χρησιμοποιείτε τον Internet Explorer </strong>
}
?&gt;
</pre><h3>Η Php και οι Φόρμες (Forms)</h3><p>Ενα από τα ισχυρότερα χαρακτηριστικά της Php είναι ο τρόπος που χειρίζεται τις φόρμες της HTML. Ολα τα στοιχεία μιας φόρμας δημιουργούν μια μεταβλητή με το ίδιο όνομα. Θα δούμε ένα απλό παράδειγμα που περιέχει μια φόρμα σαν την ακόλουθη :</p><pre name="code" class="php">
<form action="action.php" method="post"> Ονομα :
<input name="name" type="text" />
Ηλικία :
<input name="age" type="text" />
<input type="submit" />
</form>
</pre><p>Οταν ο χρήστης καταχωρήσει κάποια στοιχεία σ&#8217; αυτή τη φόρμα και κάνει κλικ στο πλήκτρο Submit για να την υποβάλλει, θα κληθεί η σελίδα action.php, μέσα στην οποία θα μπορούμε να επεξεργαστούμε τις μεταβλητές για το όνομα και την ηλικία, ως εξής :</p><pre name="code" class="php">
Γεια σου &lt; ?php echo $name; ?&gt; .
Είσαι &lt; ?php echo $age; ?&gt; ετών.
</pre>]]></content:encoded> <wfw:commentRss>http://greektuts.net/php-part-1/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> </channel> </rss>
