💻 آخرین فرصت یادگیری برنامه‌نویسی با آفر ویژه قبل از افزایش قیمت در ۵ آذر ماه (🎁 به همراه یک هدیه ارزشمند )
۰ ثانیه
۰ دقیقه
۰ ساعت
۱ محمدرضا
نحوه ایجاد کوئری 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']);
بهترین پاسخ
مهرداد سامی ۲۱ آذر ۱۳۹۹، ۱۴:۰۶