简单的搜索引擎问题

时间:2014-03-10 16:46:30

标签: php pdo

大家好! 今天我在一个非常简单的搜索引擎的帮助下,从我读过的几个笔记。现在,我的问题是,每当我尝试运行它时,我会收到3个错误。我开始学习oop了,所以请耐心等待,因为我对此很新。

第一是为什么它不识别来自user-search1.php的$ title?

2nd 将是我的oop代码(codex.php)中的Undefined属性:PDOStatement :: $ num_rows。我做错了什么?

第3次错误是为foreach()提供的无效参数。我的另一个文件中有一个相同的循环函数。我遵循它的格式以及如何使用它但它仍然给我这个错误。为什么呢?

这是我的代码。

codex.php

  public function search($table, $title){

            $q = "SELECT * FROM $table WHERE title like '%:title%'";

                    $stmt = $this->con->query($q);
                    $num_result = $stmt->num_rows;    
                    if($num_result > 0){
                        while($rows =$stmt->fetchAll(PDO::FETCH_ASSOC)){               
                            $this->data[]=$rows;
                        header ("Location: user-search1.php");
                        }           
                        return $this->data;
                }
}

用户-search1.php

    <?php
    include_once "dbconnection.php";
    include_once "../styles/header-menu-out-user.php";
    function __autoload($class){
    include_once("../main/".$class.".php");}

    $code = new codex(); 
    $res = $code->search("book_info", $title);


 if(isset($_POST['submit'])){


            echo "<table id=\"tablecolor\" class=\"echoname\" >";
            echo "<th><b>ID</b></th>";
            echo "<th><b>Title</b></th>";
            echo "<th><b>Author</b></th>";
            echo "<th><b>ISBN</b></th>";
            echo "<th><b>Publisher</b></th>";
            echo "<th><b>Language</b></th>";
            echo "<th><b>Genre</b></th>";
            echo "<th><b>Quantity</b></th>";
            echo "<pre>";  
            foreach($res as $result)
              {
                    echo "<tr>";
                    extract($result);
                    echo "<td>".$id."</td>";
                    echo "<td>".$title."</td>";
                    echo "<td>".$author."</td>";
                    echo "<td>".$isbn."</td>";
                    echo "<td>".$publisher."</td>";
                    echo "<td>".$language."</td>";
                    echo "<td>".$genre."</td>";
                    echo "<td><center>".$quantity."</center></td>";
                    echo "</tr>";   
              } 

            echo "</pre>";
            echo "</table>";


     }
?> 

提前感谢那些希望帮助我的人。 一帆风顺!

1 个答案:

答案 0 :(得分:0)

首先,您的查询需要进行一些调整:

更改

$q = "SELECT * FROM $table WHERE title like '%:title%'";

$q = "SELECT * FROM $table WHERE title like :title";

您不希望在预先准备的声明中加上引号 - PDO会为您执行此操作。

接下来,您prepare()查询并将标题参数传递给您的语句。取代

$stmt = $this->con->query($q);

有了这个:

$stmt = $this->con->prepare($q);
$stmt->bindValue(':title', '%' . $title . '%'); // Add your wildcards here.
$stmt->execute();

要获取row count,请更改

$num_result = $stmt->num_rows;

对此:

$num_result = $stmt->rowCount();

当您获得有效的查询数据时,最后一个错误应该自行解决。但是,我建议您在其中放置一个safegaurd,以确保仅在向其传递有效结果时运行foreach,或者您可以使搜索返回空结果集。

最后一件事,在搜索方法中删除对header()函数的调用。看起来你的user-search1.php正在调用它,所以你不需要重定向到它。更不用说,让方法注入非常特殊的功能是不好的做法,你可能想在不同的情况下再次使用你的搜索方法。 ;)