2013-04-23 142 views
-2

我一直試圖讓這個工作,但我不認爲我的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和它們是相同的?

+0

嚴格地說,這是所謂的「太本地化」的問題,意味着你尋求幫助無法與一些通用的問題,而僅僅是爲了調試你自己的代碼 - 所以,它不會幫助任何其他人。雖然我會看看是否有時間,但最好自己調試一下,將問題縮小到某個特定點。 – 2013-04-23 10:30:58

+0

這實際上可能會幫助別人,因爲它詢問有關sql注入,如何插入一個sql數據庫的正確方法。它不是發出錯誤響應的代碼,它似乎是執行sql語句 – Robert 2013-04-23 10:34:01

+0

請注意SQL表達式中AND和OR的優先順序,您可能需要添加一些括號。 – Barmar 2013-04-23 10:38:48

回答

1

含有=>成陣列把字符串不會使關聯。 =>是數組文字的語法的一部分,它們必須位於字符串之外。

替換:

$prep[] = "':productid{$i}' => {$productid}"; 

有:

$prep[":productid{$i}"] = $productid}; 

替換:

$e = "':productid' =>" . $_SESSION["SESS_USERSPRODUCTIDS"]; 

有了:

$prep = array(':productid' => $_SESSION["SESS_USERSPRODUCTIDS"]); 

替換:

$prep  = array($e, ':like' => "%$searchword%", ':like2' => "%$searchword%"); 

有:

$prep[':like'] = "%$searchword%"; 
$prep[':like2'] = "%$searchword%"; 
+0

這樣做的錯誤很好:)但它沒有找到任何結果,導致我認爲它的方式即時通訊要求在數據庫中的數據。 – Robert 2013-04-23 10:53:04

+0

您是否看到我關於括號的評論? – Barmar 2013-04-23 11:08:00

+0

對不起,遲到了,不得不從孩子們上學...是的,我看到了評論和我試圖使用()儘可能沒有喜悅:( – Robert 2013-04-23 14:53:35