2017-04-03 15 views
0

Iamはこのようにして動作しています。APIを挿入すると重複キーでデータベースが更新されます

//リポジトリ

public function InsertListaccts($Table = '<listaccts>', $Data) 
    { 
     $this->getEntityManager()->getConnection()->insert($Table, $Data); 
     } 

//コントローラ

public function ApiAction() 
     { 
      $Cpanel = new \Gufy\CpanelPhp\Cpanel; 
      $Cpanel->setAuthType('hash'); 
      $Cpanel->setHost($this->container->getParameter('api_host')); 
      $Cpanel->setAuthorization($this->container->getParameter('api_user'), $this->container->getParameter('api_hash')); 
      $Cpanel->setTimeout(50); 

      $Arguments = array(); 
      $QueryCpanel= $Cpanel->__call('listaccts', $Arguments); 
      $em = $this->getDoctrine()->getEntityManager(); 
      $json = json_decode($QueryCpanel, true); 

      foreach ($json ['acct'] as $List) { 
      $Data['Domain'] =$List ['domain']; 
      $Data['IP'] = $List ['ip']; 
      $Data['UserName'] = $List ['user']; 
      $Data['Email'] = $List ['email']; 
      $Data['StartDate'] = $List ['startdate']; 
      $Data['DiskPartition'] = $List ['partition']; 
      $Data['Quota'] = $List ['disklimit']; 
      $Data['DiskSpaceUsed'] = $List ['diskused']; 
      $Data['Package'] = $List ['plan']; 
      $Data['Theme'] = $List ['theme']; 
      $Data['Owner'] = $List ['owner']; 
      $Data['UnixStartDate'] = $List ['unix_startdate']; 

       $em->getRepository('AppBundle:Listaccts') 
        ->InsertListaccts('listaccts', $Data); 
     } 

IamのデータベースにAPIからデータを挿入しようとしているが、問題がevrytimeである私は、クエリ実行する場合には、インサートすべてのAPI値を保つI重複する値を取得します。 現時点で私はUserNameの一意の値を持っています。同じUserNameがすでにデータベースに存在する場合、それを更新したいと思います。 このクエリは可能ですか? $ this-> getEntityManager() - > getConnection() - > insert($ Table、$ Data);

私はこのようなことをしようとしていましたが、インサートパートが動作しています。このクエリを機能させるにはどうすればよいですか?これを行うにはより良い方法がありますか?

public function InsertListaccts($Table = '<listaccts>', $Data) 
    { 
     // $this->getEntityManager()->getConnection()->insert($Table, $Data); 
     $Sql="INSERT INTO $Table(`ListacctsID`,`Domain`, `IP`, `UserName`, 
           `Email`, `StartDate`, `DiskPartition`, `Quota`, `DiskSpaceUsed`, `Package`, 
           `Theme`, `Owner`, `UnixStartdate`) VALUES 
           ('{$Data['Domain']}', '{$Data['IP']}', '{$Data['UserName']}', '{$Data['Email']}', '{$Data['StartDate']}', '{$Data['DiskPartition']}', '{$Data['Quota']}', '{$Data['DiskSpaceUsed']}', 
           '{$Data['Package']}', '{$Data['Theme']}', '{$Data['Owner']}', '{$Data['UnixStartDate']}') 
         ON DUPLICATE KEY UPDATE DOMAIN =VALUES(DOMAIN),IP=VALUES(IP),UserName=VALUES(UserName),Email=VALUES(Email),StartDate=VALUES(StartDate),DiskPartition=VALUES(DiskPartition),Quota=VALUES(Quota) 
           ,DiskSpaceUsed=VALUES(DiskSpaceUsed),Package=VALUES(Package),Theme=VALUES(Theme),Owner=VALUES(Owner),UnixStartdate=VALUES(UnixStartdate) 
           "; 
     $Stm = $this->getEntityManager()->getConnection()->prepare($Sql); 
     $Stm->execute(); 
     // return $Data; 

     } 

コントローラでは何も変更しないでください。

+0

DUPLICATE KEY UPDATEが機能するためには、一意または主キーが必要です。 //結果ページをリフレッシュして再度データを送信する(そして挿入する)という問題を回避したい場合は、POST/Redirect/GETパターンを実装します。 – CBroe

+0

テーブルにプライマリキーがあります。 APIからのユニークな値はありません。私はその質問を働かせたい。 – user2268276

+0

次に、UserNameの一意の値を持つ瞬間に、重複キー更新... – CBroe

答えて

0
public function InsertListaccts($Table = '<listaccts>', $Data) 
    { 
     // $this->getEntityManager()->getConnection()->insert($Table, $Data); 
     $Sql="INSERT INTO $Table(`Domain`, `IP`, `UserName`, 
           `Email`, `StartDate`, `DiskPartition`, `Quota`, `DiskSpaceUsed`, `Package`, 
           `Theme`, `Owner`, `UnixStartdate`) VALUES 
           ('{$Data['Domain']}', '{$Data['IP']}', '{$Data['UserName']}', '{$Data['Email']}', '{$Data['StartDate']}', '{$Data['DiskPartition']}', '{$Data['Quota']}', '{$Data['DiskSpaceUsed']}', 
            '{$Data['Package']}', '{$Data['Theme']}', '{$Data['Owner']}', '{$Data['UnixStartDate']}') 
            ON DUPLICATE KEY UPDATE 
            Domain= '{$Data['Domain']}', IP ='{$Data['IP']}', 
            UserName='{$Data['UserName']}', Email='{$Data['Email']}', 
            StartDate='{$Data['StartDate']}', 
            DiskPartition='{$Data['DiskPartition']}', Quota='{$Data['Quota']}', 
            DiskSpaceUsed='{$Data['DiskSpaceUsed']}', 
            Package='{$Data['Package']}', Theme= '{$Data['Theme']}', 
            Owner='{$Data['Owner']}', UnixStartdate='{$Data['UnixStartDate']}' 
            "; 
     $Stm = $this->getEntityManager()->getConnection()->prepare($Sql); 
     $Stm->execute(); 

     } 

このクエリは正常に動作しますが、sakhunzaiとして提案されて - 誰かが、彼はそれが非常に有用になりますどのような意味で、このクエリを転送する場合は、「しかし、結合のparamを使用すると、はるかに安全であるsakhunzai」。

+0

@sakhunzai私はこのエラーを受け取りました。 – user2268276

+0

間違い私は持っていた)そこにいけない最後に、Thanx @ sakhunzai私は今それを持っていると思う。 – user2268276

関連する問題