পিডিও মাইএসকিউএল: পিডিও ব্যবহার করুন :: এটিটিআর_ইমুল_এইপিআরপিআরএস না?


117

আমি এখন পর্যন্ত এটি যা পড়েছি PDO::ATTR_EMULATE_PREPARES:

  1. মাইএসকিউএল এর নেটিভ রেডি ক্যোরি ক্যাশেকে বাইপাস করায় পারফরম্যান্সের জন্য পিডিওর রেডি এমুলেশন আরও ভাল
  2. মাইএসকিউএল এর নেটিভ প্রস্তুতি সুরক্ষার জন্য ভাল (এসকিউএল ইঞ্জেকশন প্রতিরোধ)
  3. মাইএসকিউএল এর নেটিভ প্রস্তুত ত্রুটি রিপোর্ট করার জন্য ভাল

আমি জানি না যে এই বিবৃতিগুলির মধ্যে আর কতটা সত্য। মাইএসকিউএল ইন্টারফেস চয়ন করার ক্ষেত্রে আমার সবচেয়ে বড় উদ্বেগ হ'ল এসকিউএল ইনজেকশন প্রতিরোধ করা। দ্বিতীয় উদ্বেগ কর্মক্ষমতা।

আমার অ্যাপ্লিকেশনটি বর্তমানে প্রসেসরিজাল মাইএসকিউএলি (প্রস্তুত বিবৃতি ছাড়াই) ব্যবহার করে এবং ক্যোয়ারী ক্যাশে বেশ খানিকটা ব্যবহার করে। এটি একটি অনুরোধে প্রস্তুত বিবৃতি খুব কমই পুনরায় ব্যবহার করবে। নামযুক্ত পরামিতি এবং প্রস্তুত বিবৃতিগুলির সুরক্ষার জন্য আমি পিডিওতে সরানো শুরু করেছি।

আমি ব্যবহার করছি MySQL 5.1.61এবংPHP 5.3.2

আমার কি PDO::ATTR_EMULATE_PREPARESসক্ষম হওয়া ছেড়ে দেওয়া উচিত ? ক্যোরির ক্যাশেটির পারফরম্যান্স এবং প্রস্তুত বিবৃতিগুলির সুরক্ষা উভয়ের কোনও উপায় আছে কি?


3
সত্যি বলতে? শুধু MySQLi ব্যবহার চালিয়ে যান keep যদি এটি ইতিমধ্যে এর অধীনে প্রস্তুত বিবৃতি ব্যবহার করে কাজ করে, পিডিও মূলত বিমূর্ততার একটি অর্থহীন স্তর। সম্পাদনা করুন : পিডিও সবুজ ক্ষেত্রের অ্যাপ্লিকেশনগুলির জন্য সত্যই দরকারী যেখানে আপনি নিশ্চিত নন যে কোন ডাটাবেসটি ব্যাক-এন্ডে চলেছে।
jmkeyes

1
দুঃখিত, আমার প্রশ্নটি আগে অস্পষ্ট ছিল। আমি এটি সম্পাদনা করেছি। অ্যাপ্লিকেশনটি এই মুহুর্তে মাইএসকিউলি তে প্রস্তুত বিবৃতি ব্যবহার করে না; শুধু mysqli_run_query ()। আমি যা পড়েছি তা থেকে, MySQLi বিবৃতি প্রস্তুত করেও ক্যোয়ারী ক্যাশে বাইপাস করে।
অ্যান্ড্রু এনসলে

উত্তর:


108

