【问题标题】:PDO Array to String Conversion - ParameterPDO 数组到字符串的转换 - 参数
【发布时间】:2017-05-27 21:36:01
【问题描述】:

很确定有一个简单的解决方法,但是在涉及 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 循环创建一个新数组,保存一个计数变量,然后在 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;
}

【问题讨论】:

    标签: php mysql arrays pdo parameters


    【解决方案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 是默认绑定类型,因此将用于此而不指定它。

    【讨论】:

    • 我喜欢这个解决方案,但是有没有办法清理信息以尝试防止 SQL 注入?我知道它是一个内部函数,所以它不应该很容易被拦截,但知道它仍然很好
    • 这与单独绑定值具有相同的效果,并且使用此方法不应否定使用准备好的语句的任何积极影响。因为您唯一直接插入到 SQL 中的是占位符,并且参数仍然是单独传递和绑定的,所以这种方式不应该增加您的 SQL 注入漏洞。这只是做同样事情的一种更短的方法。
    • 这很奇怪。我仍然收到您的代码的数组到字符串转换错误。编辑:另外,可以在“”标签内访问 $placeholders,还是应该将“”替换为 '' 并连接 $placeholders 变量?我从来没有将变量从字符串中分离出来,所以我不确定这是否可以做到,我知道这很愚蠢。
    • 关于哪个声明?
    • $ParentList->execute($SAList);
    猜你喜欢
    • 2014-09-26
    • 1970-01-01
    • 2014-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多