【问题标题】:PHP PDO Undefined method DatabaseHandler::prepare()PHP PDO 未定义方法 DatabaseHandler::prepare()
【发布时间】:2014-08-19 18:19:58
【问题描述】:

我对 PHP PDO 比较陌生,在为包含给定字符串的所有国家/地区创建搜索功能并使用 Ajax 更新每个键输入时偶然发现了此错误。

现在我的错误是:

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

搜索.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['query'];出于某种原因始终未设置,所以我现在将查询设置为“a”,但这是我以后可以自己查找/修复的错误。

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

【问题讨论】:

  • 请考虑构建一个更好的脚本。你试图做你需要做的事情的方式是可怕的。
  • 你是在要求我构建一个更好的脚本,而这当然是我能做到的最好的了?
  • 不。从“最好”这个词的任何定义来看,这都不是最好的。除了最好的错误。我不是想侮辱你,只是为了激励你,这样你就可以做得更多(因为你可以)

标签: php class pdo undefined


【解决方案1】:

$conn 不是 PDO 对象,它是 DatabaseHandler,它没有任何名为 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;
    }

} 

?>

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

【讨论】:

  • 那行不通,我不认为。如果我错了,请纠正我,但__construct always 返回当前类的新实例。
  • 我查了,你说得对。所以解决方法是直接使用 openConnection 方法。将编辑帖子。
  • 我认为@NiettheDarkAbsol 是正确的,如果不是,我能否获得更多说明,我不完全了解如何解决它。但是谢谢你帮助我!
  • 当你实例化一个类(用new)时,你正在调用类的构造函数,它总是返回你刚刚实例化的类的实例。你想要的是一个 PDO 对象的实例。
  • 似乎仍然没有人建议,OP 的原始脚本违反了几乎所有编写的 OOP 转换。
【解决方案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);

【讨论】:

  • 谢谢,这对我有用。我明白为什么它不起作用以及为什么它现在起作用。谢谢你帮助我!
  • @krijin 还要处理来自 db 类的这个参数,你不想从外部传递这些参数
  • 如果没有我修改返回 $conn 属性,这将永远无法工作。 openConnection 在原始脚本中没有返回值。这不应该是答案。
  • @edwardmp 是的。构造函数需要返回 PDO 对象。
  • @edwardmp 这个建议对我有用,还是一个草率的解决方案而不是“代码安全”?
猜你喜欢
  • 1970-01-01
  • 2018-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-09
  • 2023-03-03
相关资源
最近更新 更多