У меня проблемы с поиском хорошей документации по инструкциям, подготовленным для pdo, и еще больше проблем с поиском документации по динамическому обновлению базы данных с помощью операторов, подготовленных pdo. Моя динамическая вставка работает, но у меня проблемы с обновлением. Я получаю ошибку:
Предупреждение: PDOStatement :: execute () [pdostatement.execute]:
SQLSTATE [HY093]: недопустимый номер параметра: параметр не был определен
в
/Users/scottmcpherson/Sites/phpsites/projectx/application/models/db.php
на линии 91 ошибка
Вот класс, который я создал, за исключением нескольких методов, которые не имеют отношения к этой проблеме:
<?php
require_once("../config/main.php");
class Database{
protected static $dbFields = array('username', 'password');
public $db;
public $tableName = 'users';
public $id = 1;
public $username = "Jonny";
public $password = "Appleseed";
public function __construct() {
$this->connect();
}
public function connect(){
try {
$this->db = 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 propertyValues() {
$property = $this->properties();
$propertyValues = array();
foreach ($property as $key => $value) {
$propertyValues = ":" . implode(", :", array_keys($property));
}
return $propertyValues;
}
public function polishedVals(){
// The end result of this function is:
// username=:username, password=:password
$props = $this->properties();
$phaseOne = array();
foreach ($props as $key => $value) {
$phaseOne[$key] = ":".$key;
}
$phaseTwo = array();
foreach ($phaseOne as $key => $value) {
$phaseTwo[] = "{$key}={$value}";
}
$polishedVals = implode(", ", $phaseTwo);
return $polishedVals;
}
public function update(){
$stmt = "UPDATE ". $this->tableName." SET ";
$stmt .= $this->polishedVals();
$stmt .= "WHERE id=" . $this->id;
$stmt = $this->db->prepare($stmt);
if($stmt->execute($this->properties())) {
echo "yes";
} else {
echo "error ";
}
}
}
$database = new Database();
echo$database->update();
?>
Если все переменные заменить действительными значениями, результат, которого я добиваюсь методом update (), будет выглядеть следующим образом:
public function update(){
$stmt = "UPDATE users SET ";
$stmt .= "username=:username, password=:password ";
$stmt .= "WHERE id=1";
$stmt = $this->db->prepare($stmt);
if($stmt->execute($this->properties())) {
echo "yes";
} else {
echo "error ";
}
}
В дополнение к обнаружению этой проблемы, пожалуйста, дайте мне знать, если вы видите какие-либо другие проблемы с этим кодом. Я все еще новичок в PHP.
Редактировать: Теперь я создал новый метод, который добавляет: в начало каждого ключа в массиве свойств:
public function colProperties(){
$properties = $this->properties();
$withCols = array();
foreach($properties as $key => $value){
$withCols[":".$key] = $value;
}
return $withCols;
}
Итак, мой метод update () теперь выглядит так:
публичная функция update () {
$stmt = "UPDATE ". $this->tableName." SET ";
$stmt .= $this->polishedVals();
$stmt .= "WHERE id=" . $this->id;
$stmt = $this->db->prepare($stmt);
if($stmt->execute($this->colProperties())) {
echo "yes";
} else {
echo "error ";
}
}
и если я var_dump ($ this-> colProperties), я получаю:
array (2) {[": username"] => string (5) "Jonny" [": password"] => string (9) "Appleseed"}
И все равно получаю ту же ошибку.