如何在OOP-php中实现可重用的SELECT方法
我是新来的,我对php和OOP也很陌生,所以如果我问的问题不对,也请告诉我;p 我试图创建一个类来处理从数据库到数据库的所有查询。我想使这个类尽可能可重用,这样我就不必在所有方法和函数中不断编写selects和insert语句 我的问题是:是否可以调用带有参数的方法,然后让这些参数为我完成查询 这就是我到目前为止的想法: 数据库连接类: 这是我的查询类: 这就是我对参数的意思,例如:如何在OOP-php中实现可重用的SELECT方法,php,mysql,sql,class,oop,Php,Mysql,Sql,Class,Oop,我是新来的,我对php和OOP也很陌生,所以如果我问的问题不对,也请告诉我;p 我试图创建一个类来处理从数据库到数据库的所有查询。我想使这个类尽可能可重用,这样我就不必在所有方法和函数中不断编写selects和insert语句 我的问题是:是否可以调用带有参数的方法,然后让这些参数为我完成查询 这就是我到目前为止的想法: 数据库连接类: 这是我的查询类: 这就是我对参数的意思,例如: 执行查询时出现语法错误。我建议您打印出$sql,然后尝试查询并在类似于Mysql的IDE工作台上执行它,这样您就
执行查询时出现语法错误。我建议您打印出
$sql
,然后尝试查询并在类似于Mysql的IDE工作台上执行它,这样您就可以看到查询中的错误。因此,我打印了sql,它是这样说的:插入联系人表单消息(u\u id、姓名、电子邮件、主题、消息、日期)值(,Kees,Kees@gmail.com,测试,Hopelijk werkt hij,)我仍然没有真正弄错什么。谢谢你的提示!首先,你试图插入的字段和你拥有的值之间不匹配。其次,你必须在字符串周围添加引号,
。因此你的查询应该类似于插入联系人表单消息(u_id、名称、电子邮件、主题、消息、日期)值(null,“Kees”Kees@gmail.com“,“Test”,“blahblah”,“2020-01-01”);
您还应该避免SQL注入。您缺少u_id
和date
的值,并且字符串值周围没有引号。但是您应该使用带有bindValue()的预处理语句
而不是将变量替换到SQL中。
class Database {
private $host;
private $user;
private $pass;
private $dbname;
private $charset;
public function connect() {
$this->host = 'localhost:3306';
$this->user = 'root';
$this->pass = '';
$this->dbname = 'Testdb';
$this->charset = 'utf8mb4';
try {
$dsn = 'mysql:host='.$this->host.';dbname='.$this->dbname.';charset='.$this->charset;
$pdo = new PDO($dsn, $this->user, $this->pass);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
return $pdo;
} catch (PDOException $e) {
echo "Connection failed:".$e->getMessage();
}
}
}
class QueryDatabase extends Database {
public function getData($tablename, $selector, $value) {
if (!isset($selector)){
echo 'Something went wrong!';
} else if ($selector == ''){
$stmt = $this->connect()->query("SELECT * FROM $tablename");
while ($row = $stmt->fetch()){
return $row;
}
}else {
$stmt = $this->connect()->query("SELECT * FROM $tablename where $selector = $value");
while ($row = $stmt->fetch()){
return $row;
}
}
}
public function setData($tablename, $colums, $data) {
if (!isset($tablename) or !isset($data)) {
echo 'Something went wrong!';
} else {
$sql = "INSERT INTO $tablename ($colums) VALUES ($data)";
$q = $this->connect()->prepare($sql);
$q->execute();
}
}
protected function addData() {
}
protected function delData() {
}
}
$test = new QueryDatabase;
$test->setData('contact_form_messages', 'u_id, name, email, subject, message, date', ' , Kees, Kees@gmail.com, Test, Hopefully it works, ');
i get this error message :
Fatal error: Uncaught PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064
You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ' Kees, Kees@gmail.com, Test, Hopelijk werkt hij, )' at line 1 in D:\webProjects\project\classes\querydatabase.class.php:31
Stack trace: #0 D:\webProjects\project\classes\querydatabase.class.php(31): PDOStatement->execute() #1 D:\webProjects\project\includes\header.inc.php(5):
QueryDatabase->setData('contact_form_me...', 'u_id, name, ema...', ' , Kees, Kees@g...') #2 D:\webProjects\project\contact.php(1): include('D:\\webProjects\\...') #3 {main} thrown in D:\webProjects\project\classes\querydatabase.class.php on line 31
if you have any suggestions i'd be happy to hear them!
thanks a lot!
Floris