🔥 ۴۰ درصد تخفیف ثبت‌نام دوره‌ها قبل از افزایش قیمت‌ها
۰ ثانیه
۰ دقیقه
۰ ساعت
۱ بازور نامور
نحوه ایجاد کوئری Update در کلاس PDOQueryBuilder
مهندس وجیهه کاکاوند حل شده توسط مهندس وجیهه کاکاوند

سلام وقت بخیر

یه ابهامی برام پیش اومده

 

ما برای اجرای یک کوئری 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 را ایجاد کردیم و مقداردهی کردیم.

ممنون

سلام .. 

 

راه‌های زیادی هست برای انجام این مورد،‌ و راهی که شما هم استفاده کردید کاملا درست هست.

 

یکی از دلایلی که من این کار رو انجام دادم به این خاطر بود که در این حالت شما میتونید جای where و update رو عوض کنید .. در واقع امکان این موضوع وجود داره که شما به صورت زیر کوئری بزنید :‌

 

$this->builder->update(['name' => 'value'])->where(['name' => 'value']);
بهترین پاسخ
مهندس وجیهه کاکاوند ۲۱ آذر ۱۳۹۹، ۱۴:۰۶