我正在尝试将类属性动态添加到PDO预处理语句中。为了实现这一点,我需要创建一个数组,它将从类中获取属性,将它们放在一个数组中,并在每个键的开头添加:。然后,用逗号分隔每个键。我最接近实现这一点的是:
foreach ($property as $field)
$propertyValues = implode(", :", array_keys($property));
return $propertyValues;
}
给了我 用户名,密码
我只需要一种方法来添加:到第一个键,在这种情况下是用户名。所以它看起来像
:用户名,:密码
但请记住,我正在尝试使其动态化,以便我可以将其功能扩展到其他类,而且我并不总是知道第一个数组键是什么。
如果您有兴趣阅读整个班级,请点击此处:
<?php
require_once("../config/main.php");
class Database{
protected static $dbFields = array('username', 'password');
public $dbConnection;
public $tableName = 'users';
public $id;
public $username;
public $password;
public function __construct() {
$this->connect();
}
public function connect(){
try {
$this->dbConnection = new PDO("mysql:host=".DB_SERVER."; dbname=".DB_NAME, DB_USER, DB_PASS);
} catch (PDOException $e) {
echo 'Connection failed: ' . $e->getMessage();
}
}
public function properties() {
$properties = array();
foreach (self::$dbFields as $field) {
if (isset($this->field) || property_exists($this, $field)) {
$properties[$field] = $this->$field;
}
}
return $properties;
}
public function property_values() {
$property = $this->properties();
$propertyValues = implode(", :", array_keys($property));
return $propertyValues;
}
public function insert(){
// this is where all the is going to happen. it's a work in progress
// $sql = "INSERT INTO". $this->tableName. " (";
// $sql .= implode(", ",array_keys($this->properties()));
// $sql .= ")VALUES(". ;
// $q = $this->db->prepare($sql);
// $q->execute(array('John', 'hula'));
}
}
$database = new Database();
$vals = $database->property_values();
print_r($vals);
?>
答案 0 :(得分:5)
$propertyValues = ':'. implode(", :", array_keys($property));
答案 1 :(得分:2)
要获得第一个数组键,您可以使用万无一失:
reset($array);
$firstkey = key($array);
由于您还需要值(无法更改密钥,只能取消设置旧密钥并设置新密码),您可以使用:
$value = reset($array);
$firstkey = key($array);
unset($array[$firstkey]);
$array[':'.$firstkey] = $value;
这不是最干净的方法。正如经常发生的那样,当事实上有更清洁的方法时,你已经开始专注于调整“你的”工作方法。
一种方法:
$keys = array_map(function($key) { return ':'.$key; }, array_keys($property));
$property = array_combine($keys, $property);
现在所有属性名称都添加了':'
。
另一种方法是手动添加':'; webbiedave打败了我。