我一直试图让这个工作,但我不认为我的SQL是否设置正确。PHP创建一个动态的搜索查询和PDO
比如我想获得从URL搜索词,然后用准备好的语句,以便其安全数据库中使用插入。
首先,我叫他们从会话所拥有的产品的用户ID。
然后我检查,如果他们有超过1项,如果他们这样做我设置一个数组,并插入到数据库中,如果没有超过1项,然后我只是单纯地插入到数据库中检索数据。
之所以我设置成变量,是因为它被送到分页类,所以它会分页的结果。
下面是HTML头:
<?php
$searchword = $urlmaker->geturlandsearch($_GET["search"]);
$findcomma = strpos($_SESSION["SESS_USERSPRODUCTIDS"], ",");
if($findcomma == true){
$userproductid = explode(',', $_SESSION["SESS_USERSPRODUCTIDS"]);
$prep = array(':like' => "%$searchword%", ':like2' => "%$searchword%");
$q = '';
$e = '';
$i = 1;
foreach($userproductid as $productid){
$q .= 'productid=:productid' . $i . ' || ';
$prep[":productid{$i}"] = $productid;
$i++;
}
$q = rtrim($q, " || ");
} else {
$q = 'productid=:productid';
$prep = array(':productid' => $_SESSION["SESS_USERSPRODUCTIDS"], ':like' => "%$searchword%", ':like2' => "%$searchword%");
}
$maxlimit = 15;
$geturi = "/Search-Forum/" . $_GET['search'] . "/";
$string = "SELECT id,title,date,username,viewcount,replycount,replyuser,replydate FROM forum_topics WHERE " . $q . " AND title LIKE :like OR content like :like2 ORDER BY replydate DESC";
$pagstring = "SELECT id FROM forum_topics WHERE " . $q . " AND title LIKE :like OR content like :like2";
$pagurl = $geturi;
这里是前端代码:
<?php
$topicQuery = $pagination->paginatedQuery($pdo, $string, $maxlimit, $prep);
if($topicQuery != "no query"){
while($fetchquery = $topicQuery->fetch()) {
$topicid = stripslashes($fetchquery["id"]);
$topictitle = stripslashes($fetchquery["title"]);
$topicdate = stripslashes($fetchquery["date"]);
$topicusername = stripslashes($fetchquery["username"]);
$topicviewcount = stripslashes($fetchquery["viewcount"]);
$topicreplycount = stripslashes($fetchquery["replycount"]);
$topicreplyuser = stripslashes($fetchquery["replyuser"]);
$topicreplydate = stripslashes($fetchquery["replydate"]);
?>
<li>
<div class="topiclisttitle"><p><b><a href="<?php echo '/Forum-'.$_GET["forumid"].'/Product-'.$_GET["productid"].'/' . $urlmaker->sluggify($topictitle); ?>/<?php echo $topicid ; ?>/<?php echo $_GET["proid"]; ?>/"><?php echo ucwords($topictitle); ?></a></b><br><?php echo $topicusername ; ?> on <?php echo $betterTime->dateAndtime($topicdate); ?></p></div>
<div class="topiclistview"><p><b><?php echo $topicviewcount ; ?></b><br>Views</p></div>
<div class="topiclistview"><p><b><?php echo $topicreplycount ; ?></b><br>Replies</p></div>
<div class="topiclistlastposted"><?php if(!empty($topicreplyuser)){ ?><p>By: <b><?php echo $topicreplyuser ; ?></b> On<br><?php echo $betterTime->dateAndtime($topicreplydate); ?></p><?php } else { ?><p>By: <b><?php echo $topicusername ; ?></b> On<br><?php echo $betterTime->dateAndtime($topicreplydate); ?></p><?php } ?></div>
</li>
<?php } } else { ?>
<li><p class="morepadding">No Topics Regarding Your Search Words :(</p></li>
<?php } ?>
这里是关于分页类数据库输入:
$freebiesquery = $pdo->prepare($string . " LIMIT " . $maxlimit);
$freebiesquery->execute($prep);
$freebiesquery_num = $freebiesquery->rowCount();
所有这在其他页面上工作,所以它必须是我做代码的标题部分的方式,即im形式首先查询sql查询。是
我得到的唯一错误如下:
警告:PDOStatement对象::执行():SQLSTATE [HY093]:无效的参数编号:绑定变量的数量不符数
而且
警告:PDOStatement对象::执行():SQLSTATE [HY093]:无效参数号
但这不能是因为我已经计数THEMA和它们是相同的?
严格地说,这是所谓的“太本地化”的问题,意味着你寻求帮助无法与一些通用的问题,而仅仅是为了调试你自己的代码 - 所以,它不会帮助任何其他人。虽然我会看看是否有时间,但最好自己调试一下,将问题缩小到某个特定点。 – 2013-04-23 10:30:58
这实际上可能会帮助别人,因为它询问有关sql注入,如何插入一个sql数据库的正确方法。它不是发出错误响应的代码,它似乎是执行sql语句 – Robert 2013-04-23 10:34:01
请注意SQL表达式中AND和OR的优先顺序,您可能需要添加一些括号。 – Barmar 2013-04-23 10:38:48