আপনার উদ্বেগের উত্তর দিতে:

  1. মাইএসকিউএল> = 5.1.17 (বা> PREPAREএবং EXECUTEবিবৃতিগুলির জন্য = 5.1.21 ) কোয়েরি ক্যাশে প্রস্তুত বিবৃতি ব্যবহার করতে পারে । সুতরাং আপনার মাইএসকিউএল + পিএইচপি এর সংস্করণ ক্যোয়ারী ক্যাশে সহ প্রস্তুত বিবৃতি ব্যবহার করতে পারে। যাইহোক, মাইএসকিউএল ডকুমেন্টেশনে ক্যোয়ারী ক্যোয়ারী ফলাফলের জন্য সতর্কতার সাথে সাবধান নোট করুন। এমন অনেক ধরণের প্রশ্ন রয়েছে যা ক্যাশে করা যায় না বা যা ক্যাশে হওয়া সত্ত্বেও অকেজো। আমার অভিজ্ঞতায় ক্যোয়ারী ক্যাশে প্রায়শই যেহেতু খুব বড় জয় নয়। ক্যাশে সর্বাধিক ব্যবহার করতে ক্যোয়ারী এবং স্কিমার বিশেষ নির্মাণ প্রয়োজন need প্রায়শই অ্যাপ্লিকেশন-স্তরের ক্যাচিং দীর্ঘমেয়াদে যাহাই হউক না কেন প্রয়োজনীয় হয়ে যায়।

  2. নেটিভ প্রস্তুতি সুরক্ষার জন্য কোনও পার্থক্য করে না। সিউডো-তৈরি বিবৃতিগুলি এখনও ক্যোয়ারী প্যারামিটার মানগুলি থেকে মুক্তি পাবে, এটি বাইনারি প্রোটোকল ব্যবহার করে মাইএসকিউএল সার্ভারের পরিবর্তে স্ট্রিং সহ PDO লাইব্রেরিতে করা হবে। অন্য কথায়, একই EMULATE_PREPARESসেটিং পিডিও কোড আপনার সেটিং নির্বিশেষে ইনজেকশন আক্রমণগুলিতে সমান দুর্বল (বা না-দুর্বল) হয়ে উঠবে । কেবলমাত্র পার্থক্যটি যেখানে প্যারামিটার প্রতিস্থাপন ঘটে - EMULATE_PREPARESএটি PDO লাইব্রেরিতে ঘটে; ছাড়া EMULATE_PREPARES, এটি মাইএসকিউএল সার্ভারে ঘটে।

  3. ছাড়া 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;
}

26
পুনরায় # 2: অবশ্যই মাইএসকিউএল প্যারামিটার হিসাবে প্রাপ্ত (মূল প্রস্তুতি বিবৃতিতে) এসকিউএল এর জন্য পার্সিং করে না ? সুতরাং পিডিওর প্রস্তুতকরণ অনুকরণ ব্যবহারের চেয়ে ইনজেকশনের ঝুঁকি অবশ্যই কম হবে , যেখানে পালানোর কোনও ত্রুটি (যেমন theতিহাসিক বিষয়গুলি mysql_real_escape_stringমাল্টি-বাইট অক্ষরের সাথে রয়েছে) এখনও ইনজেকশন আক্রমণে খোলা থাকবে?
উদ্বিগ্ন

2
@ ইজিগিয়াল, আপনি কীভাবে প্রস্তুত বিবৃতি কার্যকর করা হয় সে সম্পর্কে ধারণা তৈরি করছেন। PDO এর ইমুলেটেড প্রস্তুতির মধ্যে একটি বাগ থাকতে পারে পালানোর প্রস্তুতি নিতে পারে, তবে মাইএসকিউএলগুলিতেও বাগ থাকতে পারে। আফাইক, অনুকরণীয় প্রস্তুতির সাথে কোনও সমস্যা আবিষ্কার করা যায় নি যার ফলে প্যারামিটারের অক্ষরগুলি অনস্কেপডের মধ্য দিয়ে যেতে পারে।
ফ্রান্সিস অবিলা

2
দুর্দান্ত উত্তর, তবে আমার একটি প্রশ্ন আছে: আপনি যদি ইমুলেশনটি বন্ধ করেন, তাহলে মৃত্যুদন্ড কার্যকর হবে না? পিএইচপিকে বৈধতার জন্য প্রস্তুত বিবৃতিটি মাইএসকিউএলে প্রেরণ করতে হবে এবং কেবলমাত্র প্যারামিটারগুলি পাঠাতে হবে। সুতরাং, আপনি যদি প্রস্তুত বিবৃতিটি 5 বার ব্যবহার করেন, পিএইচপি মাইএসকিউএলের সাথে 6 বার (5 এর পরিবর্তে) কথা বলবে। এটি কি ধীর করে দেবে না? তদুপরি, আমি মনে করি
পিডিওতে

