PHP PDO против обычного mysql_connect

Должен ли я использовать php PDO или обычное mysql_connect для выполнения запросов к базе данных в PHP?

Какой из них быстрее?

Одним из больших преимуществ PDO является то, что интерфейс согласован между несколькими базами данных. Для подготовленных операторов есть и некоторые интересные функции, из-за которых вы избегаете экранирования всех строк запроса. Переносимость PDO больше, чем mysql_connect.

Итак, следует ли использовать PDO по этим причинам или придерживаться традиционного mysql_connect?

Ответ 1

PDO немного медленнее, чем mysql_ * Но он имеет большую мобильность. PDO обеспечивает единый интерфейс для нескольких баз данных. Это означает, что вы можете использовать несколько БД без использования mysql_query для mysql, mssql_query для MS sql и т.д. Просто используйте что-то вроде $db- > query ( "INSERT INTO..." ) всегда. Независимо от того, какой драйвер DB вы используете.

Таким образом, для более крупного или портативного PDO проекта предпочтительнее. Даже каркас zend использует PDO.

Ответ 2

Некоторые быстрые тайминги показывают, что PDO немного быстрее при подключении.

$start = microtime(true);
for($i=0; $i<10000; ++$i) {

    try {
        $db = new PDO($dsn, $user, $password);
    } catch (PDOException $e) {
        echo 'Connection failed: ' . $e->getMessage()."\n";
    }
    $db = null;
}

$pdotime = microtime(true) - $start;
echo "PDO time: ".$pdotime."\n";

$start = microtime(true);
for($i=0; $i<10000; ++$i) {
    $db = mysql_connect($host, $user, $password);
    if(!$db) {
        echo "Connection failed\n";
    }
    if(!mysql_select_db($schema, $db)) {
        echo "Error: ".mysql_error()."\n";
    }
    mysql_close($db);
}

$rawtime = microtime(true) - $start;
echo "Raw time: ".$rawtime."\n";

Дает результаты, такие как

PDO time: 0.77983117103577
Raw time: 0.8918719291687

PDO time: 0.7866849899292
Raw time: 0.8954758644104

PDO time: 0.77420806884766
Raw time: 0.90708494186401

PDO time: 0.77484893798828
Raw time: 0.90069103240967

В любом случае разность скоростей будет незначительной; установление сетевого соединения, скорее всего, займет LOT дольше, чем любые накладные расходы, вызванные PDO, особенно если сервер mysql находится на другом хосте.

Вы упомянули все причины использования PDO самостоятельно. Действительно, никогда не используйте функции mysql_ * напрямую, используйте PDO или используйте some прочее библиотека.

Ответ 3

Я не думаю, что скорость - это то, что люди ищут, когда используют PDO - я не знаю, есть ли разница, и мне очень интересно: до тех пор, пока я делаю пару запросов к базе данных при создании страницы, пара миллисекунд на стороне PHP ничего не изменит.

Есть две/три замечательные вещи с PDO, по сравнению с mysql_*:

  • Более или менее постоянный интерфейс через базы данных; лучше, чем использовать mysql_*, pg_*, oci_*,...
  • Объектно-ориентированный API (mysqli_* имеет OO-API, но не mysql_*)
  • Поддержка новых функций MySQL >= 4.1 (так же, как mysqli_*, но не mysql_*, снова)

BTW: Обычно я использую PDO - либо "вручную", либо как он интегрирован/используется Zend Framework и/или Doctrine.


В качестве побочного элемента: даже если вы не собираетесь использовать PDO, обратите внимание, что рекомендуется использовать mysqli вместо mysql.

См. эту страницу руководства PHP об этом.

Ответ 4

  • В PDO вы можете использовать привязанные параметры, что предотвратит большинство атак на SQL-инъекцию.
  • Вы можете увеличить скорость с помощью подготовленных инструкций PDO.
  • стандартный интерфейс для всех бэкэндов db
  • Существует множество полезных методов (например, семейство fetch *)

Ответ 5

Я провел некоторое тестирование производительности, чтобы сравнить функции Mysqli с функциями PDO, используя как подготовленные операторы, так и регулярные прямые запросы (проверенные с помощью операторов select в таблицах Mysqlnd и MyISAM).

Я обнаружил, что запросы PDO немного медленнее, чем Mysqli, но только незначительно. Это имеет смысл, поскольку PDO используется для этой цели в основном просто оболочка, которая вызывает функции Mysqli. Преимущество использования PDO заключается в том, что он немного легче переносится в другую базу данных, поскольку имена функций не являются специфическими для MySQL.

