03. PHP и MySQL

03. PHP и MySQL

Релацонна база от данни

SQL

Език за работа с данни.

Той позволява:

Преди всичко UTF-8

SET NAMES utf8;

Извличане на данни(Select)

SELECT * FROM MAJORS
SELECT NAME, ACADEMIC_DEGREE FROM MAJORS
SELECT * FROM MAJORS WHERE NAME = 'Software Engineering'
SELECT * FROM MAJORS WHERE START_YEAR = 2011

Вмъкване на данни(Insert)

INSERT INTO MAJORS (NAME, ACADEMIC_DEGREE) VALUES ('Software Eginnering', 'bachelor')

JOIN заявки

SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDate
FROM Orders
INNER JOIN Customers
ON Orders.CustomerID=Customers.CustomerID;

Типове SQL JOIN:

MySQL

[от Уикипедия, свободната енциклопедия] MySQL SQL система за управление на бази данни (СУБД) с повече от шест милиона инсталации.

Изпълняване на SQL заявки през phpMyAdmin

PDO

В PHP има разширения(Extensions), които надграждат основната функционалност на езика. PHP Data Objects (PDO) е едно такова разширение.

Дефинира лек, консистентен интерфейс за работа с различни СУБД.

Предоставя абстрактен слой за работа с данни.

СУБД която използвате е без значение, защото интерфейса е еднакъв - MS SQL Server, DB2, MySQL, Oracle, PostgreSQL, SQLite....

PDO Свързване към база

<?php
$user = 'username';
$pass = 'password';
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
// use the connection here
// and now we're done; close it
$dbh = null;
?>

PDO Извличане на данни

<?php
$host   = "localhost";
$db     = "my_db";
$user   = "root";
$pass   = ""

$conn = new PDO("mysql:host=$host;dbname=$db",$user,$pass);
$sql     = "SELECT * FROM MAJORS";
$query   = $conn->query($sql) or die("failed!");
while ($row = $query->fetch(PDO::FETCH_ASSOC)) {
  echo $row['NAME'];
}

PDO Извличане на данни

<?php
// ...
echo '<ul>';
while($row = $q->fetch(PDO::FETCH_ASSOC)){
  echo '<li>'.$row['NAME'].'</li>';
}
echo '</ul>';

Prepared statements

Заявка, записан в базата от данни и която може да се изпълнява многократно с подаване на различни данни.

Prepared statements

Етапи:

Защо да ги ползваме?

Prepared statements

<?php
  $stmt = $conn->prepare("
      INSERT INTO electives (title, academic_degree)
      VALUES (:title, :academic_degree)");
  $stmt->bindParam(':title', $title);
  $stmt->bindParam(':academic_degree', $academic_degree);

  $title = 'Programming with Go';
  $academic_degree = 'bachelor';
  $stmt->execute();

  $title = 'Mining Data from Text';
  $academic_degree = 'master';
  $stmt->execute();
?>

Prepared statements

<?php
  echo '<ul>';
  $stmt = $conn->prepare("SELECT * FROM electives where academic_degree = ?");
  if ($stmt->execute(array('bachelor'))) {
    while ($row = $stmt->fetch()) {
      echo '<li>'.$row["NAME"].'</li>';
    }
  }
  echo '</ul>';
?>

Транзакции

<?php
  $conn->beginTransaction();

  $sql = 'INSERT INTO electives (title, academic_degree) VALUES (?, ?)';
  $sth = $conn->prepare($sql);

  foreach ($electives as $elective) {
      $sth->execute(array(
          $elective->title,
          $elective->academic_degree,
      ));
  }
  $dbh->commit();
?>

Транзакции

<?php
   $conn->beginTransaction();

   $sth = $conn->exec("DROP TABLE electives");

   $conn->rollBack();
 ?>

Задача 1

Имате база от данни със следната таблица и данни:

CREATE TABLE electives
(
  id INT AUTO_INCREMENT PRIMARY KEY,
  title VARCHAR(128),
  description VARCHAR(1024),
  lecturer VARCHAR(128)
);

INSERT INTO electives (title, description, lecturer)
VALUES ("Programming with Go", "Let's learn Go", "Nikolay Batchiyski");

INSERT INTO electives (title, description, lecturer)
VALUES ("AKDU", "Let's Graduate", "Svetlin Ivanov");

INSERT INTO electives (title, description, lecturer)
VALUES ("Web technologies", "Let's learn the web", "Milen Petrov");

Задача 1

Имплементирайте php страница с форма и валидация за добавяне на избираема дисциплина.

Добавете колона created_at на таблицата electives.

Трябва по подразбиране да сочи момента на добавяне на реда.

Задача 2

Добавете функционалност за редактиране на избираема дисциплина.

Например: HTTP PUT на /electives.php/1 със съответните параметри трябва да промени избираемата с id 1.