到目前为止,这是我们的课程:
class DB {
private $DBUser = 'xxx';
private $DBPass = 'xxx';
private $DBServer = 'xxx';
private $DBName = 'xxx';
public $sql;
public $id;
public function __construct($sql,$id){
$this->sql = $sql;
$this->id = $id;
} //end variables
public function select() {
try {
$strDSN = "mysql:host=$this->DBServer;dbname=$this->DBName;";
$username = $this->DBUser;
$pass = $this->DBPass;
$conn = new PDO($strDSN, $username, $pass);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
/*return $conn;*/
$stmt = $conn->prepare($this->sql);
$id = $this->id;
$stmt->execute(array('id'=>$id));
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
return $result;
}
catch (PDOException $e) {
echo 'Error: ' . $e->getMessage();
}
} //end method
} //end class
我们用它来称呼它:
$db = new DB;
$result = $db->select('SELECT * FROM tbl_xxx WHERE myid = :id',$_GET['id']);
但我收到以下错误:
警告:缺少DB :: __ construct()的参数1警告:缺少 DB :: __ construct()
的参数2
我确定答案很简单,但我看不清楚。我在这里想念的是什么?
答案 0 :(得分:0)
我通常像
那样扩展PDO类class DB extends PDO {...}
然后确保构造函数使用连接字符串调用父(PDO)。但是,一旦我需要使用单独的功能连接到数据库。这样做:
// Establish the connection.
try {
$this->str="";
switch ($this->proto){
case "mysql":
$this->str = "mysql:host=$this->host;dbname=$this->db";
break;
default:
throw new PDOException("Wrong protocol '$proto'");
}
parent::__construct($this->str,
$this->user, $this->pw,$opts);
}catch (PDOException $e) {
$this->last_error = $e->getMessage();
error_log($e->getMessage());
return false;
}
另外,请确保每次选择时都不连接!因此,您可能需要单独使用select
和connect
函数。最后,代替select
,delete
等函数,我通常会创建一个泛型/基础(但有点不安全)的成员,它将返回任何查询结果:
public function send_query($query){
$result = $this->query($query);
if ($result === false){
$this->last_error = $this->errorInfo();
return false;
}
$ret = $result->fetchAll();
$result->closeCursor();
return $ret;
}
以上是“不安全”,因为$query
字符串中的任何内容都将在数据库上运行。包装函数应确保正确转义字符串并且不包含恶意代码。我建议您为所有查询使用预准备语句,但上述方法应该按照您的要求进行。