PHP PDO по сравнению с нормальным mysql_connect

@Domster: это работает, но Вы могли бы хотеть осуществить немного безопасности путем проверки, соответствует ли хеш сертификата тому, что Вы ожидаете. Таким образом, расширенная версия немного походит на это (на основе некоторого живого кода, который мы используем):

static readonly byte[] apiCertHash = { 0xZZ, 0xYY, ....};

/// <summary>
/// Somewhere in your application's startup/init sequence...
/// </summary>
void InitPhase()
{
    // Override automatic validation of SSL server certificates.
    ServicePointManager.ServerCertificateValidationCallback =
           ValidateServerCertficate;
}

/// <summary>
/// Validates the SSL server certificate.
/// </summary>
/// <param name="sender">An object that contains state information for this
/// validation.</param>
/// <param name="cert">The certificate used to authenticate the remote party.</param>
/// <param name="chain">The chain of certificate authorities associated with the
/// remote certificate.</param>
/// <param name="sslPolicyErrors">One or more errors associated with the remote
/// certificate.</param>
/// <returns>Returns a boolean value that determines whether the specified
/// certificate is accepted for authentication; true to accept or false to
/// reject.</returns>
private static bool ValidateServerCertficate(
        object sender,
        X509Certificate cert,
        X509Chain chain,
        SslPolicyErrors sslPolicyErrors)
{
    if (sslPolicyErrors == SslPolicyErrors.None)
    {
        // Good certificate.
        return true;
    }

    log.DebugFormat("SSL certificate error: {0}", sslPolicyErrors);

    bool certMatch = false; // Assume failure
    byte[] certHash = cert.GetCertHash();
    if (certHash.Length == apiCertHash.Length)
    {
        certMatch = true; // Now assume success.
        for (int idx = 0; idx < certHash.Length; idx++)
        {
            if (certHash[idx] != apiCertHash[idx])
            {
                certMatch = false; // No match
                break;
            }
        }
    }

    // Return true => allow unauthenticated server,
    //        false => disallow unauthenticated server.
    return certMatch;
}
46
задан Jainendra 13 September 2012 в 09:17
поделиться

6 ответов

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

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

40
ответ дан 26 November 2019 в 20:20
поделиться

Некоторые быстрые тайминги показывают, что 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

В любом случае разница в скорости будет незначительной ; установление сетевого соединения, вероятно, займет НАМНОГО больше времени, чем любые накладные расходы, понесенные PDO, особенно если сервер mysql находится на другом хосте.

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

особенно если сервер mysql находится на другом хосте.

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

особенно если сервер mysql находится на другом хосте.

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

17
ответ дан 26 November 2019 в 20:20
поделиться

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

В PDO есть две / три отличных вещи по сравнению с mysql_ * :

  • Более или менее постоянный интерфейс между базами данных; лучше, чем использование mysql _ * , pg _ * , oci _ * , ...
  • Object-Oriented API ( mysqli _ * имеет OO-API, но не mysql _ * )
  • Поддержка новых функций MySQL> = 4.1 (то же самое, что mysqli _ * , но не mysql _ * , снова)

Кстати: я обычно использую PDO - либо "вручную"

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

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

4
ответ дан 26 November 2019 в 20:20
поделиться

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

2
ответ дан 26 November 2019 в 20:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: