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

نسخه‌ی کامل: مشکل در کوئری با PDO
شما در حال مشاهده نسخه آرشیو هستید. برای مشاهده نسخه کامل کلیک کنید.
سلام دوستان. کد زیر قسمت متود کوئری زدن در یک کلاس کار با دیتابیس به صورت 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 ****
پی نوشت: دوستان الان دوباره با mysqli امتحان کردم و اررور داد! به نظر طول string خیلی زیاده! برای رفع این مشکل باید چه کار کنم؟

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

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