2013-04-23 146 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