Mine sisusse
Otsi siit
  • Rohkem valikuid...
Otsi tulemusi mis sisaldab...
Otsi tulemusi...

PHP: Andmebaasiga ühendamine (PDO)

Soovitatud postitused

Kahjuks paljud inimesed vaatavad W3Schools õpetusi ja üldiselt vanasi õpetusi mis ei ole enam tänapäevased ja võivad teha lehele rohkem kahju kui kasu. Rääkimata sellest, et see on sulle endale raskem kui kasutada uuemaid viise.

Üks kõige tähtsamaid osasi PHPs on andmebaasiga ühendus, samuti on see üks kõige halvemini õpetatud osa kus paljud ise õppinud inimesed teevad vigu ja kasutavad aegunud meetodeid. Nagu näiteks nii:

 

mysql_connect('localhost', 'username', 'password') or die('Ei saanud ühendust: ' . mysql_error());
mysql_select_db('mingidb') or die('Ei saanud valida andmebaasi.');
$query = "SELECT * from mingitabel";
$result = mysql_query($query) or die('Päring ebaõnnestus: ' . mysql_error());
while ($row = mysql_fetch_object($result)) {    
   echo $row->nimi;
}

 

See on vana, sa ei saa vahetada andmebaasi mootoreid ja see on väga haavatav kui sa ei kontrolli põhjalikult kasutaja sisestusi.

 

Mida selle asemel kasutada? PDO ehk PHP Data Objects. See toetab enamusi andmebaasi tüüpe ja ta pakub võimalust kasutada ettevalmistatud päringuid mis hoiab ära SQL injection rünnakud.

 

Kuidas luua ühendust?

 

Kui sa enne kasutasid:

mysql_connect('localhost', 'username', 'password') or die('Ei saanud ühendust: ' . mysql_error());

Siis nüüd kasutad sa:

$conn = new PDO('mysql:host=localhost;dbname=mingidb', $username, $password);

See algne string ei ole midagi rasket, me ütleme mis andmebaasi me kasutame(mysql:), ja kuidas sinna ühenduda.(host=localhost;dbname=mingidb). Järgnevad kasutajanimi ja parool.

Kui me peaksime kunagi tahtma muuta oma andmebaasi mootorit siis piisab ainult 'mysql' muutmisest millegiks muuks. ('sqlite')

 

Vigade püüdmine

 

try {
   $conn = new PDO('mysql:host=localhost;dbname=mingidb', $username, $password);
   $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e) {
   echo 'ERROR: ' . $e->getMessage();
}

 

Vea tekkimisel ta nüüd teatab sellest. Algselt on see PDO::ERRMODE_SILENT, millega ta ei näita ühtegi viga ühendumisel. Siis piisab vigade näitamiseks sellest:

 

echo $conn->errorCode();
echo $conn->errorInfo();

 

Andmete saamine

 

Esimene viis: Query

 

$name = 'Henry';
try {    
   $conn = new PDO('mysql:host=localhost;dbname=mingidb', $username, $password);
   $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
   $data = $conn->query('SELECT * FROM mingitabel WHERE name = ' . $conn->quote($name));
   foreach($data as $row) {
         print_r($row);
    }
} catch(PDOException $e) {
       echo 'ERROR: ' . $e->getMessage();
}

 

Nagu te näete siis siin peab veel ise kasutajapoolse sisestuse puhastama kasutades PDO::quote mis on võrdväärne mysql_real_escape_string funktsiooniga. Seda viisi on soovitatav kasutada siis kui sa ei lisa päringule kasutaja sisestust.

 

Teine viis: Ettevalmistatud päringud

 

$id = 5;try {    $conn = new PDO('mysql:host=localhost;dbname=mingidb', $username, $password);
   $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
   $stmt = $conn->prepare('SELECT * FROM mingitabel WHERE id = :id');
   $stmt->execute(array('id' => $id));
   while($row = $stmt->fetch()) {
       print_r($row);
   }
} catch(PDOException $e) {
   echo 'ERROR: ' . $e->getMessage();
}

 

Me kasutame PDO::prepare meetodit, et valmistada päring ette. See hoiab ära igasuguse SQL rünnaku kuna me ei lisa andmeid otse päringusse. Andmete lisamiseks kasutame kohahoidjat ":id", on lubatud ka "?" kui siis on hiljem raske saada aru mis asi on kus.

Hiljem päringu täitmisel me lisame juurde selle kohahoidja väärtuse:

$stmt->execute(array('id' => $id));

Lubatud on ka:

$stmt->bindParam(':id', $id, PDO::PARAM_INT);$stmt->execute();

See annab paremat kontrolli andmete üle ja hoiab SQL rünnakud veel kaugemal kontrollides väärtuse tüüpi.

 

