PHP PDO未定义的方法DatabaseHandler :: prepare()

时间:2014-06-29 00:32:59

标签: php class pdo undefined

我是PHP PDO的新手,在我为包含给定字符串的所有国家创建搜索功能时遇到了这个错误,并使用Ajax更新每个键输入。

现在我的错误是:

  

致命错误:在第27行的E:\ Program files \ wamp \ www \ Ajax \ search.php中调用未定义的方法DatabaseHandler :: prepare()

的search.php

<?php
class SearchEngine{

    private $html;

    public function __construct($conn){

        $this->html = '';
        $this->html .= '<li class="result">';
        $this->html .= '<a target="_blank" href="urlString">';
        $this->html .= '<h3>nameString</h3>';
        $this->html .= '</a>';
        $this->html .= '</li>';

        if (isset($_POST["query"])) {
            $search_string = preg_replace("/[^A-Za-z0-9]/", " ", $_POST['query']);
        }

        else{
            $this->html .= 'Something went wrong';
            $search_string = 'a';
        }

        if (strlen($search_string) >= 1 && $search_string !== ' ') {

            $query = 'SELECT * FROM country WHERE name LIKE "%' . $search_string . '%"';
            $result = $conn->prepare($query);
            $result->execute();
            $result_array = $result->fetchAll();

                foreach ($result_array as $result) {

                    $display_name = preg_replace("/".$search_string."/i", "<b class='highlight'>".$search_string."</b>", $result['name']);
                    $display_url = ''.urlencode($result['name']).'&lang=en';
                    $output = str_replace('nameString', $display_name, $html);
                    $output = str_replace('urlString', $display_url, $output);
                    echo($output);
                }
        }
    }

} ?>

和我的数据库处理程序

<?php
class DatabaseHandler
{   
    public $conn;

    public function openConnection($host, $user, $password, $database){
        $this->conn = new PDO('mysql:host=localhost;dbname=ajax;charset=utf8', 'root', '');
        $this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $this->conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    }

} ?>

这一切都是从index.PHP

调用的
<?php
require_once("cgi_bin/connection.php");
require_once("Database_Handler.Class.php");
require_once("HTML_Page.Class.php");
require_once("search.php");

$hostname_conn = "localhost";
$database_conn = "ajax";
$username_conn = "root";
$password_conn = "";

$conn = new DatabaseHandler($hostname_conn, $username_conn, $password_conn, $database_conn);

$IndexPage = new page();
$SearchEngine = new SearchEngine($conn);

echo $IndexPage->render(); ?>

现在我发现你不能在类中调用:: prepare函数。但是如何解决这个问题?

一些注意事项:是的,我的代码需要一些改进,但我宁愿让它先工作,任何建议都非常受欢迎。和$ _POST [&#39;查询&#39;];由于某种原因总是没有设置所以我现在将查询设置为&#39; a&#39;但这是我以后可以找到/修复的错误。

非常欢迎任何帮助/评论等。谢谢

2 个答案:

答案 0 :(得分:2)

您写道:

$conn = new DatabaseHandler($hostname_conn, $username_conn, $password_conn, $database_conn);

好像构造函数会返回连接

应该是

$db = new DatabaseHandler();
$conn = $db->openConnection($hostname_conn, $username_conn, $password_conn, $database_conn);

答案 1 :(得分:1)

$conn不是PDO对象,而是DatabaseHandler,它没有任何名为prepare的方法。因此,你正在准备错误的班级。

只需调用返回PDO实例的openConnection()方法并指定它。

// use it like this
$db = new DatabaseHandler();
$conn = $db->openConnection($hostname_conn, $username_conn, $password_conn, $database_conn);

<?php

class DatabaseHandler
{   
    public $conn;

    public function openConnection($host, $user, $password, $database){
        $this->conn = new PDO('mysql:host=localhost;dbname=ajax;charset=utf8', 'root', '');
        $this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $this->conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

        // return the PDO instance
        return $this->conn;
    }

} 

?>

在这种情况下,返回一个PDO实例,它应该有一个方法名prepare,因此可以工作。