【发布时间】:2020-09-24 20:13:36
【问题描述】:
我非常努力地使用类内部的准备、绑定和执行来创建此方法。但我想我对它没有足够的了解,无论我做什么,我都无法让它发挥作用。我在谷歌上找了几个小时。我知道下面的代码关于绑定是错误的,但是有人可以告诉我在此方法中进行绑定的正确方法吗?
class User {
protected static $db_table = "users";
protected static $db_table_fields = array('username', 'password', 'first_name', 'last_name');
public $id;
public $username;
public $password;
public $first_name;
public $last_name;
protected function properties() {
$properties = array();
foreach (static::$db_table_fields as $db_field) {
if (property_exists($this, $db_field)) {
$properties[$db_field] = $this->$db_field;
}
}
return $properties;
}
protected function clean_properties() {
global $database;
$clean_properties = array();
foreach ($this->properties() as $key => $value) {
$clean_properties[$key] = $value;
}
return $clean_properties;
}
public function create($params= []){
global $database;
$properties = $this->clean_properties();
$fields = ":" . implode("',:'", static::$db_table_fields);
$sql= "INSERT INTO " .static::$db_table . "(" . implode(",", array_keys($properties)) . ")
VALUES('". $fields ."')";
$stmt = $database->prepare($sql);
foreach ($fields as $field => &$params) {
$stmt->bindValue($field, $params);
}
if ($stmt->execute()) {
$this->id = $database->InsertId();
return true;
} else {
return false;
}
}
【问题讨论】:
-
而不是绑定 - 你试过
if ($stmt->execute($fields)) { -
@NigelRen 如果我只是在执行中传递 $fields,我将如何通过 $params=[ ] ?
-
如果您使用的是
bindValue,则无需在foreach中使用&。 -
foreach ($fields as $field => &$params)没有意义。$fields是字符串,不是数组。 -
而
$params是函数参数,你为什么要用它作为迭代变量?