写入mysql时PHP超时

时间:2011-08-25 10:59:10

标签: php mysql pdo

执行下面的代码时,我不断超时。这是确切的错误:

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工作时和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 个答案:

答案 0 :(得分:1)

查看此错误:MySQL functions cannot be used with 5.3.x on Vista when using "localhost"。超时症状与该错误一致。

根本原因似乎是MySQL服务器doesn't support IPv6 until 5.5,但现代Windows上的默认hosts文件将localhost映射到IPv6地址::1

请尝试设置$host="127.0.0.1";

我不知道为什么它使用ext / mysql但是使用PDO失败了。这是一个谜。无论如何,将它归结为Windows一般都没有意义。 ; - )

另请参阅PHP 5.3 and MySQL connectivity problem以获取有关IPv6问题的更多说明。

答案 1 :(得分:0)

我有类似的问题。我最终解决了它。

问题是,我有一个“新的PDO('mysql:host = 127.0.0.1; dbname = mydb','myuser','my pass');”进入for / while循环。

当我做3或4次循环时,它没问题。当我有5000次迭代时,我的mySQL服务器似乎阻止了我,然后我得到“警告:PDO :: __ construct()[pdo .-- construct]:[2002]'连接尝试失败...”错误消息。

我知道将“新PDO(...”)放入循环并不太聪明。希望这会对你们有所帮助。

安托