6
এই উত্তরে তৈরি পয়েন্টগুলি mysql_real_escape_stringহুডের নীচে ব্যবহার করে বিবৃতি ইমুলেশন প্রস্তুত করুন এবং ফলস্বরূপ দুর্বলতাগুলি দেখা দিতে পারে (খুব নির্দিষ্ট প্রান্তের ক্ষেত্রে)।
উদ্বিগ্ন

6
+1 ভাল উত্তর! তবে রেকর্ডের জন্য, আপনি যদি নেটিভ রেডি ব্যবহার করেন তবে মাইএসকিউএল সার্ভারের দিক থেকেও প্যারামিটারগুলি কখনই পালানো বা এসকিউএল কোয়েরিতে মিলিত হয় না। আপনি প্যারামিটারগুলি কার্যকর ও সরবরাহ করার সময়, ক্যোয়ারীটি পার্স করা হয়েছে এবং মাইএসকিউএলে অভ্যন্তরীণ ডেটা স্ট্রাকচারে রূপান্তরিত হয়েছে। এই মাইএসকিউএল অপ্টিমাইজার ইঞ্জিনিয়ারের দ্বারা এই ব্লগটি পড়ুন যা এই প্রক্রিয়াটি ব্যাখ্যা করে: guilhembichot.blogspot.com/2014/05/… আমি বলছি না এর অর্থ দেশীয় প্রস্তুতি আরও ভাল, যদিও আমরা পিডিও কোডকে সঠিকভাবে পালানোর জন্য বিশ্বাস করি (যা আমি না)।
বিল কারভিন

9

PDO::ATTR_EMULATE_PREPARESযখন আপনার পিএইচপি এর pdo_mysqlবিপরীতে সংকলন করা না থাকে তখন অক্ষম করা (দেশীয় প্রস্তুতি চালু করা) থেকে সাবধান হন mysqlnd

পুরানো libmysqlকিছু ফাংশনের সাথে পুরোপুরি সামঞ্জস্যপূর্ণ না হওয়ায় এটি অদ্ভুত ত্রুটি বাড়ে, উদাহরণস্বরূপ:

  1. বাঁধাইয়ের সময় PDO::PARAM_INTbit৪ বিট পূর্ণসংখ্যার জন্য সর্বাধিক উল্লেখযোগ্য বিট হারানো (0x12345678AB bit৪ বিট মেশিনে 0x345678AB এ কাটা হবে)
  2. সাধারণ ক্যোয়ারী তৈরি করতে অক্ষমতা LOCK TABLES(এটি SQLSTATE[HY000]: General error: 2030 This command is not supported in the prepared statement protocol yetব্যতিক্রম ছোঁড়ে )
  3. পরবর্তী ক্যোয়ারির আগে ফলাফল থেকে সমস্ত সারি আনতে হবে বা কার্সার বন্ধ করতে হবে (সহ mysqlndবা অনুকরণযুক্ত এটি স্বয়ংক্রিয়ভাবে এটি আপনার জন্য কাজ করে এবং মাইএসকিএল সার্ভারের সাথে সিঙ্কের বাইরে চলে না)

এই বাগগুলি আমি যখন আমার সার্ভারে মডিউলটির libmysqlজন্য ব্যবহৃত অন্য সার্ভারে স্থানান্তরিত করি তখন আমার সাধারণ প্রকল্পে খুঁজে পেতে পারি pdo_mysql। সম্ভবত আরও অনেক বাগ রয়েছে, আমি জানি না। এছাড়াও আমি তাজা bit৪ বিবিট ডেবিয়ান জেসিতে পরীক্ষা করেছিলাম, সমস্ত তালিকাভুক্ত বাগগুলি যখন হয় তখনই ঘটে apt-get install php5-mysqlএবং আমি যখন অদৃশ্য হয়ে যাই apt-get install php5-mysqlnd

