Тайм-аут PHP при записи в MySQL - PullRequest
1 голос
/ 25 августа 2011

Я получаю тайм-аут при выполнении кода ниже. Вот точная ошибка:

Warning: PDO::__construct() [pdo.--construct]: [2002] A connection attempt failed because the connected party did not (trying to connect via tcp://localhost:3306) in D:\xampp\htdocs\logansarchive\admin\articlework.php on line 16 Fatal error: Maximum execution time of 60 seconds exceeded in D:\xampp\htdocs\logansarchive\admin\articlework.php on line 0

Мне кажется, что стоит отметить, что между временем, когда этот DID работал, и когда он не работал, на моем веб-сервере или в этом коде ничего не изменилось.

Вот код, который работает в базе данных:

<?php
    $action = $_REQUEST["action"];
    $target = $_REQUEST["target"];
    $srctitle = $_POST["srctitle"];
    $title = $_POST["article_title"];
    $cat = $_POST["article_cat"];
    $content = $_POST["article_content"];

    // Set database server access variables:
    $host = "localhost";
    $user = "root";
    $pass = "root";
    $db = "logansarchive";

    // Open connection
    $dbh = new PDO('mysql:host='.$host.';dbname='.$db, $user, $pass);   

    $date = date('Y-m-d H:i:s');
    switch ($action) {
        case "Edit":
            $query = $dbh->prepare("UPDATE Articles ".
                "SET ArticleTitle = :title, Category = :cat, ArticleDate = :date, ArticleContent = :content ".
                "WHERE ArticleTitle = :srctitle");
            $query->bindParam(':title', $title);
            $query->bindParam(':cat', $cat);
            $query->bindParam(':date', $date);
            $query->bindParam(':content', $content);
            $query->bindParam(':srctitle', $srctitle);
            $query->execute();
        break;
        case "New":
            $query = $dbh->prepare("INSERT INTO Articles(Category, ArticleDate, ArticleTitle, ArticleContent) ".
                "VALUES(:cat, :date, :title, :content)");
            $query->bindParam(':cat', $cat);
            $query->bindParam(':date', $date);
            $query->bindParam(':title', $title);
            $query->bindParam(':content', $content);
            $query->execute();
        break;
        case "Delete":
            if ($target != "") {
                $query = $dbh->prepare("UPDATE Articles ".
                    "SET DeletedYN = :del ".
                    "WHERE ArticleTitle = :title");
                $query->bindValue(':del', "Yes");
                $query->bindParam(':title', $target);
                $query->execute();
            }
            else {
                header("Location: index.php?result=failed");
            }
        break;
    }

    header("Location: index.php?result=success");
?>

РЕДАКТИРОВАТЬ 1: Я только что понял, что может сузить причину проблемы. Код выше - единственная часть сайта, где я использую PDO. Все остальное использует mysql_ * и все работает нормально. Это приводит меня к мысли, что проблема заключается в PDO.

Ответы [ 2 ]

1 голос
/ 25 августа 2011

Проверьте эту ошибку: Функции MySQL нельзя использовать с 5.3.x в Vista при использовании "localhost" . Симптом таймаута соответствует этой ошибке.

Основная причина, по-видимому, заключается в том, что сервер MySQL не поддерживает IPv6 до 5.5 , но файл по умолчанию hosts в современной Windows сопоставляет localhost с IPv6-адресом ::1.

Так что попробуйте установить $host="127.0.0.1";

Я не знаю, почему он работает с ext / mysql, но не работает с PDO. Это загадка. Говорите об этом до Windows, так или иначе, не имея никакого смысла. ; -)

Также см. PHP 5.3 и проблема с подключением MySQL для более подробного объяснения проблемы IPv6.

0 голосов
/ 29 января 2013

У меня была похожая проблема. Я наконец решил это.

Дело в том, что у меня был "новый PDO ('mysql: host = 127.0.0.1; dbname = mydb', 'myuser', 'my pass');" в цикл for / while.

Когда я делаю 3 или 4 цикла, все в порядке. Когда у меня 5000 итераций, мой сервер MySQL, кажется, блокирует меня, и затем я получаю сообщение об ошибке «Предупреждение: PDO :: __ construct () [pdo .-- construct]: [2002]« Ошибка попытки подключения ... »».

Я знаю, что это было не слишком умно, чтобы поместить "новый PDO (...") в цикл. Надеюсь, это поможет вам, ребята.

Антуан

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...