Iam试图在PHP中创建基于OOP的论坛,并且目前正在致力于制作Database类。特别是Iam坚持为Datatable类(使用PDO btw)制作“通用”插入类函数。在制作数据库插入类功能时遇到困难
class DB
{
private $dbconn;
public function __construct(){
}
protected function connect($dbname, $dbhost='127.0.0.1', $dbuser='root', $dbpass=''){
try{
$this->dbconn = new PDO("mysql:host=$dbhost;dbname=$dbname;", $dbuser, $dbpass, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'UTF8'"));
}
catch(PDOException $e){
echo 'Connection failed: '.$e->getMessage()."<br />";
}
}
protected function disconnect(){
$this->dbconn = null;
}
public function insert($dbname,){
$this->connect($dbname);
try{
# prepare
$sql = "INSERT INTO pdodemotable (firstname, lastname, age, reg_date)
VALUES (?, ?, ?, now())";
$stmt = $dbconn->prepare($sql);
# the data we want to insert
$data = array($firstname, $lastname, $age);
# execute width array-parameter
$stmt->execute($data);
echo "New record created successfully";
}
catch(PDOException $e){
echo $sql . "<br>" . $e->getMessage();
}
}
}
插入功能就像你看到的未完成。我不知道如何让插入函数适应任何数量的参数,任何数量的数据库列和任何表。现在函数中的代码取自我使用过程编程的其他项目之一。它第一次使用数据库的OOP。
我是OOP和PDO的新手。必须有某种方法或功能可以帮助我弥补失踪。我现在看到的唯一解决方案是使用一个ridicoulus数量的字符串处理,如果语句...它不能是最好的解决方案...必须有一个更简单的方法...
[此代码本质上容易受到SQL注入的攻击。](https://phpdelusions.net/pdo/lame_update) –
@YourCommonSense如果数据中的$ keys是来自用户,那么它很脆弱,就像我们执行'$ db-> insert('mytable',$ _POST)'并将整个$ _POST'数组作为数据传递,对吧?但是,如果我们执行'$ db-> insert('mytable',array('first'=> $ _ POST ['first']))'',那么它应该可以。这里唯一能做的就是引用?我们可以为表名和键添加$ this-> dbconn-> quote()来使其安全吗? –
不,我们不能使用字符串引用标识符,它会导致语法错误。至少您必须格式化标识符,但最好将其列入白名单。 –