2015-09-25 68 views
2

僅供參考:此文件是我與PDO的第一次觸摸。PDO上的冗餘綁定參數插入過程

我已經將一個mysqli PHP文件信息轉換爲一個PDO PHP文件,它工作正常。文件的目標是:如果用戶未在密鑰($ca_key1 - $ca_key3)上傳遞任何值,則只需在數據庫上插入數據。如果密鑰通過並且數據庫上不存在,則在數據庫上插入數據。如果它們確實存在,則回顯一個錯誤。

我知道PDO看起來多餘,但在這種情況下,我在同一個文件上使用相同的參數達3次,我問:有沒有什麼方法綁定參數一次,並在3次執行中使用它?例如,ca_key1可能只是綁定一次並用於3次執行?

如果您發現文件上有任何錯誤/錯誤,除此之外,如果您提及我,我將不勝感激。我想從開始就適應PDO的良好習慣。

<?php 
    session_start(); 
    include("../conexionbbdd.php"); 


if($_SESSION['estado'] == 'activo'){ 

    if (isset($_POST['ca_name'])&&isset($_POST['ca_content'])&&isset($_POST['ca_img'])&&isset($_POST['ca_key1'])&&isset($_POST['ca_key2'])&&isset($_POST['ca_key3'])){ 

     //CHECK IF USER PASSED VALUES ON KEYS 
     $ca_key1=$_POST['ca_key1']; 
     $ca_key2=$_POST['ca_key2']; 
     $ca_key3=$_POST['ca_key3']; 

     //IF PASSED, CHECK IF VALUES EXIST ON DB 
     if ($ca_key1!=="" || $ca_key2!=="" || $ca_key3!==""){ 

      $selectKeys= "SELECT ca_key1,ca_key2,ca_key3 FROM ws_campaigns WHERE ca_fk_us_id = :us_id AND (" 
        . " (ca_key1!='' AND ca_key1 = :ca_key1) OR (ca_key2!='' AND ca_key2 = :ca_key1) OR (ca_key3!='' AND ca_key3 = :ca_key1) " 
        . "OR (ca_key1!='' AND ca_key1 = :ca_key2) OR (ca_key2!='' AND ca_key2 = :ca_key2) OR (ca_key3!='' AND ca_key3 = :ca_key2)" 
        . "OR (ca_key1!='' AND ca_key1 = :ca_key3) OR (ca_key2!='' AND ca_key2 = :ca_key3) OR (ca_key3!='' AND ca_key3 = :ca_key3))"; 

      $statementKeys = $pdo->prepare($selectKeys); 

      $statementKeys->bindParam(':us_id', $_SESSION['id'], PDO::PARAM_INT); 
      $statementKeys->bindParam(':ca_key1', $_POST['ca_key1'], PDO::PARAM_STR); 
      $statementKeys->bindParam(':ca_key2', $_POST['ca_key2'], PDO::PARAM_STR); 
      $statementKeys->bindParam(':ca_key3', $_POST['ca_key3'], PDO::PARAM_STR); 

      $statementKeys->execute(); 

      $cuenta = $statementKeys->rowCount(); 

      //IF NOT EXIST, INSERT DATA 
      if ($cuenta === 0){ 
        $insertCampaign = "INSERT INTO ws_campaigns(ca_id,ca_name, ca_content,ca_fk_us_id,ca_img,ca_prefix,ca_key1,ca_key2,ca_key3 
        )VALUES('',:ca_name,:ca_content,:us_id,:ca_img,'34',:ca_key1,:ca_key2,:ca_key3)"; 

        $statementInsertCampaign = $pdo->prepare($insertCampaign); 

        $statementInsertCampaign->bindParam(':us_id', $_SESSION['id'], PDO::PARAM_INT); 
        $statementInsertCampaign->bindParam(':ca_name', $_POST['ca_name'], PDO::PARAM_STR);  
        $statementInsertCampaign->bindParam(':ca_content', $_POST['ca_content'], PDO::PARAM_STR);    
        $statementInsertCampaign->bindParam(':ca_img', $_POST['ca_img'], PDO::PARAM_STR); 
        $statementInsertCampaign->bindParam(':ca_key1', $_POST['ca_key1'], PDO::PARAM_STR); 
        $statementInsertCampaign->bindParam(':ca_key2', $_POST['ca_key2'], PDO::PARAM_STR); 
        $statementInsertCampaign->bindParam(':ca_key3', $_POST['ca_key3'], PDO::PARAM_STR); 

        $statementInsertCampaign->execute(); 
        $newId = $pdo->lastInsertId(); 
        echo $newId; 
      } 
      else{ 
       echo "No se ha creado la campaña. <br>Alguna de las palabras clave utilizadas ya están presentes en una campaña anterior."; 
      } 

     }else{ 
        //IF NO VALUES PASSED, INSERT DATA 
        $insertCampaign = "INSERT INTO ws_campaigns(ca_id,ca_name, ca_content,ca_fk_us_id,ca_img,ca_prefix,ca_key1,ca_key2,ca_key3 
        )VALUES('',:ca_name,:ca_content,:us_id,:ca_img,'34',:ca_key1,:ca_key2,:ca_key3)"; 

        $statementInsertCampaign = $pdo->prepare($insertCampaign); 

        $statementInsertCampaign->bindParam(':us_id', $_SESSION['id'], PDO::PARAM_INT); 
        $statementInsertCampaign->bindParam(':ca_name', $_POST['ca_name'], PDO::PARAM_STR);  
        $statementInsertCampaign->bindParam(':ca_content', $_POST['ca_content'], PDO::PARAM_STR);    
        $statementInsertCampaign->bindParam(':ca_img', $_POST['ca_img'], PDO::PARAM_STR); 
        $statementInsertCampaign->bindParam(':ca_key1', $_POST['ca_key1'], PDO::PARAM_STR); 
        $statementInsertCampaign->bindParam(':ca_key2', $_POST['ca_key2'], PDO::PARAM_STR); 
        $statementInsertCampaign->bindParam(':ca_key3', $_POST['ca_key3'], PDO::PARAM_STR); 

        $statementInsertCampaign->execute(); 
        $newId = $pdo->lastInsertId(); 
        echo $newId; 
     } 

    }else{ 
     header('location:../paneles/campana.php?msg=nodata'); 
    } 

}else{ 
    header('location:../login.php?msg=nopermission'); 
} 

?> 

回答

2

其實,你不必綁定[明確]在所有。

與mysqli相比,PDO是一大進步,這是它的好處之一:您可以創建一個變量數組,並將它們直接傳遞到​​,而不是逐個綁定它們 - PDO將內部綁定它們,默認情況下使用PDO::PARAM_STR,這在大多數情況下並不是問題,只存在一種情況 - LIMIT子句參數。

它不僅大大減少了代碼量,而且讓您可以在不同的查詢中重用同一組變量。

$data = array(
    'us_id' => $_SESSION['id'], 
    'ca_name' => $_POST['ca_name'], 
    // and so on 
); 
$stmt->execute($data); 

當然,數組鍵必須與查詢中的佔位符相匹配。如果您的查詢具有不同的佔位符集合,那麼您將需要不同的陣列。

+0

全部清楚。與匹配的佔位符合作:) – Biomehanika