2011-08-25 56 views
1

當我執行下面的代碼時,我總是收到一個超時。這裏是確切的錯誤:寫入mysql時PHP超時

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

我覺得這是值得一提的是,當這個沒有工作,當它沒有,什麼也沒有我的Web服務器上或在此代碼改變的時間之間。

下面是做數據庫的工作代碼:

<?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。

+1

看來,PDO在連接死亡數據庫是否被重載,是否被其他一些查詢佔用了所有的連接槽?是否重複檢查了數據庫的連接參數? – Sheepy

+0

通過控制檯登錄到mysql服務器併發出'show processlist;'命令。你看到一些長壽命的連接,可能你的數據庫被超負荷了。如果有一些'鎖定'連接,yuor數據庫處於死鎖狀態,請嘗試從最舊的連接開始,終止鎖定連接 – J0HN

+0

我不這麼認爲你的代碼導致超時,首先你需要檢查爲什麼連接失敗? –

回答

1

看看這個bug: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";

我不知道爲什麼它的工作與分機/ MySQL,但與PDO失敗。這是一個謎。無論如何,將它粉碎到Windows一般毫無意義。 ;-)

有關IPv6問題的更多解釋,另請參閱PHP 5.3 and MySQL connectivity problem

+0

哈哈感謝那條條例草案,有人在網上指出我的意思,我不能在8小時內回答我自己的問題。儘管如此,+1和你的答案:) – Ortund

+0

謝謝,我很樂意提供幫助! –

0

我有類似的問題。我最終解決了它。

事情是,我有一個「新的PDO('mysql:host = 127.0.0.1; dbname = mydb','myuser','我的通行證');」進入for/while循環。

當我做3或4循環,它是好的。當我有5000次迭代時,我的mySQL服務器似乎阻止了我,然後我得到了「Warning:PDO :: __ construct()[pdo .-- construct]:[2002]'連接嘗試失敗...'錯誤消息。

我知道這是不是太聰明,把一個「新PDO(...」進入一個循環。希望這會幫助你們。

安東尼