我一直試圖讓這個工作,但我不認爲我的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