কখন PDO::ATTR_EMULATE_PREPARESসত্য হিসাবে সেট করা হয় (ডিফল্ট হিসাবে) - এই বাগগুলি যেভাবেই ঘটবে না, কারণ পিডিও এই মোডে প্রস্তুত বিবৃতি ব্যবহার করে না। সুতরাং, যদি আপনি ("মাইকিকিএলএনডি" pdo_mysqlভিত্তিতে ব্যবহার করেন তবে libmysqlফিলিপিনফোতে বিভাগের "ক্লায়েন্ট এপিআই সংস্করণ" ফিল্ডে উপস্থিত না হয় pdo_mysql) - আপনার PDO::ATTR_EMULATE_PREPARESবন্ধ করা উচিত নয় ।


3
এই উদ্বেগ এখনও 2019 সালে বৈধ ?!
oldboy

8

আপনি 5.1 চালাচ্ছেন তাই আমি এমুলেট প্রিপারেশনগুলি বন্ধ করব যার অর্থ পিডিও নেটিভ প্রস্তুত বিবৃতি কার্যকারিতাটি গ্রহণ করবে।

পিডিও_এমওয়াইএসকিউএল মাইএসকিউএল ৪.১ এবং এর চেয়ে বেশি উপস্থিত দেশীয় প্রস্তুত বিবৃতি সমর্থনটির সুবিধা নেবে। আপনি যদি মাইএসকিএল ক্লায়েন্ট লাইব্রেরির একটি পুরানো সংস্করণ ব্যবহার করেন তবে পিডিও আপনার জন্য সেগুলি অনুকরণ করবে।

http://php.net/manual/en/ref.pdo-mysql.php

আমি প্রস্তুত নামের বিবৃতি এবং আরও ভাল API এর জন্য পিডিওর জন্য মাইএসকিউএলই আঁকছি।

যাইহোক, ভারসাম্যপূর্ণ হতে, পিডিও মাইএসকিউএলআইয়ের তুলনায় উপেক্ষণীয়ভাবে ধীর গতি সম্পন্ন করে তবে এটি মনে রাখা উচিত। আমি যখন এই পছন্দটি পছন্দ করলাম তখন আমি জানতাম এবং সিদ্ধান্ত নিয়েছিলাম যে একটি নির্দিষ্ট ইঞ্জিনের সাথে আপনাকে বেঁধে দেবে এমন একটি উপেক্ষিতভাবে দ্রুত লাইব্রেরি ব্যবহারের চেয়ে আরও ভাল একটি API এবং শিল্পের মান ব্যবহার করা আরও গুরুত্বপূর্ণ। FWIW আমি মনে করি পিএইচপি টিম ভবিষ্যতের জন্য মাইএসকিউএলির চেয়ে পিডিওতেও অনুকূলভাবে তাকাচ্ছে।


ওই তথ্যের জন্য ধন্যবাদ। কীভাবে ক্যোয়ারী ক্যাশে ব্যবহার করতে সক্ষম হচ্ছেন না তা আপনার পারফরম্যান্সকে প্রভাবিত করেছে বা আপনি এমনকি এটি আগে ব্যবহার করছেন?
অ্যান্ড্রু এনসলে

আমি ফ্রেমওয়ার্ক হিসাবে বলতে পারি না আমি যাইহোক একাধিক স্তরে ক্যাশে ব্যবহার করছি। আপনি সর্বদা স্পষ্টভাবে নির্বাচন করুন এসকিউএল_সিএইচই <বিবৃতিতে বাকী> যদিও ব্যবহার করতে পারেন।
মরগান

এমনকি একটি নির্বাচন এসকিউএল_সিএসিইচই বিকল্প আছে তাও জানতাম না। তবে এটি প্রদর্শিত হয় যে এখনও কাজ করবে না। ডক্স থেকে: "ক্যোয়ারী ফলাফল ক্যাসে নিয়ে যাওয়া হয় যদি এটা ক্যাশেবেল হয় ..." dev.mysql.com/doc/refman/5.1/en/query-cache-in-select.html
অ্যান্ড্রু Ensley

