ОБСУЖДЕНИЕ

mysqli против pdo

29 сообщений0 просмотровЗакрыта
#1
Всем привет, вообщем смотрю на форумах все опытные и не особенно опытные программисты любители говорят о работе с PDO, мол PDO сила, PDO лучше и т.д. Углубившись в данный вопрос я понял что преимущество PDO это работа с многими базами и про sql инъекции первого уровня можно забыть. Но в быстродействии по сравнению с тем же mysqli я особо фактов не увидел, местами mysqli даже быстрее. То есть можно не заморачиватся с переходом на PDO если тип базы менять все равно не собираюсь. Просто хотел бы услышать ваше мнение по этому поводу кто более менее работает с PDO.
#2
pdo имеет ещё одно преимущество - именованные плейсхолдеры
Что при объёмных запросах - большой плюс
#3
АрхангеЛ, разница в скорости между pdo и mysqli настолько мизерна, что смысла нету жертвовать удобством работы
#4
Оф сайт php, советует mysqli...
#5
Спасибо сейчас почитаю по ним информацию и плюсы и принцип работы)
#6
PHP
$sql = "INSERT INTO `category` SET `name` = ?, `opis` = ?, `time` = ?";
$stmt = $pdo->prepare($sql);
$stmt->bindParam(1, $name, PDO::PARAM_STR);
$stmt->bindParam(2, $opis, PDO::PARAM_STR);
$stmt->bindParam(3, time(), PDO::PARAM_INT);
$stmt->execute();

Вот наколякал запрос INSERT без всяких классов.
Это же является безопасным добавлением строки) Я так понимаю фильтровать в PDO уже $name и $opis не надо. Так как подготовил запрос и через bindParam прошли, ну то есть с подменой, ну это без своих там условий типа if(mb_strlen($name) > 3 ||mb_strlen($name) < 50) и прочего. Или я не так понял :D
#7
АрхангеЛ, Ну стандартный фильтр то должен быть же... trim, int штмлспесикалс для гетов и постов. Я лично фильтрую , не помешает . а там хз. Если идёт проверка переменных до запроса то 100% нужно , а если напрямую то нафиг фильтровать
#8
Пдо может работать с разными базами. А мускул ток своей это первый + пдо . Работа с api в пдо просто опп мюсли опп+процедурная часть . Надо именовые параметры есть в мюскли их нет а по работе оба хороши
#9
Лучше использовать подготовленные выражения, чем метод PDO::quote()и функцию mysqli_real_escape_string().
#10
Ну как я через prepare?
#11
Ну это тоже получается фильтрация
CODE
$stmt->bindParam(3, time(), PDO::PARAM_INT);

То есть предоставляет данные для записи типа intiger (целые числа), тот же (int), intval, мне кажется их уже фильтровать не надо. Знаю что время фильтровать смысла нет, но все же сам факт.
#12
Чувствую себя первоклассником :D
#13
АрхангеЛ, Да. Есть свои плюсы и минусы . Тоже самое на соединение с бд try {
$dbh = new PDO($dsn, $user, $password);
} catch (PDOException $e) {
die('Подключение не удалось: ' . $e->getMessage());
} лишний вес кода и без него покажи ошибку.
#14
Mr.Max, А все понял, ты до запроса говорил, вопросов нет больше)
#15
Незнаю, я так подключился.
PHP

$pdo = new PDO('mysql:host=localhost;dbname=".$dbname.";charset=utf8', '".$username."', '".$password."');


и никаких проблем с какими то там ошибками нет.
#16
Ты не понял во всех скрипта нет соединение с бд это лишние в коде
#17
Я тоже спрашивал по этому поводу что лучше . Тут мне кажется кому как удобно уже ли или пдо. Однако все накинулись на пдо. Что там , что там есть свои плюсики
#18
Нашёл в интернете интересный класс для работы с PDO, доработал его не много, сокращаем код по минимуму весь основной код внутри класса. Вообщем пользуйтесь кому надо =)

PHP

class Db {
 
  private $db;
  public function __construct($db) {
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $this->db = $db;
  }

  public function insert($table, $fields, $insertParams = null) {
    try {
      $result = null;
      $names = '';
      $vals = '';
      foreach ($fields as $name => $val) {
        if (isset($names[0])) {
          $names .= ', ';
          $vals .= ', ';
        }
        $names .= $name;
        $vals .= ':' . $name;
      }
      $ignore = isset($insertParams['ignore']) && $insertParams['ignore']? 'IGNORE': '';
      $sql = "INSERT $ignore INTO " . $table . ' (' . $names . ') VALUES (' . $vals . ')';
      $rs = $this->db->prepare($sql);
      foreach ($fields as $name => $val) {
        $rs->bindValue(':' . $name, $val);
      }
      if ($rs->execute()) {
        $result = $this->db->lastInsertId(null);
      }
      return $result;
    } catch(Exception $e) {
      $this->report($e);
    }
  }

