سلام دوستان. کد زیر قسمت متود کوئری زدن در یک کلاس کار با دیتابیس به صورت PDO هستش.
که به دو روش زیر میشه کوئری زد:
در حالت کلی مشکلی نداره، ولی من خواستم یک String خیلی طولانی رو با این متود توی دیتابیس ذخیره کنم که 3 اررور زیر رو میداد! در حالی که همون string رو بعدش با Mysqli معمولی تست کردم و مشکلی نبود! یعنی مشکل از حداکثر سایز ارسالی به mysql یا type فیلد جدول و ... نیست.
کجای این کد متود کلاس مشکل داره؟
سوال دوم: از لحاظ امنیت، کدهای این متود درسته؟
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 ****