470 likes | 713 Views
Aksesimi i bazes se te dhenave MySQL nepermjet PHP-se. Leksion 13. Arkitektura e nje baze te dhenash ne web.
E N D
Aksesimi i bazes se te dhenave MySQL nepermjet PHP-se Leksion 13
Arkitektura e nje baze te dhenash ne web • Veprimi baze i nje web serveri tregohet ne figure. Sistemi perbehet nga dy objekte: nje Web server dhe nje Web browser. Ndermjet tyre kerkohet nje linje komunikimi: Nje web browser ben nje kerkese ne web server dhe web serveri kthen pergjigjen. • Kjo arkitekture perdoret per shperndarjen e faqeve statike. Ndersa per web sitet me nje baze te dhenash, arkitektura eshte pak me komplekse:
Arkitektura e nje baze te dhenash ne web • Nje transaksion tipik i bazes se te dhenave web perbehet nga etapat e meposhtme: • Web browseri i nje perdoruesi dergon nje kerkese HTTP per nje faqe web te caktuar. Psh: mund te beje nje kerkim per te gjithe librat ne bazen e te dhenave Books te shkruar nga Laura Thomson, duke perdorur nje forme HTML. Faqja e rezultateve te kerkimit quhet results.php • Web serveri merr kerkesen per results.php, merr skedarin dhe ia dergon ate motorit te PHP-se per procesim.
Arkitektura e nje baze te dhenash ne web • Motori PHP fillon duke analizuar (parsing) skriptin. Brenda skriptit eshte nje komande per t’u lidhur me bazen e te dhenave dhe per te ekzekutuar nje query (kryen kerkimin per librat). PHP hap nje lidhje me serverin MySQL dhe i dergon query-n e duhur. • Serveri MySQL e merr query-n e bazes se te dhenave dhe e perpunon ate, dhe dergon rezultatet, nje liste librash, ne motorin e PHP-se • Motori i PHP-se perfundon ekzekutimin e skriptit, i cili zakonisht do te perfshije formatimin e rezultateve te query-t, ne menyre te kendeshme ne HTML. Ai me pas i kthen rezultatet HTML ne Web server. • Web Serveri e kalon HTML-ne ne browser, ku perdoruesi mund te shohe listen e librave qe ka kerkuar.
Percaktimi se cilenPaketeMySQLduhetteperdorni • Paketa mysqli (MySQL Improved) u be e disponueshme me PHP 5 dhe eshte dizenjuar qe te punoje me versionin 4.1.3 te MySQL-se dhe me versionet e mevonshme. • Versionet me te hershme duhet te perdorin paketen mysql • Paketa mysqli eshte paketa ekuivalente e orientuar nga objektet (object-oriented) e paketes mysql, por mund te perdoret edhe ne menyre procedurale. • Paketa mysqli ka permiresuar shpejtesine, sigurine dhe kompatibilitetin me librarite.
Hapjadhembyllja e njelidhjejeMySQL • Per te hapur nje lidhje me nje server databaze MySQL perdoret funksioni mysql_connect() • Funksioni mysql_connect() kthen nje numer te plote pozitiv nese ai lidhet me databazen ne menyre te suksesshme, perndryshe kthen FALSE • Vlera e kthimit te funksionit mysql_connect() duhet t’i jepet si vlere nje variabli ne menyre qe te aksesoni databazen brenda skriptit tuaj.
Hapja dhe mbyllja e nje lidhjeje MySQL (vazhd.) • Sintaksa e mysql_connect() eshte: $connection = mysql_connect("host" [, "user", "password"]); • Parametri host percakton emrin e hostit ku eshte i instaluar serveri i databazes suaj MySQL • Parametrat user dhe password percaktojne emrin perdoruesit dhe passwordin e nje llogarie MySQL
Hapja dhe mbyllja e nje lidhjeje MySQL (vazhd.) • Lidhja me databazen i jepet si vlere variablit $DBConnect $DBConnect = mysql_connect("localhost", "dongosselin ", "rosebud"); • Lidhja me databazen mund te mbyllet me ane te funksionit mysql_close() mysql_close($DBConnect);
Hapja dhe mbyllja e nje lidhjeje MySQL (vazhd.) Figure 8-1 MySQLInfo.php ne nje Web browser
Hapja dhe mbyllja e nje lidhjeje MySQL (vazhd.) • Nje funksion tjeter qe ben pothuajse te njejten gje si funksioni mysql_connect eshte funksioni mysql_pconnect(). Ndryshimi eshte se mysql_pconnect kthen nje lidhje te qendrueshme me bazen e te dhenave. • Nje lidhje normale me bazen e te dhenave do te mbyllet kur skripti e perfundon ekzektutimin ose kur skripti therret funksionin mysql_close(). Nje lidhje e qendrueshme mbetet e hapur pasi perfundon ekzekutimi i skriptit dhe nuk mund te mbyllet me funksionin mysql_close(). • Lind pyetja “Pse mund te na duhet kjo?” Lidhja me nje baze te dhenash kerkon njefare kohe. Kur thirret mysql_connect(), perpara se te perpiqet te lidhet me bazen e te dhenave, ai do te kerkoje automatikisht nese ka ndonje lidhje te qendrueshme qe eshte hapur qe me pare. Nese po, ai do te perdore ate lidhje ne vend qe te hape nje lidhje tjeter. Kjo kursen kohen dhe ngarkesen e serverit.
Hapja dhe mbyllja e nje lidhjeje MySQL (vazhd.) • Cilen te perdorim: mysql_connect apo mysql_pconnect? • Mendimet jane te ndryshme: Disa mendojne se eshte me mire te perdoret mysql_connect, sepse mysql_pconnect() u dizenjua per te siguruar nje mekanizem per reduktimin e kostos se hapjes dhe mbylljes se lidhjeve me serverin MySQL. Fatkeqesisht, per shkak te bashkeveprimit ndermjet arkitektures se serverit Apache dhe arkitektures se PHP-se, trafiku i larte ne nje site qe perdor lidhje te qendrueshme (pconnect) shpejt mund ta mbushe serverin MySQL me shume lidhje te paperdorura, gje qe do te ndalonte shume lidhje aktive qe te aksesonin databazen.
Raportimi i gabimeve MySQL • Arsyet per te mos u lidhur me nje server databaze perfshijne: • Serveri i databazes nuk eshte ne pune. • Privilegje te pamjaftueshme per te aksesuar burimin e te dhenave • Username dhe/ose password i pasakte
RaportimiigabimeveMySQL (vazhd.) • Funksioi mysql_errno() kthen kodin e gabimit nga perpjekja e fundit e thirrjes se nje funksioni MySQL, ose 0 nese nuk ka ndodhur asnje gabim. • mysql_error() — Kthen tekstin e mesazhit te gabimit nga veprimi i meparshem MySQL • Funksionet mysql_errno() dhe mysql_error() kthejne rezultatin e funksionit te meparshem mysql*()
Zgjedhja e nje Databaze • Sintaksa e funksionit mysql_select_db() eshte: mysql_select_db(database [, connection]); • Funksioni kthen nje vlere TRUE nese e ka zgjedhur me sukses databazen , ose FALSE ne te kundert • Per qellime sigurie, ju mumd te zgjidhni te perdorni nje skedar te perfshire per t’u lidhur me nje server MySQL dhe per te zgjedhur nje databaze.
Shembull <?php $host="localhost"; $userName = "root"; $password = ""; $database ="test"; $db = mysql_connect($host,$userName,$password); if (!$db) { die("Could not connect: ".mysql_error()); } echo("Connected successfully"); mysql_close($db); ?> Funksionidie, ne keteshembull, printonnjemesazhdhe del ngaskriptiaktual. Kyfunksioneshtenjepseudonimifunksionit exit(). Sintaksaeshtedie(message)
Shembull <?php $db = mysql_connect("localhost","root",""); if (!$db) { die("Could not connect: ".mysql_error()); } echo("Connected successfully"); $db_selected = mysql_select_db("test", $db); if (!$db_selected) { die ("Can\'t use test : ".mysql_error()); } mysql_close($db); ?>
Kapercimiigabimeve me operatorin e KontrollitteGabimeve • Ne menyre default, funksionet ne paketen mysql i shfaqin gabimet dhe lajmerimet kur ato ndodhin • Perdorni operatorin e kontrollit te gabimeve (@) per te kapercyer mesazhet e gabimeve • Ky operator mund t’i shtohet çdo shprehjeje
Ekzekutimi i shprehjeve SQL • Perdorni funksionin mysql_query() per te derguar shprehje SQL tek MySQL • Sintaksa e funksionit mysql_query() eshte: mysql_query(query [, connection]);
Ekzekutimiishprehjeve SQL (vazhd) • Funksioni mysql_query() kthen nje nga tri vlerat: 1) Per shprehjet SQL qe nuk kthejne rezultate (CREATEDATABASE dhe CREATE TABLE) kthen nje vlere TRUE nese shprehja u ekzekutua me sukses 2) Per shprehjet SQL qe kthejne rezultate (SELECT) funksioni mysql_query() kthen nje shenjues rezultati qe perfaqeson rezultatet e query-t • Nje shenjues rezultati eshte nje tip i veçante variabli qe i referohet rreshtit aktual te zgjedhur ne nje bashkesi rezultatesh (resultset) 3) Funksioni mysql_query() kthen nje vlere FALSE per çdo shprehje SQL qe deshton, pavaresisht nese ato kthejne rezultate apo jo.
Shembull • <?php// This could be supplied by a user, for example$firstname = 'fred';$lastname = 'fox';// Formulate Query. This is the best way to perform an SQL query$query = sprintf("SELECT firstname, lastname, address, age FROM friends WHERE firstname='%s' AND lastname='%s'",mysql_real_escape_string($firstname),mysql_real_escape_string($lastname));// Perform Query$result = mysql_query($query);// Check result This shows the actual query sent to MySQL, and the error. Useful for debugging.if (!$result) {$message = 'Invalid query: ' . mysql_error() . "\n";$message .= 'Whole query: ' . $query; die($message);}// Use result. Attempting to print $result won't allow access to information in the resource// One of the mysql result functions must be used. See also mysql_result(), mysql_fetch_array(), mysql_fetch_row(), etc.while ($row = mysql_fetch_assoc($result)) { echo $row['firstname']; echo $row['lastname']; echo $row['address']; echo $row['age'];}// Free the resources associated with the result set . This is done automatically at the end of the scriptmysql_free_result($result);?>
Shtimi, FshirjadheModifikimiiRekordeve • Per te shtuar rekorde ne nje tabele, perdrni fjalet kyçe INSERT dhe VALUES me funksionin mysql_query() • Per te shtuar shume rekorde ne nje databaze, perdorni shprehjen LOAD DATA bashke me emrin e skedarit tekst lokal qe permban rekordet qe doni te shtoni • Per te modifikuar rekordet ne nje tabele perdorni shprehjen UPDATE
Shtimi, FshirjadheModifikimiiRekordeve <?php$con = mysql_connect("localhost","peter","abc123");if (!$con) { die('Could not connect: ' . mysql_error()); }mysql_select_db("my_db", $con);mysql_query("INSERT INTO Persons (FirstName, LastName, Age)VALUES ('Peter', 'Griffin', '35')");mysql_query("INSERT INTO Persons (FirstName, LastName, Age) VALUES ('Glenn', 'Quagmire', '33')");mysql_close($con);?>
Shtimi, FshirjadheModifikimiiRekordeve • Per te fshire rekordet ne nje tabele perdorni shprehjen DELETE me funksionin mysql_query() • Per te fshire te gjithe rekordet ne tabele, hiqeni pjesen WHERE
Shtimi, FshirjadheModifikimiiRekordeve <?php$con = mysql_connect("localhost","peter","abc123");if (!$con) { die('Could not connect: ' . mysql_error()); }mysql_select_db("my_db", $con);mysql_query("UPDATE Persons SET Age = '36'WHERE FirstName = 'Peter' AND LastName = 'Griffin'");mysql_close($con);?>
Marrja e rekordeve ne nje vektor te indeksuar • Funksioni mysql_fetch_row() kthen fushat ne rreshtin aktual te bashkesise se rezultateve ne nje vektor te indeksuar dhe e con shenjuesin e rezultatit ne rreshtin tjeter. echo "<table width='100%‘ border='1'>"; echo "<tr><th>Make</th><th>Model</th> <th>Price</th><th>Quantity</th></tr>"; $Row = mysql_fetch_row($QueryResult); do { echo "<tr><td>{$Row[0]}</td>"; echo "<td>{$Row[1]}</td>"; echo "<td align='right'>{$Row[2]}</td>"; echo "<td align='right'>{$Row[3]}</td></tr>"; $Row = mysql_fetch_row($QueryResult); } while ($Row);
Shembull • <?php$conn = mysql_connect("localhost", "mysql_user", "mysql_password");if (!$conn) { echo "Unable to connect to DB: " . mysql_error(); exit;}if (!mysql_select_db("mydbname")) { echo "Unable to select mydbname: " . mysql_error(); exit;}$sql= "SELECT id as userid, fullname, userstatus FROM sometable WHERE userstatus = 1";$result = mysql_query($sql);if (!$result) { echo "Could not successfully run query ($sql) from DB: " . mysql_error(); exit;}if (mysql_num_rows($result) == 0) { echo "No rows found, nothing to print so am exiting"; exit;}// While a row of data exists, put that row in $row as an associative array// Note: If you're expecting just one row, no need to use a loop// Note: If you put extract($row); inside the following loop, you'll then create $userid, $fullname, and $userstatuswhile ($row = mysql_fetch_assoc($result)) { echo $row["userid"]; echo $row["fullname"]; echo $row["userstatus"];}mysql_free_result($result);?>
Funksionimysql_affected_rows() • Me query qe kthejne rezultate (query SELECT), perdorni funksionin mysql_num_rows() per te gjetur numrin e rekordeve qe kthehen nga query • Me query qe modifikojne tabelat por nuk kthejne resultate (query te tipit INSERT, UPDATE, dhe DELETE), perdorni funksionin mysql_affected_rows() per te percaktuar numrin e rreshtave te prekur.
Funksioni mysql_affected_rows() (vazhd.) $SQLstring = "UPDATE company_cars SET mileage=50112.3 WHERE license='AK-1234'"; $QueryResult = @mysql_query($SQLstring, $DBConnect); if ($QueryResult === FALSE) echo "<p>Unable to execute the query.</p>" . "<p>Error code " . mysql_errno($DBConnect) . ": " . mysql_error($DBConnect) . "</p>"; else echo "<p>Successfully updated " . mysql_affected_rows($DBConnect) . " record(s).</p>";
Funksioni mysql_affected_rows() (vazhd.) Figure 8-5 Output of mysql_affected_rows() function for an UPDATE query
Funksioni mysql_info() • Per query qe shtojne ose modifikojne rekorde, ose modifikojne strukturen e nje tabele, perdorni funksionin mysql_info() per te kthyer informacion rreth query-t. • Funksioni mysql_info() kthen numrin e veprimeve per tipe te ndryshme query-sh. • Funksioni mysql_info() kthen informacion rreth query-t te fundit te ekzekutuar ne lidhjen me databazen.
Funksionimysql_info() (vazhd.) • Funksioni mysql_info() kthen informacion rreth query-ve qe te nje nga formateve te meposhtme: • INSERT INTO...SELECT... • INSERT INTO...VALUES (...),(...),(...) • LOAD DATA INFILE ... • ALTER TABLE ... • UPDATE • Per query te tjera, qe nuk pershtaten me keto formate, funksioni mysql_info() kthen nje string bosh. ì
Funksionimysql_info() (vazhd.) $SQLstring = "INSERT INTO company_cars " . " (license, model_year, make, model, mileage) " . " VALUES " . " ('CPQ-894', 2011, 'Honda', 'Insight', 49.2), " . " ('CPQ-895', 2011, 'Honda', 'Insight', 17.9), " . " ('CPQ-896', 2011, 'Honda', 'Insight', 22.6)"; $QueryResult = @mysql_query($SQLstring, $DBConnect); if ($QueryResult === FALSE) echo "<p>Unable to execute the query.</p>" . "<p>Error code " . mysql_errno($DBConnect) . ": " . mysql_error($DBConnect) . "</p>"; else { echo "<p>Successfully added the record.</p>"; echo "<p>" . mysql_info($DBConnect) . "</p>"; }
Funksionimysql_info() (vazhd.) Figure 8-6 Output of mysql_info() function for an INSERT query that adds multiple records
Funksionimysql_info() (vazhd.) • Funksioni mysql_info() gjithashtu kthen informacion per query te tipit LOAD DATA $SQLstring = "LOAD DATA INFILE 'company_cars.txt' INTO TABLE company_cars;"; $QueryResult = @mysql_query($SQLstring, $DBConnect); if ($QueryResult === FALSE) echo "<p>Unable to execute the query.</p>" . "<p>Error code " . mysql_errno($DBConnect) . ": " . mysql_error($DBConnect) . "</p>"; else { echo "<p>Successfully added the record.</p>"; echo "<p>" . mysql_info($DBConnect) . "</p>"; }
Funksionimysql_info() (vazhd.) Figure 8-7 Output of mysql_info() function for a LOAD DATA query
Marrja e rekordeve me nje vektor te indeksuar • Funksioni mysql_fetch_row() kthen fushat ne rreshtin aktual te bashkesise se rezultateve dhe i vendos ato ne nje vektor te indeksuar dhe e leviz shenjuesin e rezultateve ne rreshtin tjeter.
Marrja e rekordeve me nje vektor te indeksuar $SQLstring = "SELECT * FROM company_cars"; $QueryResult = @mysql_query($SQLstring, $DBConnect); echo "<table width='100%' border='1'>\n"; echo "<tr><th>License</th><th>Make</th><th>Model</th> <th>Mileage</th><th>Year</th></tr>\n"; while (($Row = mysql_fetch_row($QueryResult)) !== FALSE) { echo "<tr><td>{$Row[0]}</td>"; echo "<td>{$Row[1]}</td>"; echo "<td>{$Row[2]}</td>"; echo "<td align='right'>{$Row[3]}</td>"; echo "<td>{$Row[4]}</td></tr>\n"; } echo "</table>\n";
Marrja e rekordeve me nje vektor te indeksuar Figure 8-8 Output of the company_cars table in a Web Browser
Marrja e rekordeve me nje vektor te shoqeruar • Funksioni mysql_fetch_assoc() kthen fushat ne rreshtin aktual te bashkesise se rezultateve dhe i vendos ato ne nje vektor te shoqeruar dhe e leviz shenjuesin e rezultateve ne rreshtin tjeter. • Ndryshimi ndermjet mysql_fetch_assoc() dhe mysql_fetch_row() eshte qe ne vend te kthimit te fushave ne nje vektor te indeksuar, funksioni mysql_fetch_assoc() i kthen fushat ne nje vektor te shoqeruar dhe perdor secilin emer fushe si çeles te vektorit.
Mbyllja e Rezultateve te Query-ve • Kur te keni mbaruar punen me rezultatet e query-ve te marra nga funksioni mysql_query(), perdorni funksionin mysql_free_result() per te mbyllur bashkesine e rezultateve • Per te mbyllur bashkesine e rezultateve, kalojini funksionit mysql_free_result() variablin qe permban shenjuesin e rezultatit nga funksioni mysql_query()
Aksesimi i Informacionit te Rezultatit te Query-ve • Funksioni mysql_num_rows() kthen numrin e rreshtave ne rezultatin e nje query • Funksioni mysql_num_fields() kthen numrin e fushave ne rezultatin e nje query • Te dy funksionet pranojne si argument nje variabel te lidhjes me databazen.
AksesimiiInformacionitteRezultatitte Query-ve (vazhd.) $SQLstring = "SELECT * FROM company_cars"; $QueryResult = @mysql_query($SQLstring, $DBConnect); if ($QueryResult === FALSE) echo "<p>Unable to execute the query.</p>" . "<p>Error code " . mysql_errno($DBConnect) . ": " . mysql_error($DBConnect) . "</p>"; else echo "<p>Successfully executed the query.</p>"; $NumRows = mysql_num_rows($QueryResult); $NumFields = mysql_num_fields($QueryResult); if ($NumRows != 0 && $NumFields != 0) echo "<p>Your query returned " . mysql_num_rows($QueryResult) . " rows and " . mysql_num_fields($QueryResult) . " fields.</p>"; else echo "<p>Your query returned no results.</p>"; mysql_close($DBConnect);
AksesimiiInformacionitteRezultatitte Query-ve (vazhd.) Figure 8-10 Output of the number of rows and fields returned from a query
Reference • Per informacione me te detajuara mund te kosultoheni me manualin e MySQL ne adresen: http://www.php.net/manual/en/ref.mysql.php