我是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;但这是我以后可以找到/修复的错误。
非常欢迎任何帮助/评论等。谢谢
答案 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
,因此可以工作。