হ্যাঁ. এটি প্ল্যাটফর্মের নির্দিষ্টকরণের চেয়ে ক্যোয়ারের প্রকৃতির উপর নির্ভর করে।
মরগান 22

আমি পড়েছি এর অর্থ "ক্যোয়ারির ফলাফল ক্যাশে করা হয় যদি না অন্য কিছু এটি ক্যাশেযোগ্য হতে বাধা দেয় ", - যা আমি তখন পর্যন্ত পড়েছিলাম - তাতে প্রস্তুত বিবৃতি অন্তর্ভুক্ত ছিল। যাইহোক, ফ্রান্সিস অবিলার উত্তরের জন্য ধন্যবাদ, আমি জানি যে এটি আমার মাইএসকিউএল সংস্করণটির জন্য আর সত্য নয়।
অ্যান্ড্রু এনসলে

6

আমি বাস্তব ডেটাবেস PREPAREকলগুলি সক্ষম করার পরামর্শ দেব কারণ এমুলেশনটি সমস্ত কিছু ধরে না .. উদাহরণস্বরূপ, এটি প্রস্তুত করবে INSERT;!

var_dump($dbh->prepare('INSERT;'));
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
var_dump($dbh->prepare('INSERT;'));

আউটপুট

object(PDOStatement)#2 (1) {
  ["queryString"]=>
  string(7) "INSERT;"
}
bool(false)

আমি আনন্দের সাথে কোডের জন্য একটি কার্য সম্পাদন করব যা আসলে কাজ করে।

FWIW

পিএইচপি সংস্করণ: পিএইচপি 5.4.9-4Untu2.4 (ক্লিটার)

মাইএসকিউএল সংস্করণ: 5.5.34-0ubuntu0


এটি একটি আকর্ষণীয় বিষয়। আমার ধারণা অনুকরণ কার্যকরকরণের পর্যায়ে সার্ভার-সাইড পার্সিং স্থগিত করে। যদিও এটি কোনও বড় বিষয় নয় (ভুল এসকিউএল অবশেষে ব্যর্থ হবে) এটি পরিষ্কার করার prepareমতো কাজটি করা উচিত। (অতিরিক্তভাবে, আমি সবসময় ধরে নিয়েছি যে ক্লায়েন্ট-সাইড প্যারামিটার পার্সারের অগত্যা তার নিজস্ব বাগ রয়েছে))
এলভারো গঞ্জালেজ

1
আইডি কে আপনি যদি আগ্রহী হন তবে এখানে পিডিওর সাথে আমি লক্ষ্য করেছি যে এই খরগোশের গর্তটি আমাকে শুরু করে। দেখে মনে হচ্ছে একাধিক প্রশ্নের হ্যান্ডলিংয়ের অভাব রয়েছে।
কুইকশিফ্টিন

আমি শুধু GitHub থেকে কিছু মাইগ্রেশন লাইব্রেরি ... কি কি তোমাকে চিনি দিকে তাকিয়ে এই এক প্রায় কাছাকাছি আমার ব্লগ পোস্ট হিসাবে সঠিক একই জিনিস আছে।
কুইকশিফ্টিন

5

কেন অনুকরণকে 'মিথ্যা' এ স্যুইচ করবেন?

এর প্রধান কারণ হ'ল পিডিওর পরিবর্তে ডাটাবেস ইঞ্জিনটি প্রস্তুত করা হ'ল ক্যোয়ারী এবং আসল ডেটা আলাদাভাবে প্রেরণ করা হয় যা সুরক্ষা বাড়ায়। এর অর্থ যখন প্যারামিটারগুলি ক্যোয়ারীতে পাস করা হয় তখন এসকিউএল ইনজেক্ট করার চেষ্টাগুলি তাদের মধ্যে অবরুদ্ধ করা হয়, যেহেতু মাইএসকিউএল প্রস্তুত বিবৃতিগুলি একটি একক ক্যোয়ারিতে সীমাবদ্ধ থাকে। এর অর্থ হ'ল প্যারামিটারে দ্বিতীয় কোয়েরিটি পাস করার পরে একটি সত্য প্রস্তুত বিবৃতি ব্যর্থ হবে।

