我对PDO对象有点新意,我只是尝试建立与数据库的连接并返回mySQL查询。我已经搜索了互联网(包括这个网站),试图找到解决方案。我找到了许多类似的解决方案,但没有任何工作。我知道这可能是一个非常简单的修复,但我似乎无法找到它。
提前感谢您的帮助!
<?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;
}
}
<?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
答案 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);