Php 简单搜索引擎问题

Php 简单搜索引擎问题,php,pdo,Php,Pdo,大家好! 今天,在我读到的一些注释的帮助下,我制作了一个非常简单的搜索引擎。现在,我的问题是,每当我尝试运行它时,都会出现3个错误。我开始学习面向对象编程,所以请容忍我,因为我在这方面很新 1st是为什么它不能从user-search1.php中识别$title 2nd将是未定义的属性:PDOStatement::$num_行,来自我的oop代码(codex.php)。我做错了什么 3rd错误是为foreach()提供的无效参数。我在另一个文件中有一个相同的循环函数。我遵循它的格式和使用方法,但

大家好! 今天,在我读到的一些注释的帮助下,我制作了一个非常简单的搜索引擎。现在,我的问题是,每当我尝试运行它时,都会出现3个错误。我开始学习面向对象编程,所以请容忍我,因为我在这方面很新

1st是为什么它不能从user-search1.php中识别$title

2nd将是未定义的属性:PDOStatement::$num_行,来自我的oop代码(codex.php)。我做错了什么

3rd错误是为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;
                }
}
    <?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>";


     }
?> 
user-search1.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;
                }
}
    <?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>";


     }
?> 

提前感谢那些希望帮助我的人。
祝你好运

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

改变

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

你不想在准备好的语句中加引号——PDO会帮你做的

接下来,您将
prepare()
查询并将title参数传递到语句中。替换

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

$num_result = $stmt->num_rows;
要拿到钱,找零钱

为此:

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


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

谢谢你的提示,先生。这是什么
标题(“Location:user-search1.php”)该怎么办?我原以为它会重定向到那个页面。现在我知道这只是一个愚蠢的错误。因为我user-search1.php已经像SamT先生说的那样调用它了。我不知道那个引用的东西。现在我知道了,谢谢你的提示,先生。如果你不介意的话,如果我有一个以上的值,但我将是$hey->execute(array($balhablah)),那么不使用bindValue还可以吗?是的,PDO错误现在消失了。还有两个!非常感谢您的帮助,先生。是的,这也很好。他根本不需要行计数。@SamT第二个错误消失了。谢谢是的,当我试着运行它的时候,浏览器会给我一个通知“这个网页有一个重定向循环”很抱歉我的无知,但是你说的安全保护是什么意思?这是否就像当没有结果时,你会发出通知或警告说没有结果?@你的常识能告诉我为什么吗?这里很混乱。
$num_result = $stmt->rowCount();