-1

コードをmysql_*Toから移行したばかりPDOで、パフォーマンスが大幅に向上したことを楽しみにしています。私はhttp://wooptoo.com/blog/pdo-vs-mysqli-performance-comparison/を読んでいて、PDOより効率的だと思いました。

しかし、何か間違ったことをしている可能性があり、コードが予想よりもはるかに遅くなる可能性があります。

私はsingletonクラスを作成しました

class db
      {

      static $dbinstance=null;  

      public static function getinstance()
      {

      if (!self::$dbinstance) 
         {
          try
            {
            self::$dbinstance=new PDO("mysql:host=127.0.0.1;dbname=inventory",'user','pass');
            self::$dbinstance->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

            }
          catch( PDOException $e)
           {
            die( '<b>Errors:</b> '.$e->getMessage());
           }
       }
          return self::$dbinstance;
     }

挿入に使用しているコードの下(簡単にするためにコードを短くしています)

    if(isset($_POST['Build']))
{
    $InCart=db::getinstance()->prepare("SELECT `Vendor`, `ItemType`, `ItemCode`, `ItemDesc`, `SerialNo`, `Asset_Code`, `ItmUnit`, `Qty`,`SiteId`, `id`, `Ownership`, `wh`,  `Phase`, `Category`, `Issue_Vendor`, `AssetName`, `po`, `FaultInfo`, `willreturn`, `Person`, `remarks`, `grnno`,stockid FROM temptable WHERE id=?");

    $insertinSIR=db::getinstance()->prepare("INSERT INTO Sir(SirNo,SiteId,Vendor,Type,ItemDesc,ItemCode,SerialNo,Unit,AssetCode,Qty,Region,Phase,Category,Issue_vendor,AssetName,ownership,Dated,PersonName,Remarks,po,invuser,grnno,WarehouseType,WarehouseLocation) values( ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,NOW(),?,?,?,?,?,?,?)");

  foreach ($_POST['id'] as $id)
      {
     $InCart->execute(array($id)); 
     $arr=$InCart->fetch(PDO::FETCH_NUM);

        $insertinSIR->execute(array($a,$arr[8],$arr[0],$arr[1],$arr[3],$arr[2],$arr[4],$arr[6],$arr[5],$arr[7],$user,$arr[12],$arr[13],$vendor,$arr[15],$arr[10],$person,$remarks,$arr[16],$invuser,$arr[21],$whtype,$whlocation));

      } 

誰かがパフォーマンスヒッターを指摘していただければ幸いです。
編集

ステートメントを準備してループで実行するのは正しい方法ですか?

4

1 に答える 1

1

提案:

INSERT INTO Sir (SirNo, ...)
     SELECT Vendor, ...
       FROM temptable
      WHERE id IN (?, ?, ...)

最初からすべてのデータを PHP 経由でパイプする必要はありません。http://dev.mysql.com/doc/refman/5.0/en/insert-select.htmlを参照してください。

于 2013-06-28T06:01:39.293 に答える