رتبه موضوع:
  • 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
مشکل در کوئری با PDO
#1
سلام دوستان. کد زیر قسمت متود کوئری زدن در یک کلاس کار با دیتابیس به صورت PDO هستش.

 public function query_secure($sql_statement, $params, $fetch_rows=false, $unnamed=false, $delimiter="(*|||*)"){
 $this->err_msg = "";
 if(!isset($unnamed)) $unnamed = false;
 if(trim((string)$delimiter)==""){
 $this->err_msg = "Error: Delimiter are required.";
 return false;
 }
 if($this->con!=null){
 $obj = $this->con->prepare($sql_statement);
 if(!$unnamed){
                            $count_params = count($params);
 for($i=0;$i<$count_params;$i++){
 $params_split = explode($delimiter,$params[$i]);
 (trim($params_split[2])=="INT") ? $obj->bindParam($params_split[0], $params_split[1], PDO::PARAM_INT) : $obj->bindParam($params_split[0], $params_split[1], PDO::PARAM_STR);
 }
 try{
 $obj->execute();
 }catch(PDOException $e){
 $this->err_msg = "Error: ". $e->getMessage();
 return false;
 }
 }else{
 try{
 $obj->execute($params);
 }catch(PDOException $e){
 $this->err_msg = "Error: ". $e->getMessage();
 return false;
 }
 }
 if($fetch_rows)
 return $obj->fetchAll(PDO::FETCH_ASSOC);
 if(is_numeric($this->con->lastInsertId()))
 return $this->con->lastInsertId();
 return true;
 }else{
 $this->err_msg = "Error: Connection to database lost.";
 return false;
 }
 }

که به دو روش زیر میشه کوئری زد:

///Option 1: INSERT Row With "NAMED PLACEHOLDERS":
$params = array(":id(*|||*)2(*|||*)INT", ":name(*|||*)Amy Julyssa German(*|||*)STR", ":address(*|||*)Internet #996 Culiacan Sinaloa(*|||*)STR", ":company(*|||*)Nothing(*|||*)STR");
$result = $db->query_secure("INSERT INTO TB_USERS (ID,NAME,ADDRESS,COMPANY) VALUES(:id,:name,:address,:company);", $params, false, false);



///Option 2: INSERT Row With "UNNAMED PLACEHOLDERS":
$params = array(2, "Amy Julyssa German", "Internet #996 Culiacan Sinaloa", "Nothing");
$result = $db->query_secure("INSERT INTO TB_USERS (ID,NAME,ADDRESS,COMPANY) VALUES(?,?,?,?);", $params, false, true);



در حالت کلی مشکلی نداره، ولی من خواستم یک String خیلی طولانی رو با این متود توی دیتابیس ذخیره کنم که 3 اررور زیر رو میداد! در حالی که همون string رو بعدش با Mysqli معمولی تست کردم و مشکلی نبود! یعنی مشکل از حداکثر سایز ارسالی به mysql یا type فیلد جدول و ... نیست.
کجای این کد متود کلاس مشکل داره؟
سوال دوم: از لحاظ امنیت، کدهای این متود درسته؟

نقل قول:PDOStatement::execute(): send of 8192 bytes failed with errno=10053 An established connection was aborted by the software in your host machine.
نقل قول:PDOStatement::execute(): MySQL server has gone away *****
نقل قول:PDOStatement::execute(): Error reading result set's header ****
پاسخ
تشکر شده توسط:
#2
پی نوشت: دوستان الان دوباره با mysqli امتحان کردم و اررور داد! به نظر طول string خیلی زیاده! برای رفع این مشکل باید چه کار کنم؟

MySQL server has gone away
پاسخ
تشکر شده توسط:
#3
به پشتیبانی بگین تایم اوت اتصالهای MySQL رو بیشتر کنه. توی اینترنت کد خطای 10053 رو توی MySQL سرچ کنید زیاد درموردش بحث شده.
پاسخ
تشکر شده توسط: php
#4
(12-03-1394، 12:55 ب.ظ)ADMIN نوشته: به پشتیبانی بگین تایم اوت اتصالهای MySQL رو بیشتر کنه. توی اینترنت کد خطای 10053 رو توی MySQL سرچ کنید زیاد درموردش بحث شده.

پشتیبان نداره! دارم توی لوکال هاست اسکریپت مینویسم!
این دو خط کد رو هم اول اسکریپت گذاشتم ولی فایده نداشت:
        ini_set('mysql.connect_timeout', 300);
        ini_set('default_socket_timeout', 300);
پاسخ
تشکر شده توسط:




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