আপনার উদ্বেগের উত্তর দিতে:
মাইএসকিউএল> = 5.1.17 (বা> PREPARE
এবং EXECUTE
বিবৃতিগুলির জন্য = 5.1.21 ) কোয়েরি ক্যাশে প্রস্তুত বিবৃতি ব্যবহার করতে পারে । সুতরাং আপনার মাইএসকিউএল + পিএইচপি এর সংস্করণ ক্যোয়ারী ক্যাশে সহ প্রস্তুত বিবৃতি ব্যবহার করতে পারে। যাইহোক, মাইএসকিউএল ডকুমেন্টেশনে ক্যোয়ারী ক্যোয়ারী ফলাফলের জন্য সতর্কতার সাথে সাবধান নোট করুন। এমন অনেক ধরণের প্রশ্ন রয়েছে যা ক্যাশে করা যায় না বা যা ক্যাশে হওয়া সত্ত্বেও অকেজো। আমার অভিজ্ঞতায় ক্যোয়ারী ক্যাশে প্রায়শই যেহেতু খুব বড় জয় নয়। ক্যাশে সর্বাধিক ব্যবহার করতে ক্যোয়ারী এবং স্কিমার বিশেষ নির্মাণ প্রয়োজন need প্রায়শই অ্যাপ্লিকেশন-স্তরের ক্যাচিং দীর্ঘমেয়াদে যাহাই হউক না কেন প্রয়োজনীয় হয়ে যায়।
নেটিভ প্রস্তুতি সুরক্ষার জন্য কোনও পার্থক্য করে না। সিউডো-তৈরি বিবৃতিগুলি এখনও ক্যোয়ারী প্যারামিটার মানগুলি থেকে মুক্তি পাবে, এটি বাইনারি প্রোটোকল ব্যবহার করে মাইএসকিউএল সার্ভারের পরিবর্তে স্ট্রিং সহ PDO লাইব্রেরিতে করা হবে। অন্য কথায়, একই EMULATE_PREPARES
সেটিং পিডিও কোড আপনার সেটিং নির্বিশেষে ইনজেকশন আক্রমণগুলিতে সমান দুর্বল (বা না-দুর্বল) হয়ে উঠবে । কেবলমাত্র পার্থক্যটি যেখানে প্যারামিটার প্রতিস্থাপন ঘটে - EMULATE_PREPARES
এটি PDO লাইব্রেরিতে ঘটে; ছাড়া EMULATE_PREPARES
, এটি মাইএসকিউএল সার্ভারে ঘটে।
ছাড়া EMULATE_PREPARES
আপনি প্রস্তুত হওয়ার পরেই বদলে চালানো-সময়ে সিনট্যাক্স ত্রুটি পেতে পারে; আপনার সাথে EMULATE_PREPARES
কেবল মৃত্যুদণ্ড কার্যকর করার সময় সিনট্যাক্স ত্রুটিগুলি পাবেন কারণ পিডিওর কাছে এক্সপ্লোরের সময় পর্যন্ত মাইএসকিউএলকে দেওয়ার কোনও প্রশ্ন নেই। মনে রাখবেন যে, এই কোড তোমাকে লিখব প্রভাবিত ! বিশেষত যদি আপনি ব্যবহার করছেন PDO::ERRMODE_EXCEPTION
!
একটি অতিরিক্ত বিবেচনা:
- একটি
prepare()
(দেশীয় প্রস্তুত বিবৃতি ব্যবহার করে) এর জন্য একটি নির্ধারিত ব্যয় রয়েছে , সুতরাং prepare();execute()
দেশীয় প্রস্তুত বিবৃতি সহ একটি অনুকরণযুক্ত প্রস্তুত বিবৃতি ব্যবহার করে একটি সাধারণ পাঠ্য কোয়েরি জারি করার চেয়ে কিছুটা ধীর হতে পারে। অনেকগুলি ডাটাবেস সিস্টেমে একটিটির জন্য ক্যোয়ারী প্ল্যানটি prepare()
ক্যাশে করা হয় এবং একাধিক সংযোগের সাথে ভাগ করা যেতে পারে, তবে আমার মাইএসকিউএল এটি করে বলে মনে হয় না। সুতরাং আপনি যদি একাধিক প্রশ্নের জন্য আপনার প্রস্তুত বিবৃতি অবজেক্টটিকে পুনরায় ব্যবহার না করেন তবে আপনার সামগ্রিক সম্পাদনটি ধীর হতে পারে।
চূড়ান্ত প্রস্তাবনা হিসাবে , আমি মাইএসকিউএল + পিএইচপি এর পুরানো সংস্করণগুলি সহ মনে করি আপনার প্রস্তুত বিবৃতিগুলি অনুকরণ করা উচিত তবে আপনার অতি সাম্প্রতিক সংস্করণগুলির সাথে আপনার অনুকরণ বন্ধ করা উচিত।
PDO ব্যবহার করে এমন কয়েকটি অ্যাপ্লিকেশন লেখার পরে, আমি একটি PDO সংযোগ ফাংশন তৈরি করেছি যা আমার মনে হয় যা সেরা সেটিংস। আপনার সম্ভবত এই জাতীয় কিছু ব্যবহার করা উচিত বা আপনার পছন্দসই সেটিংসে টুইট করা উচিত:
/**
* Return PDO handle for a MySQL connection using supplied settings
*
* Tries to do the right thing with different php and mysql versions.
*
* @param array $settings with keys: host, port, unix_socket, dbname, charset, user, pass. Some may be omitted or NULL.
* @return PDO
* @author Francis Avila
*/
function connect_PDO($settings)
{
$emulate_prepares_below_version = '5.1.17';
$dsndefaults = array_fill_keys(array('host', 'port', 'unix_socket', 'dbname', 'charset'), null);
$dsnarr = array_intersect_key($settings, $dsndefaults);
$dsnarr += $dsndefaults;
// connection options I like
$options = array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
);
// connection charset handling for old php versions
if ($dsnarr['charset'] and version_compare(PHP_VERSION, '5.3.6', '<')) {
$options[PDO::MYSQL_ATTR_INIT_COMMAND] = 'SET NAMES '.$dsnarr['charset'];
}
$dsnpairs = array();
foreach ($dsnarr as $k => $v) {
if ($v===null) continue;
$dsnpairs[] = "{$k}={$v}";
}
$dsn = 'mysql:'.implode(';', $dsnpairs);
$dbh = new PDO($dsn, $settings['user'], $settings['pass'], $options);
// Set prepared statement emulation depending on server version
$serverversion = $dbh->getAttribute(PDO::ATTR_SERVER_VERSION);
$emulate_prepares = (version_compare($serverversion, $emulate_prepares_below_version, '<'));
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, $emulate_prepares);
return $dbh;
}