php – PDO混合未命名和命名参数

发布时间:2022-04-30 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了php – PDO混合未命名和命名参数脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试使用此分区进行基本搜索

$construct = '? AND ? AND..';

$query = $database->PRepare('SELECT * From something WHERE something LIKE ' . $construct . ' LIMIT :offset,:results');

我混合它们的唯一原因是因为未命名的参数不能具有int值,因为显然存在PHP错误https://bugs.php.net/bug.php?id=44639

但是,如果我不混合它们,我如何使用绑定搜索可变数量语?

更新

搞砸了之后,我使用命名参数和一些循环或多或少地解决了它:

// build prepared statement
    $construct = '';
    for ($x = 0; $x <= $seArchArrayCount; $x++) {
        $construct .= ($x < $searchArrayCount)
                    ? ":VAR$x OR name LIKE "
                    : ":var$x LIMIT :start,:PErPage";
    }

    $query = $database->prepare('SELECT something From something WHERE name LIKE ' . $construct);

    // bind parameters
    for ($x = 0; $x <= $searchArrayCount; $x++) {
        $searchArray[$x] = "%$searchArray[$x]%";
        $query->bindParam(":var$x",$searchArray[$x]);
    }

    $query->bindParam(':start',$searchArrayCount,PDO::PARAM_INT);
    $query->bindParam(':perPage',$perPage,PDO::PARAM_INT);

如果有更优化的方式来解决这个问题,我很乐意被告知.

解决方法

未命名的参数可以具有int值.只需在bind函数中定义显式类型即可.

变量数据类型可能存在问题.之前使用intval()函数是很好的.

您在未命名数据类型中的解决方案可能如下所示:

$counter = 0;

//build prepared statement

$query = $database->prepare('SELECT something FROM something WHERE 0 OR '.
implode(' OR ',array_fill(0,'name LIKE ?')).
        ' LIMIT ?,?');

// bind parameters
foreach($searchArray as $value)
{
    $counter++;
    $query->bindValue($counter,('%'.$value.'%'),PDO::PARAM_STR);
}

$query->bindValue(($counter+1),($page*$perPage),PDO::PARAM_INT);
$query->bindParam(($counter+2),PDO::PARAM_INT);

注意我在bind@R_185_1403@之前使用了bindValue().请注意LIMIT的第一个参数.如果计数将在此处,则选择将从数据末尾开始,并且不返回任何行.

脚本宝典总结

以上是脚本宝典为你收集整理的php – PDO混合未命名和命名参数全部内容,希望文章能够帮你解决php – PDO混合未命名和命名参数所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。