PHP PDO未定义的方法DatabaseHandler::prepare()
我是PHP PDO的新手,在创建包含给定字符串的所有国家/地区的搜索函数时偶然发现了这个错误,并使用Ajax更新了每个键输入 现在我的错误是: 致命错误:在第27行的E:\Program files\wamp\www\Ajax\search.php中调用未定义的方法DatabaseHandler::prepare() Search.PHPPHP 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
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);