تالار گفتمان nCIS.ir

نسخه‌ی کامل: prepare statement
شما در حال مشاهده نسخه آرشیو هستید. برای مشاهده نسخه کامل کلیک کنید.
در پروژه ی 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']]
اگه دقیقاً طبق فیلم آموزشی کار کرده باشین نباید مشکلی پیش بیاد. یکبار دیگه به‌دقت کارهایی که توی فیلم انجام شده رو بررسی کنید. توی پکیج آموزشی، کار اضافه‌ای انجام نشده.
توی فیلم شما فقط کوئری 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;
   }
تابع اجرای کوئری:
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;
}

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