Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP PDO未定义的方法DatabaseHandler::prepare()_Php_Class_Pdo_Undefined - Fatal编程技术网

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

PHP PDO未定义的方法DatabaseHandler::prepare(),php,class,pdo,undefined,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 __constru

我是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);
                }
        }
    }

} ?>

$conn
不是PDO对象,它是
数据库处理程序
,它没有任何名为
prepare
的方法。因此,您在错误的类上调用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;
    }

} 

?>
//像这样使用它
$db=新的DatabaseHandler();
$conn=$db->openConnection($hostname\u conn、$username\u conn、$password\u conn、$database\u conn);
在本例中,将返回一个PDO实例,该实例应具有一个方法名
prepare
,因此将起作用。

您写道:

$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);

请考虑Builder一个更好的脚本。你试图做你需要做的事情的方式很糟糕。你要求我建立一个更好的脚本,而这当然是我能做的最好的了?不。根据“最佳”一词的任何定义,这都不是最好的。除了最大的错误。我不是想侮辱你,只是想激励你,让你可以做更多(因为你可以)不起作用的事情,我不认为。如果我错了,请纠正我,但是
\u construct
始终返回当前类的新实例。我查找了它,您是正确的。所以解决方法是直接使用openConnection方法。我想@NiettheDarkAbsol是对的,如果不是的话,我可以得到更多的说明,我不完全理解如何修复它。但是谢谢你帮助我!当您实例化一个类(使用new)时,您正在调用该类的构造函数,它总是返回您刚刚实例化的类的实例。你想要的是PDO对象的一个实例。似乎还没有人建议,OP的原始脚本几乎违反了所有编写的OOP转换。谢谢,这对我很有用。我明白为什么它不起作用,为什么它现在起作用。谢谢你帮助我@krijin还有一件事要处理db类中的这个参数您不想从外部传递这些参数如果没有我修改返回$conn属性,这将永远不会工作。openConnection在原始脚本中没有返回值。这不应该是答案。@edwardmp是的。构造函数需要返回PDO对象。@edwardmp这个建议对我很有效,或者它是一个草率的解决方案,不是“代码安全的”?
$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);