প্রস্তুতি বনাম পিডিওর জন্য ডাটাবেস ইঞ্জিন ব্যবহারের বিরুদ্ধে প্রধান যুক্তি হ'ল সার্ভারের দুটি ট্রিপ - একটি প্রস্তুতির জন্য এবং অন্যটি প্যারামিটারগুলি পাস করার জন্য - তবে আমি মনে করি যে অতিরিক্ত সুরক্ষাটি মূল্যবান is এছাড়াও, অন্তত মাইএসকিউএল এর ক্ষেত্রে, সংস্করণ 5.1 এর পরে কোয়েরি ক্যাচিং কোনও সমস্যা হয়নি been

https://tech.michaelseiler.net/2016/07/04/dont-emulate-prepared-statements-pdo-mysql/


1
ক্যোয়ারী ক্যাচিং যেভাবেই চলে গেছে: ক্যোয়ারী ক্যাশে মাইএসকিউএল 5.7.20 হিসাবে অবচিত হয়েছে এবং মাইএসকিউএল 8.0-এ সরানো হয়েছে।
vlvaro González

5

আমি অবাক হয়েছি কেউ এমুলেশন বন্ধ করার সবচেয়ে বড় কারণের কোনও উল্লেখ করেনি। এমুলেশন চালু থাকলে, PDO সমস্ত পূর্ণসংখ্যা ফেরত দেয় এবং স্ট্রিং হিসাবে ভাসমান । আপনি যখন এমুলেশনটি বন্ধ করেন, তখন মাইএসকিউএলে পূর্ণসংখ্যা এবং ভাসমানগুলি পিএইচপি-তে পূর্ণসংখ্যায় পরিণত হয় এবং ভাসে।

আরও তথ্যের জন্য, এই প্রশ্নের স্বীকৃত উত্তর দেখুন: পিএইচপি + পিডিও + মাইএসকিউএল: আমি কীভাবে পিএইচপি তে পূর্ণসংখ্যা এবং সংখ্যার হিসাবে মাইএসকিউএল থেকে পূর্ণসংখ্যার এবং সংখ্যাসূচক কলামগুলি ফিরিয়ে দেব?


0

রেকর্ড এর জন্য

PDO :: ATTR_EMULATE_PREPARES = সত্য

এটি একটি বাজে পার্শ্ব প্রতিক্রিয়া তৈরি করতে পারে। এটি স্ট্রিং হিসাবে int মানগুলি ফিরে আসতে পারে।

পিএইচপি 7.4, পিএসএ মাইএসকিএলএন্ড সহ।

PDO :: এটিটিআর_ইমুল_এইপিআরপিএস = সত্য সহ একটি কোয়েরি চালাচ্ছে

কলাম: আইডি
প্রকার: পূর্ণসংখ্যা
মান: 1

PDO :: ATTR_EMULATE_PREPARES = মিথ্যা দিয়ে কোয়েরি চালাচ্ছে

কলাম: আইডি
প্রকার: স্ট্রিংয়ের
মান: "1"

যাইহোক, বিন্যাস নির্বিশেষে দশমিক মানগুলি সর্বদা একটি স্ট্রিং ফিরে আসে :-(


দশমিক মানগুলি সর্বদা ফিরে আসে কেবল স্ট্রিংয়ের একমাত্র সঠিক উপায়
আপনার সাধারণ সংবেদন

হ্যাঁ মাইএসকিউএল এর দৃষ্টিকোণ থেকে তবে এটি পিএইচপি সাইডে ভুল। জাভা এবং সি # উভয়ই দশমিককে একটি সংখ্যার মান হিসাবে বিবেচনা করে।
Magallanes

না, তা নয়। এটি পুরো কম্পিউটার বিজ্ঞানের জন্য সমস্ত সঠিক। যদি আপনি এটি ভুল বলে মনে করেন, তবে আপনার অন্য ধরণের স্বেচ্ছাচারিতার যথাযথ দরকার
আপনার সাধারণ অনুভূতি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.