سلام دوستان. کد زیر قسمت متود کوئری زدن در یک کلاس کار با دیتابیس به صورت PDO هستش.
که به دو روش زیر میشه کوئری زد:
در حالت کلی مشکلی نداره، ولی من خواستم یک String خیلی طولانی رو با این متود توی دیتابیس ذخیره کنم که 3 اررور زیر رو میداد! در حالی که همون string رو بعدش با Mysqli معمولی تست کردم و مشکلی نبود! یعنی مشکل از حداکثر سایز ارسالی به mysql یا type فیلد جدول و ... نیست.
کجای این کد متود کلاس مشکل داره؟
سوال دوم: از لحاظ امنیت، کدهای این متود درسته؟
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | 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; } } |
که به دو روش زیر میشه کوئری زد:
1 2 3 | ///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); |
1 2 3 | ///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 ****