在非对象中调用成员函数prepare()

时间:2014-03-08 04:46:05

标签: php mysql pdo

我正在尝试在我的网站上创建搜索功能。它没有显示任何结果,我不断收到Call to a member function prepare() on a non-object in line x ...

function doSearch() {
    $output = '';
    if(isset($_POST['search'])) {
        $searchq = $_POST['search'];
        $searchq = preg_replace ("#[^0-9a-z]#i","",$searchq);
$sql = "SELECT * FROM entries WHERE name LIKE :searchq or description LIKE :searchq or content LIKE :searchq";

$stmt = $conn->prepare($sql);
$stmt->bindParam(":searchq",$searchq,PDO::PARAM_STR);
$stmt->execute();
$count = $stmt->rowCount();
 if($count == 0) {
            $output = '<tr><tr>No results found.</tr></td>';
        } else {
            while($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
                $eName = $row['name'];
                $eDesc = $row['description'];
                $eCont = $row['content'];
                $id = $row['id'];
                $elvl = $row['level'];
                $ehp = $row['hp'];

                $output .= '<tr><td><a href="http://xxxx.com/xxx?id=' .$id. '" onclick="document.linkform.submit();">'.$eName.'</a></td><td>'.$eDesc.'</td><td>'.$elvl.'</td><td>'.$ehp.'</td></tr>';
            }
        }            

    return $output;
    }
 }

我的functions.php文件中包含我的PDO连接。

2 个答案:

答案 0 :(得分:0)

应该是:

$sql = "SELECT * FROM entries 
          WHERE name LIKE :searchq or 
                description LIKE :searchq or 
                content LIKE :searchq";

global $conn;
$stmt = $conn->prepare($sql);

确保已包含db配置文件。

答案 1 :(得分:0)

prepare()是PDO连接对象的方法,$ conn变量不是一个。它需要实例化为连接对象,如下所示:

$conn = new PDO('mysql:host=localhost;dbname=database', 'user', 'password');

或者,如果已经在“全局”范围内某处完成,您只需要在函数中声明:

global $conn;

这样做很好。该声明具有误导性。它只是执行脚本范围内的“全局”,并没有超越脚本执行。在脚本执行结束时销毁所有这些对象。这与会话无关。