我的PDO课程在哪里出错了?

时间:2016-09-26 23:21:07

标签: php mysql database oop pdo

我对PDO对象有点新意,我只是尝试建立与数据库的连接并返回mySQL查询。我已经搜索了互联网(包括这个网站),试图找到解决方案。我找到了许多类似的解决方案,但没有任何工作。我知道这可能是一个非常简单的修复,但我似乎无法找到它。

提前感谢您的帮助!

PDO Class

 <?php
    class Database {

    private static $host = "localhost";
    private static $db_name = "c9";
    private static $username = "theandrewilliam";
    private static $password = "";
    private static $socket = "mysql";

    //Instance of class
    private $instance = NULL;

    //Connection to Database (predefined function)
    public function __construct(){

        if($this -> instance == NULL){
            try{

                $db = new PDO(self::$socket.':'.'host'.'='.self::$host.';'
                .'dbname'.'='.self::$db_name,self::$username,self::$password);

                $this -> instance = $db;

            } catch(PDOException $e){

                die($e -> getMessage());

            }
        }

    }

    //Queries
    public function query($sql){

        $query = $this -> instance = prepare($sql);
        $query -> execute();

        return $query;

    }

    }

PDO对象

<?php
    require_once('db.php');

    $data = new Database();

    $sq = 'SELECT * FROM body';

    $result = $data -> query($sq);

    while($row = $result -> $query -> fetch(PDO::FETCH_ASSOC)){

    $body = $row['text'];
    echo $body;

    }

抛出错误

  

致命错误:调用未定义的函数prepare()   第36行/home/ubuntu/workspace/db.php调用堆栈:0.0003 233728 1。   {main}()/home/ubuntu/workspace/post.php:0 0.0011 254688 2。   数据库 - &gt;查询()/home/ubuntu/workspace/post.php:8

3 个答案:

答案 0 :(得分:2)

主要和最糟糕的问题query()方法。这使得您对SQL注入持开放态度,这基本上没有意义,与PDO::query()已完成的工作完全相同。

这是应该如何:

public function query($sql, $data = [])
{
    $query = $this -> instance -> prepare($sql);
    $query -> execute($data);
    return $query;
}

通过这种方式,您还可以在查询中使用预处理语句,从而保护您的代码免受SQL注入。

我的课程还有其他问题,我在文章Your first database wrapper's childhood diseases中解释过,这绝对值得为您阅读。

答案 1 :(得分:1)

这是固定/工作代码:

private static $host = "localhost";
private static $db_name = "c9";
private static $username = "theandrewilliam";
private static $password = "";
private static $socket = "mysql";

//Instance of class
private $instance = NULL;

//Connection to Database (predefined function)
public function __construct() {

    if ($this -> instance == NULL) {
        try {

            $db = new PDO(self::$socket . ':' . 'host' . '=' . self::$host . ';' . 'dbname' . '=' . self::$db_name, self::$username, self::$password);

            $this -> instance = $db;

        } catch(PDOException $e) {

            die($e -> getMessage());

        }
    }

}

//Queries
public function query($sql) {

    $query = $this -> instance -> prepare($sql);
    $query -> execute();

    return $query;

}

}

$data = new Database();

$sql = 'SELECT * FROM body';

$result = $data -> query($sql);

while ($row = $result ->fetch(PDO::FETCH_ASSOC)) {

$body = $row['text'];
echo $body;

}

U&#39; r错误是在调用PDO准备声明时:

 $query = $this -> instance = prepare($sql); 

而不是=你需要把 - &gt; !

$query = $this -> instance -> prepare($sql);

第二个就在你的while循环中     while($ row = $ result - &gt; $ query - &gt; fetch(PDO :: FETCH_ASSOC))

$ result已经获得了查询($ sql),因此无需调用 - &gt; $ query只需添加

while ($row = $result ->fetch(PDO::FETCH_ASSOC))

答案 2 :(得分:1)

方法fetch()由PDOStatement(此处为$ result)使用。 所以你应该删除$ query。

while($row = $result -> fetch(PDO::FETCH_ASSOC)){

    $body = $row['id'];
    echo $body;

}

https://secure.php.net/manual/en/pdostatement.fetch.php

编辑:使用prepare方法时有一些拼写错误,应该是:

$query = $this -> instance -> prepare($sql);