  // Returns true/false
  public function update($table, $fields, $where, $params = null) {
    try {
      $sql = 'UPDATE ' . $table . ' SET ';
      $first = true;
      foreach (array_keys($fields) as $name) {
        if (!$first) {
          $first = false;
          $sql .= ', ';
        }
        $first = false;
        $sql .= $name . ' = :_' . $name;
      }
      if (!is_array($params)) {
        $params = array();
      }
      $sql .= ' WHERE ' . $where;
      $rs = $this->db->prepare($sql);
      foreach ($fields as $name => $val) {
        $params[':_' . $name] = $val;
      }
      $result = $rs->execute($params);
      return $result;
    } catch(Exception $e) {
      $this->report($e);
    }
  }

  // Returns true/false
  public function delete($table, $where, $params = null) {
    try {
      $sql = 'DELETE FROM ' . $table;
      $sql .= ' WHERE ' . $where;
      $rs = $this->db->prepare($sql);
      foreach ($fields as $name => $val) {
        $params[':_' . $name] = $val;
      }
      $result = $rs->execute($params);
      return $result;
    } catch(Exception $e) {
      $this->report($e);
    }
  }

  public function queryValue($query, $params = null) {
    try {
      $result = null;
      $stmt = $this->db->prepare($query);
      if ($stmt->execute($params)) {
        $result = $stmt->fetchColumn();
        $stmt->closeCursor();
      }
      return $result;
    } catch(Exception $e) {
      $this->report($e);
    }
  }

  public function queryValues($query, $params = null) {
    try {
      $result = null;
      $stmt = $this->db->prepare($query);
      if ($stmt->execute($params)) {
        $result = array();
        while ($row = $stmt->fetch(PDO::FETCH_NUM)) {
          $result[] = $row[0];
        }
      }
      return $result;
    } catch(Exception $e) {
      $this->report($e);
    }
  }

  public function queryRow($query, $params = null, $fetchStyle = PDO::FETCH_ASSOC, $classname = null) {
    $rows = $this->queryRowOrRows(true, $query, $params, $fetchStyle, $classname);
    return $rows;
  }

  public function queryRows($query, $params = null, $fetchStyle = PDO::FETCH_ASSOC, $classname = null) {
    $rows = $this->queryRowOrRows(false, $query, $params, $fetchStyle, $classname);
    return $rows;
  }
 
  private function queryRowOrRows($singleRow, $query, $params = null, $fetchStyle = PDO::FETCH_ASSOC, $classname = null) {
    try {
      $result = null;
      $stmt = $this->db->prepare($query);
      if($classname) {
        $stmt->setFetchMode($fetchStyle, $classname);
      } else {
        $stmt->setFetchMode($fetchStyle);
      }
      if ($stmt->execute($params)) {
        $result = $singleRow? $stmt->fetch(): $stmt->fetchAll();
        $stmt->closeCursor();
      }
      return $result;
    } catch(Exception $e) {
      $this->report($e);
    }
  }
 
  public function quote($str) {
    return $this->db->quote($str);
  }
 
  public function quoteArray($arr) {
    $result = array();
    foreach ($arr as $val) {
        $result[] = $this->db->quote($val);
    }
    return $result;
  }

  public function quoteImplodeArray($arr) {
    return implode(',', $this->quoteArray($arr));
  }

  // returns true/false
  public function sql($query, $params = null) {
    try {
      $result = null;
      $stmt = $this->db->prepare($query);
      return $stmt->execute($params);
    } catch(Exception $e) {
      $this->report($e);
    }
  }
 
  private function report($e) {
    throw $e;
  }

}

//Данные базы
$dsn = 'mysql:host=localhost;dbname=dn_name;charset=utf8';
$user = 'user';
$password = 'password';

//Подключение к базе
$pdo = new PDO($dsn, $user, $password);
$db = new Db($pdo);




//////////////////////////
// Использование       ///
//////////////////////////

// Добавление записи (INSERT) и получение значения поля AUTO_INCREMENT
$db->insert('test', array('name' => 'NewUserName', 'type' => '1', 'time' => time()));

// Изменение записи (UPDATE)
$db->update('test', array('name' => 'UpdatedName'), 'id=:id', array(':id' => $id));

//Удаление записи
$db->delete('test', 'id=:id', array(':id' => $id));

// Выборка одного значения
$count = $db->queryValue('SELECT COUNT(*) FROM `test`');

// Выборка набора записей
$users = $db->queryRows('SELECT * FROM `users` WHERE name LIKE ?', array('%username%'));

//Вывод записей
foreach($db->queryRows("SELECT * FROM `test`") AS $user) {
echo $user['user'] . '</br>';}


#19
Короче начал переписывать скрипт без всяких классов так генерация упала на 0.010 я короче думаю ну и шняга это pdo, ну нашел этот класс короче добавил функции ибо там delete и replace не было и о чудо, генерация не то чтобы не упала а выполнение приросло на +0.002, короче я поверил в него и переписываю весь скрипт теперь. В принципе разница даже в плюс и код короче)
#20
АрхангеЛ, от прослойки не могла уменьшится генерация, вообще никак
Значит Вы не оптимально использовали чистый PDO
Страница 1 из 2 · Всего записей: 29