Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在OOP-php中实现可重用的SELECT方法_Php_Mysql_Sql_Class_Oop - Fatal编程技术网

如何在OOP-php中实现可重用的SELECT方法

如何在OOP-php中实现可重用的SELECT方法,php,mysql,sql,class,oop,Php,Mysql,Sql,Class,Oop,我是新来的,我对php和OOP也很陌生,所以如果我问的问题不对,也请告诉我;p 我试图创建一个类来处理从数据库到数据库的所有查询。我想使这个类尽可能可重用,这样我就不必在所有方法和函数中不断编写selects和insert语句 我的问题是:是否可以调用带有参数的方法,然后让这些参数为我完成查询 这就是我到目前为止的想法: 数据库连接类: 这是我的查询类: 这就是我对参数的意思,例如: 执行查询时出现语法错误。我建议您打印出$sql,然后尝试查询并在类似于Mysql的IDE工作台上执行它,这样您就

我是新来的,我对php和OOP也很陌生,所以如果我问的问题不对,也请告诉我;p

我试图创建一个类来处理从数据库到数据库的所有查询。我想使这个类尽可能可重用,这样我就不必在所有方法和函数中不断编写selects和insert语句

我的问题是:是否可以调用带有参数的方法,然后让这些参数为我完成查询

这就是我到目前为止的想法:

数据库连接类:

这是我的查询类:

这就是我对参数的意思,例如:


执行查询时出现语法错误。我建议您打印出
$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