Реальная разница в производительности заключается в том, используете ли вы подготовленные запросы. Существует большое и значительное снижение производительности при использовании подготовленных запросов. Другие люди, которые их протестировали, нашли те же результаты.

Единственные запрошенные временем запросы быстрее, если вы готовите запрос один раз, а затем отправляете его тысячи раз с разными значениями данных. В противном случае всегда быстрее использовать mysqli:: query() или PDO:: query(). Но важно помнить, что эти функции не избегают значений данных для вас, поэтому вам нужно не забывать использовать mysqli:: real_ escape_ string() или PDO:: quote() для переменных данных.

Ответ 6

Я бы рекомендовал использовать PDO, если нет конкретной причины, по которой вы не можете. Если между ними нет никакой разницы, и у вас нет причин не использовать PDO, я считаю, что было бы лучше заняться использованием абстракции DB в ваших приложениях, чем с mysql_ * просто потому, что оно есть. Я бы сказал, что лучше всего выиграть.

Ответ 7

В обоих случаях вы вызываете тот же mySQL-сервер с одного и того же Php-сервера... поэтому вы не можете заметить большую разницу.

Если вам нужна хорошая производительность, подумайте о кеше (memcache или простой файл Php...) и создайте хорошую структуру базы данных (INDEX...)

Ответ 8

  • PDO лучше, чем SQl
  • PDO и его выражение о готовности обеспечивают лучший защищенный код для SQL-инъекций
  • PDO является объектно-ориентированным;)
  • PDO совместим с некоторыми базами данных, как описано ранее
  • MySQLl_ * Устарел и скоро будет удален
  • PDO обеспечивает большую функциональность с меньшим количеством кодов Пример:

    PDO

    • Подключить
    • Установите флажок "<" И " > " И "#" (эта проверка для глобальных целей)
    • Подготовить
    • Выполнить
    • Закрыть

MySQL _ *

  • Подключить
  • Добавить обратную косую черту
  • Xsafe
  • Установите флажок "<" И " > " И "#" (эта проверка для глобальных целей)
  • Запрос
  • Закрыть

обе одинаковые функциональные возможности, но вы сравниваете коды PDO более человечно читается:) И так, что ты думаешь?

Ответ 9

Если производительность не является "реальной проблемой" для вас, вы должны использовать PDO. Производительность отличается небольшими полями, а PDO имеет очень хороший и переносимый интерфейс между базами данных, который может сэкономить вам некоторые головные боли, если вам нужно использовать несколько драйверов баз данных.

Ответ 10

Функция mysql_connect устарела с PHP 5.5.0 и, как и большинство устаревших функций, будет удалена. Поэтому предпочитайте использовать PDO_MySQL (или другую альтернативу MySQLi) над mysql_connect.

Источник: http://php.net/manual/en/function.mysql-connect.php

Ответ 11

Некоторые преимущества PDO:

  • Доступ к нескольким базам данных.
  • Предоставлено много драйверов базы данных для подключения к другой базе данных.
  • При переключении из одной базы данных в другую базу данных вам не нужно писать весь код для подключения к новой базе данных, просто измените строку подключения и некоторый запрос, который требуется для новой базы данных.
  • Он предоставляет инструкцию подготовки, которая является своего рода шаблоном запроса, который скомпилирован только один раз и может выполняться столько раз, сколько вы хотите, просто изменив атрибуты, которые называются place-holder.
  • Простая и эффективная общая операция: Insert, update... и т.д.

Ответ 12

Код подключения базы данных PDO:

<?php
$dbhost = 'localhost';
$dbname = 'clsrepair';
$dbuser = 'root';
$dbpass = '';

try {
    $db = new PDO("mysql:host={$dbhost};dbname={$dbname}",$dbuser,$dbpass);
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}

catch(PDOException $e) {
    echo "Connection error: ".$e->getMessage();
}
?>

Нормальный код подключения базы данных MySQL:

<?php 
mysql_connect("localhost","root", "");
mysql_select_db ("clsrepair");
?>

или

 <?php
$dbHost = 'localhost'; // usually localhost
$dbUsername = 'root';
$dbPassword = '';
$dbDatabase = 'clsrepair';
$db = mysql_connect($dbHost, $dbUsername, $dbPassword) or die ("Unable to connect to Database Server.");
mysql_select_db ($dbDatabase, $db) or die ("Could not select database.");
?>

Код подключения к базе данных MySQL легко, но PDO имеет много преимуществ.