Tulemusi on võimalik saada tagasi mitmel viisil:

while($row = $stmt->fetch(PDO::FETCH_OBJ)) {
   print_r($row);
}

 

  • PDO::FETCH_ASSOC tagastab massiivi.
  • PDO::FETCH_BOTH tagastab massiivi nii tulba nimega kui ka indeksiga.
  • PDO::FETCH_OBJ tagastab objekti mille väärtuste nimed ja väärtused on vastavad tulpadele.
  • PDO::FETCH_CLASS tagastab uue klassi

 

Kuidas saada teada kas päring tagastas tulemusi?

 

if ( count($result) ) {
   foreach($result as $row) {
       print_r($row);
   }
} else {
   echo "Ei ole tulemusi.";
}

 

Mitu päringut

 

try {  
 $conn = new PDO('mysql:host=localhost;dbname=mingidb', $username, $password);
 $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

 $stmt = $conn->prepare('INSERT INTO mingitabel VALUES(:name)');
 $stmt->bindParam(':name', $name);

 $name = 'Henry';
 $stmt->execute();

 $name = 'Sander';
 $stmt->execute();
} catch(PDOException $e) {  
 echo $e->getMessage();
}

 

Kui päring on ettevalmistatud võib seda kasutada mitu korda muutes eri väärtusi.

 

CRUD - Create-Update-Delete

 

Create - Insert

try {  $pdo = new PDO('mysql:host=localhost;dbname=mingidb', $username, $password);
 $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);  $stmt = $pdo->prepare('INSERT INTO mingitabel VALUES(:name)');
 $stmt->execute(array(    ':name' => 'Justin Bieber'  ));
 echo $stmt->rowCount(); // tagastab 1
} catch(PDOException $e) {
 echo 'Viga: ' . $e->getMessage();
}

 

Update

 

$id = 5;$name = "Henry";
try {
  $pdo = new PDO('mysql:host=localhost;dbname=mingidb', $username, $password);
 $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
 $stmt = $pdo->prepare('UPDATE mingitabel SET name = :name WHERE id = :id');
 $stmt->execute(array(    ':id'   => $id,    ':name' => $name  ));
 echo $stmt->rowCount(); // 1
} catch(PDOException $e) {
  echo 'Viga: ' . $e->getMessage();
}

 

Delete

 

$id = 5;
try {  
 $pdo = new PDO('mysql:host=localhost;dbname=mingidb', $username, $password);
 $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);  $stmt = $pdo->prepare('DELETE FROM mingitabel WHERE id = :id');
 $stmt->bindParam(':id', $id);
 $stmt->execute();  echo $stmt->rowCount(); // 1
} catch(PDOException $e) {
 echo 'Viga: ' . $e->getMessage();
}

 

Klassid ja Objektid

 

class Kasutaja {
 public $eesnimi;
 public $perekonnanimi;
 public function nimi()
 {
   return $this->eesnimi . ' ' . $this->perekonnanimi;
 }
} try {
 $pdo = new PDO('mysql:host=localhost;dbname=mingidb', $username, $password);
 $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);  $result = $pdo->query('SELECT * FROM mingitabel');

 $result->setFetchMode(PDO::FETCH_CLASS, 'Kasutaja');

 while($user = $result->fetch()) {
   echo $user->nimi();
 }
} catch(PDOException $e) {
 echo 'Viga: ' . $e->getMessage();
}

 

Loodetavasti need kes siiani kasutasid aegunud viise muudavad ennast ja mõistavad kui palju parem on kasutada PDOd ja näevad milliseid uusi võimalusi see pakub.

Vabandused kui millegist ei saa aru, eesti keelest inglise keelde tõlkimine on raske kui oled harjunud koodima inglise keeles ja kasutama väljendeid inglise keeles.

Õpetuse tegin selle õpetuse baasil.

 

Henry,

Vahvel.Net


"What is happening to our young people? They disrespect their elders, they disobey their parents. They ignore the law. They riot in the streets inflamed with wild notions. Their morals are decaying. What is to become of them?"

Plato, 4th Century BC

Jaga seda postitust


Postituse link
Share on other sites

Kommentaari lisamiseks loo konto või logi sisse

Kommenteerimiseks peate olema liige

Loo konto

Liituge meie kommuuni uue kontoga. See on lihtne!

Loo uus konto

Logi sisse

On juba konto? Logi sisse siit.

Logi sisse nüüd

×
×
  • Loo uus...

Oluline informatsioon

Selle veebisaidi paremaks muutmiseks oleme teie seadmesse paigutanud küpsised . Võite kohandada oma küpsiste seadeid , vastasel juhul eeldame, et te olete küpsiste kasutamisega nõus kui jätkate veebisaidil sirvimist.. Palun lugege läbi Kasutustingimused ja Privaatsuspoliitika.