61. SELECT - PDO запити
 Два види запитів 1) прямий - query() та 2) підготовлений prepare() та execute()
<?php 
/* підключення до БД - можна в окремому файлі require('connectdb.php');*/
    $host = 'localhost';
    $db   = 'myphpschool';
    $user = 'admin';
    $pass = '1111';
    $charset = 'utf8';

    $dsn = "mysql:host=$host;dbname=$db;charset=$charset";
   
    $pdo = new PDO($dsn, $user, $pass);  
/* ============*/

$sql ="SELECT * FROM weapons";
$stmt = $pdo->prepare($sql);
   $stmt->execute();
  echo "<table><tr><th>Id</th><th>Тип</th><th>Фото</th></tr>";   
   while ($row = $stmt->fetch(PDO::FETCH_LAZY))
    { // три види запису виведення даних
     echo "<tr><td>".$row[0]."</td><td>".$row->type."</td><td>".$row["photo"]."</td></tr>";  
    }
   echo "</table>";
   $pdo=null; 
?>
В БД така таблиця
IdТипФото
1ACR
2M4

query()

Якщо в запит не передаються змінні, то можна скористатись функцією query()

$stmt = $pdo->query('SELECT type FROM weapons');
while ($row = $stmt->fetch())
{
    echo $row['name'] . "\n";
}
ACR M4

prepare() та execute()

Якщо в запит передається хоч одна змінна, то він обов'язково повинен виконуватись тільки через підготовленні вирази. Ці вирази - звичайний SQL запит, у якому ставиться спеціальній маркер - плейсхолдер PDO підтримує позиційні плейсхолдери - "?", для яких важливий порядок змінних, що передаються та іменовані плейсхолдери - ":name" для яких порядок не важливий.

? - позиційні плейсхолдери

Приклад (передаємо одну змінну - ціле число PDO::PARAM_INT )
 $id = 1;
  $stmt = $pdo->prepare('SELECT type,photo FROM weapons WHERE id = ?');
  $stmt->bindValue(1, $id, PDO::PARAM_INT);
  $stmt->execute();
  $row = $stmt->fetch();
  echo $row ['type']."\n".$row ['photo'];
ACR

Приклад (передаємо дві змінні - рядкову PDO::PARAM_STR та числову PDO::PARAM_INT )
Важливий порядок змінних в запиті, перший знак "?" - перша змінна і т.д.

  $id=2;  
  $type = "M4";
  $stmt = $pdo->prepare('SELECT photo FROM weapons WHERE type = ? and id = ?');
  $stmt->bindValue(1, $type, PDO::PARAM_STR);
  $stmt->bindValue(2, $id, PDO::PARAM_INT); 
  $stmt->execute();
  $row = $stmt->fetch();
  echo  $type."\n". $row ['photo'];
M4

:name - іменовані плейсхолдери

Приклад (передаємо одну змінну)
  $id = 2;
  $stmt = $pdo->prepare('SELECT type FROM weapons WHERE id = :id');
  $stmt->execute(array('id' => $id));
  $row = $stmt->fetch();
  echo $row ['type'];
M4

Приклад (передаємо кілька змінних, порядок не важливий)
 $type = "M4";    
  $id = 2;
  $stmt = $pdo->prepare('SELECT photo FROM weapons WHERE type= :type and id = :id');
  $stmt->execute(array('id' => $id,'type' => $type));
  $row = $stmt->fetch();
  echo $row ['photo'];

далі ✏
Ігор Ка