За последние 24 часа нас посетили 17187 программистов и 1686 роботов. Сейчас ищут 1232 программиста ...

Свой простой QueryBuilder

Тема в разделе "PHP для новичков", создана пользователем Dimon2x, 14 апр 2018.

  1. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.211
    Симпатии:
    186
    Оцените пожалуйста.

    Какие есть недостатки в текущем классе, если делать его не слишком крутым?

    Как быть с биндами, стоит ли биндить вручную? Если в execute передать массив, то по умолчанию, все значения биндяться в
    Код (Text):
    1. PDO::PARAM_STR
    PHP:
    1. <?php
    2.  
    3. class QueryBuilder
    4. {
    5.     public $pdo;
    6.     public $dsn = 'mysql:host=localhost; dbname=crud';
    7.     public $username = 'root';
    8.     public $password = '';
    9.  
    10.     public function __construct() {
    11.         $this->pdo = new PDO($this->dsn, $this->username, $this->password);
    12.     }
    13.  
    14.     function getAllTask()
    15.     {
    16.         $sql = "SELECT * FROM `tasks`";
    17.         $statement = $this->pdo->prepare($sql);
    18.         $result = $statement->execute(); // true or false
    19.         $tasks = $statement->fetchAll(PDO::FETCH_ASSOC);
    20.    
    21.         return $tasks;
    22.     }
    23.  
    24.     function getTask($id)
    25.     {
    26.         $statement = $this->pdo->prepare("SELECT * FROM tasks WHERE id=:id");
    27.         $statement->bindParam(":id", $id);
    28.         $statement->execute();
    29.         $task = $statement->fetch(PDO::FETCH_ASSOC);
    30.    
    31.         return $task;
    32.     }
    33.  
    34.     function addTask($table, $data)
    35.     {
    36.    
    37.         $keys = implode(', ', array_keys($data)); //ключи из массива POST
    38.         $placeholders =  ':' . implode(', :', array_keys($data)); //плейсхолдеры из массива POST
    39.         $sql = "INSERT INTO $table ($keys) VALUES ($placeholders)";
    40.         $statement = $this->pdo->prepare($sql); //значения подставляются автоматически
    41.         $statement->execute($data); //true || false
    42.     }
    43.  
    44.     function editTask($table, $data)
    45.     {
    46.         $sets = '';
    47.    
    48.         foreach($data as $k => $v){
    49.             $sets .= $k . '=:' . $k . ', ';
    50.         }
    51.    
    52.         $sets = rtrim($sets);
    53.         $sets = rtrim($sets, ',');
    54.    
    55.        $sql = "UPDATE $table SET $sets WHERE id = :id";
    56.        $statement = $this->pdo->prepare($sql);
    57.        $statement->execute($data);
    58.    
    59.     }
    60.  
    61.     function deleteTask($id)
    62.     {
    63.         $id = (int)$_GET['id'];
    64.         $sql = 'DELETE FROM tasks WHERE id=:id';
    65.         $statement = $this->pdo->prepare($sql);
    66.         $statement->bindParam(":id", $id);
    67.         $statement->execute();
    68.  
    69.     }
    70. }
    create.php

    PHP:
    1. <!doctype html>
    2. <html lang="en">
    3. <head>
    4.     <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
    5. </head>
    6. <body>
    7. <div class="container">
    8.     <div class="row">
    9.         <div class="col-md-12">
    10.             <h1>Create Task</h1>
    11.             <form action="/store.php" method="post">
    12.                 <div class="form-group">
    13.                     <input type="text" class="form-control" name="title">
    14.                 </div>
    15.  
    16.                 <div class="form-group">
    17.                     <textarea name="content" class="form-control"></textarea>
    18.                 </div>
    19.  
    20.                 <div class="form-group">
    21.                     <button class="btn btn-success" type="submit">Submit</button>
    22.                 </div>
    23.             </form>
    24.         </div>
    25.     </div>
    26. </div>
    27. </body>
    28. </html>
    store.php

    PHP:
    1. <?php
    2.  
    3. require 'QueryBuilder.php';
    4.  
    5. $db = new QueryBuilder();
    6.  
    7.  
    8. $db->addTask('tasks', $_POST);
    9.  
    10. header("Location: /"); exit;
    edit.php

    PHP:
    1. <?php
    2.  
    3.    require 'QueryBuilder.php';
    4.  
    5.    $db = new QueryBuilder();
    6.  
    7.    $task = $db->getTask($_GET['id']);
    8.    ?>
    9.  
    10. <!doctype html>
    11. <html lang="en">
    12. <head>
    13.     <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
    14. </head>
    15. <body>
    16. <div class="container">
    17.     <div class="row">
    18.         <div class="col-md-12">
    19.             <h1>Edit Task</h1>
    20.             <form action="/update.php?id=<?= $task['id'];?>" method="post">
    21.  
    22.                 <div class="form-group">
    23.                     <input type="text" name="title" class="form-control" value="<?= $task['title'];?>">
    24.                 </div>
    25.  
    26.                 <div class="form-group">
    27.                     <textarea name="content" class="form-control"><?= $task['content'];?></textarea>
    28.                 </div>
    29.  
    30.                 <div class="form-group">
    31.                     <button class="btn btn-warning" type="submit">Submit</button>
    32.                 </div>
    33.             </form>
    34.         </div>
    35.     </div>
    36. </div>
    37. </body>
    38. </html>
    update.php

    PHP:
    1. <?php
    2.     require 'QueryBuilder.php';
    3.  
    4.     $db = new QueryBuilder();
    5.  
    6.     $data = $_POST;
    7.     $data['id'] = $_GET['id'];
    8.  
    9.     $db->editTask('tasks', $data);
    10.  
    11.     header("Location: /"); exit;
    12.    
     
    #1 Dimon2x, 14 апр 2018
    Последнее редактирование: 14 апр 2018
  2. gruth

    gruth Активный пользователь

    С нами с:
    13 май 2017
    Сообщения:
    224
    Симпатии:
    18
    А смысл твоего бинда если не по ссылке получаешь + сразу выполняется запрос
     
  3. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Тут не Query Builder. QueryBuilder - это когда можно
    PHP:
    1. $count = (new Query)->from("table")->where(["a" => 25, "b" => 43])->join("table2", "table1.table2_id=table2.id")->count();
    --- Добавлено ---
    Т.е. QueryBuilder строит запросы. А это просто класс, который делает что-то с базой.
     
  4. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.819
    Симпатии:
    1.333
    Адрес:
    Лень