【问题标题】:Redundant binding parameters on a PDO Insert processPDO 插入过程中的冗余绑定参数
【发布时间】:2015-09-25 11:00:12
【问题描述】:

仅供参考:这个文件是我第一次接触 PDO。

我已将 mysqli PHP 文件信息转换为 PDO PHP 文件,它工作正常。文件的目标是:如果用户没有在键($ca_key1 - $ca_key3) 上传递任何值,只需在数据库中插入数据。如果键被传递并且在 DB 上不存在,则在 DB 上插入数据。如果确实存在,则回显错误。

我知道 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');
}

?>

【问题讨论】:

    标签: php pdo


    【解决方案1】:

    实际上,您根本不必 [显式] 绑定。

    与 mysqli 相比,PDO 是一个很大的进步,这是它的好处之一:您可以创建一个变量数组,并将它们直接传递给execute(),而不是一个一个地绑定它们 - PDO 将绑定它们在内部,默认使用PDO::PARAM_STR,这在大多数情况下都不是问题,仅用于一种情况 - LIMIT 子句参数。

    它不仅大大减少了代码量,而且让你可以在不同的查询中重用同一组变量。

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

    当然,数组键必须匹配查询中的占位符。如果您的查询有不同的占位符集,那么您也需要不同的数组。

    【讨论】:

    • 全部清除。与匹配的占位符一起工作很好:)
    猜你喜欢
    • 2016-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-13
    • 1970-01-01
    • 2017-01-29
    • 2015-12-03
    • 1970-01-01
    相关资源
    最近更新 更多