سلام وقت بخیر
یه ابهامی برام پیش اومده
ما برای اجرای یک کوئری Update داشتیم:
$sql = "UPDATE users SET name=?, surname=?, sex=? WHERE id=?";
$stmt= $pdo->prepare($sql);
$stmt->execute([$name, $surname, $sex, $id]);
جایی که قراره دیتا از ورودی جاگذاری بشه یک ‘?’ (place holder) قرار میدادیم، بعد از طریق متد execute مقادیر را به ترتیب پاس میدادیم.
شما توسط متد where شرط ?=id را ایجاد کردید، ولی داخل متد update که باید fields هامون رو هم به صورت ?=name و غیره ایجاد میکردیم، داخل حلقه foreach نوشتید:
public function update(array $data)
{
$fields = [];
foreach ($data as $column => $value) {
$fields[] = "{$column} = '{$value}'";
}
$fields = implode(', ', $fields);
$conditions = implode(' AND ', $this->conditions);
$sql = "UPDATE {$this->table} SET {$fields} WHERE {$conditions}";
$stmt = $this->connection->prepare($sql);
$stmt->execute($this->values); // only conditions
return $stmt->rowCount();
}
یعنی همینجا مقادیر را بهش پاس دادید، سپس داخل execute فقط مقادیر conditions را پاس دادید.
بهتر نبود که اینجوری مینوشتیم:
public function update(array $data)
{
$fields = [];
foreach ($data as $column => $value) {
$fields[] = "{$column} = ?";
}
$fields = implode(', ', $fields);
$conditions = implode(' AND ', $this->conditions);
$sql = "UPDATE {$this->table} SET {$fields} WHERE {$conditions}";
$stmt = $this->connection->prepare($sql);
$stmt->execute( array_merge( array_values($data), $this->values ) ); // fields and conditions
return $stmt->rowCount();
}
ایجوری دقیقا ما کوئری update را ایجاد کردیم و مقداردهی کردیم.
ممنون