رتبه موضوع:
  • 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
prepare statement
#1
در پروژه ی ablog برای ساخت کوئری insert با متد Prepared statements
به روش
INSERT INTO `categories` ( title, urlkey, active ) VALUES ( ?, ?, ? )
این ارور رو میده
نقل قول:
Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: parameter was not defined
وقتی هم از
INSERT INTO `categories` ( title, urlkey, active ) VALUES (:title, :urlkey, :active)
استفاده می کنم همه مقادیر جدول رو با 1 پر میکنه
تابع کوئری
public function query($query, $params = [])
    {
       $stmt = $this->con->prepare($query);
       foreach($params as $key => $value){
           $stmt->bindparam($key, $value);
       }
       $stmt->execute();
       return $stmt;
   }

تابع ساخت کوئری insert
public function insert($params)
    {
       $result = "INSERT INTO `{$this->tableName}` (";
       foreach($params as $key => $value){
           $result .= ' ' . $key .',';
       }
       $result = substr($result, 0, -1) . " ) VALUES (";
       foreach($params as $key => $value){
           $result .= ' ?,';
       }
       $result = substr($result, 0, -1) . " )";
       return $result;
   }

تابع insert در کلاس Categories
public static function insert($params = [])
    {
       $dal = new DAL(self::$tableName);
       $query = $dal->insert($params);
       $result = $dal->query($query, $params);
       return $result;
   }

محل استفاده
Categories::insert(['title' => $_POST['categoryName'], 'urlkey' => $_POST['urlKey'], 'active' => $_POST['activation']]
پاسخ
تشکر شده توسط:
#2
اگه دقیقاً طبق فیلم آموزشی کار کرده باشین نباید مشکلی پیش بیاد. یکبار دیگه به‌دقت کارهایی که توی فیلم انجام شده رو بررسی کنید. توی پکیج آموزشی، کار اضافه‌ای انجام نشده.
پاسخ
تشکر شده توسط:
#3
توی فیلم شما فقط کوئری select رو کار کردین و اونم از روش prepare استفاده نکردین و بقیه رو به عنوان تمرین به دانشجوها سپردین.
کوئری select که توی پکیج کار شده:
public function select($params, $limit = null, $order = 'id') {
        $result = 'SELECT * FROM '. $this->tableName .' WHERE (1=1';
       foreach($params as $key => $value){
           if(is_null($value))
           {
               $result .= ' AND `'. $key .'` IS NULL';
           }else
           {
               $result .= ' AND `'. $key .'`='. $this->con->quote($value);
           }
       }
       $result .= ') ORDER BY '. $order;
       if(!is_null($limit)){
           $result .= ' LIMIT '. intval($limit);
       }
       return $result;
   }
پاسخ
تشکر شده توسط:
#4
تابع اجرای کوئری:
public function query($query, $params = [])
{
    $stmt = $this->con->prepare($query);
    $stmt->execute($params);
    return $stmt;
}

تابع insert :
public function insert($params)
{
    $result = "INSERT INTO `{$this->tableName}` (";
    foreach($params as $key => $value){
        $result .= ' ' . $key .',';
    }
    $result = substr($result, 0, -1) . " ) VALUES (";
    foreach($params as $key => $value){
        $result .= ' :' . $key . ',';
    }
    $result = substr($result, 0, -1) . " )";
    return $result;
}

اینها رو تست کنید ببینید درست میشه؟
پاسخ
تشکر شده توسط: smrh68
#5
سپاس فراوان از پاسختون
فقط یه سوال اینکه اون bindParam که حذف شد میشه یه توضیح کوتاه بدین کارش دقیقا چیه کاربردش کجاس چرا نباید اینجا مورد استفاده قرار میگرفت و چرا وقتی استفاده میشد همه مقادیر رو با 1 پر میکرد!؟
پاسخ
تشکر شده توسط:
#6
معمولاً جاهایی که بخواین یکسری محاسبات و... انجام بدین ازش استفاده میکنین. در حالتهای عادی و سریع میتونین پارامترها رو مستقیماً به خود Execute بدین.
پاسخ
تشکر شده توسط:




کاربران در حال بازدید این موضوع: 1 مهمان