PDO数组到字符串转换 - 参数

时间:2017-01-12 17:01:13

标签: php mysql arrays pdo parameters

非常确定这是一个很容易解决的问题,但是当谈到PDO语句时,我对数组处理缺乏经验

目的:从数据库中检索一组id,然后使用这些ID进行比较和检索

$SAList = getSecurityActionsForQuestion("$QID");
$con = database::getInstance()->getConnection();
$ParentList = $con->prepare('SELECT SQ.SurveyQuestionID, SQ.SurveyQuestionDesc 
FROM SurveyQuestion SQ
JOIN  SurveyQuestionLookup SQLP ON SQLP.SurveyQuestionID = SQ.SurveyQuestionID
WHERE SQLP.SecurityActionID IN (:SAList)
   AND SQLP.SurveyQuestionID != :QID');
$ParentList->bindValue(':QID',$QID, PDO::PARAM_STR);
$ParentList->bindValue(':SAList',$SAList, PDO::PARAM_STR);
$ParentList->execute();
$Results = $ParentList->fetchAll();

现在,单独来说,' getSecurityActionForQuestion'函数和插入的select语句工作并检索我想要的。问题是我无法将数组发送到PDO :: PARAM_STR,但我没有找到解决方法。

我已经看到了一些破坏和准备字符串的选项,但我并不完全确定如何将其融入我当前的设计中。

有可能使用foreach循环创建一个新数组,保存一个count变量,然后在SQL语句中,我可以插入一堆命名参数,然后使用另一个for循环将每个参数绑定到它们各自的这些地方,但我很确定那里的人比那个hackjob更优雅。

编辑:

为清晰起见,添加了getSecurityActionsForQuestion(ID)函数

function getSecurityActionsForQuestion($QID)
{
    $con = database::getInstance()->getConnection();
    $SAList = $con->prepare("SELECT DISTINCT SecurityActionID FROM SurveyQuestionLookup
    WHERE SurveyQuestionID = :QID");
    $SAList->bindValue(':QID',$QID,PDO::PARAM_INT);
    $SAList->execute();
    $Results = $SAList->fetchAll();
    $SAList=null;
    $con=null;  
    return $Results;
}

1 个答案:

答案 0 :(得分:1)

您可以使用?占位符代替命名占位符,并使用值数组执行查询,而不是单独绑定每个值。 (参见the PDOStatement::execute manual中的示例#5。)

$SAList = getSecurityActionsForQuestion("$QID");
$con = database::getInstance()->getConnection();

// create placeholders for each item in your array
$placeholders = rtrim(str_repeat('?,', count($SAList)),',');

$ParentList = $con->prepare("SELECT SQ.SurveyQuestionID, SQ.SurveyQuestionDesc 
FROM SurveyQuestion SQ
JOIN  SurveyQuestionLookup SQLP ON SQLP.SurveyQuestionID = SQ.SurveyQuestionID
WHERE SQLP.SecurityActionID IN ($placeholders)
   AND SQLP.SurveyQuestionID != ?");

// add the $QID into the array
$SAList[] = $QID;

// execute the query with the array of values
$ParentList->execute($SAList);

$Results = $ParentList->fetchAll();

PDO::PARAM_STR是默认的绑定类型,因此将在不指定的情况下使用它。