php – PDO混合未命名和命名参数
发布时间:2020-12-13 22:34:07 所属栏目:PHP教程 来源:网络整理
导读:我正在尝试使用此分区进行基本搜索: $construct = '? AND ? AND..';$query = $database-prepare('SELECT * FROM something WHERE something LIKE ' . $construct . ' LIMIT :offset,:results'); 我混合它们的唯一原因是因为未命名的参数不能具有int值,因为
我正在尝试使用此分区进行基本搜索:
$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); 注意我在bindParam()之前使用了bindValue().请注意LIMIT的第一个参数.如果计数将在此处,则选择将从数据末尾开始,并且不返回任何行. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |