আমি কি পিএইচপি-তে মাইএসকিউএল এপিআইএস মিশ্রিত করতে পারি?


106

আমি নেটটি অনুসন্ধান করেছি এবং এখন পর্যন্ত আমি যা দেখেছি তা হ'ল আপনি ব্যবহার করতে mysql_এবং mysqli_এক সাথে অর্থ করতে পারেন :

<?php
$con=mysqli_connect("localhost", "root" ,"" ,"mysql");

if( mysqli_connect_errno( $con ) ) {
    echo "failed to connect";
}else{
    echo "connected";
}
mysql_close($con);
echo "Done";
?>

অথবা

<?php
$con=mysql_connect("localhost", "root" ,"" ,"mysql");
if( mysqli_connect_errno( $con ) ) {
    echo "failed to connect";
}else{
    echo "connected";
}
mysqli_close($con);
echo "Done";
?>

বৈধ হয় তবে আমি যখন এই কোডটি ব্যবহার করি তখন যা পাই তা হ'ল:

Connected
Warning: mysql_close() expects parameter 1 to be resource, object given in D:\************.php on line 9
Done

প্রথম ছাড়া এবং একই সাথে ছাড়া mysqli_close()। দ্বিতীয়টির জন্য।

সমস্যাটা কি? আমি ব্যবহার করা যাবে না mysql_এবং mysqliএকসঙ্গে? নাকি স্বাভাবিক? সংযোগগুলি আদৌ বৈধ কিনা আমি কীভাবে যাচাই করতে পারি? (দ্য if(mysq...))


5
মাইএসকিএল হ্রাস করা হয়, এটি কেবলমাত্র বোঝায় যে তারা একসাথে কাজ করবে না। আপনি কেন এমন চেষ্টা করছেন ..?
স্টার্লিং আর্চার

7
আপনার mysql_*পুরোপুরি ফাংশন ব্যবহার করা এড়ানো উচিত । তারা ত্রুটি-প্রবণ এবং অনিরাপদ এবং শীঘ্রই তাদের পিএইচপি থেকে সরানো হবে (তাদের এই মুহুর্তে অবচয় হিসাবে চিহ্নিত করা হয়েছে )। [এই দুর্দান্ত উত্তর] [0] আরও খারাপভাবে ব্যাখ্যা করছে যে তারা খারাপ কেন । [0]: stackoverflow.com/a/12860046/1055295
আন্দ্রেই Bârsan

2
১) আপনি কোনও পুরানো মজাদার ইন্টারফেস (মাইএসকিএল) ব্যবহারের উপর জোর দিয়েছিলেন যা ডোনায় অনন্যকাল থেকে অপ্রচলিত হিসাবে চিহ্নিত করা হচ্ছে ২) কোন অদ্ভুত কারণে আপনি সঠিক কাজটি না করে এর উত্তরসূরের সাথে মিশতে চান এবং নতুনটিতে রূপান্তর করতে চান 3 ) আপনি এত আশ্চর্য হয়ে গেছেন যে এটি কার্যকর হয় না যে আপনি এ সম্পর্কে এসওকে জিজ্ঞাসা করেন, যদিও এটি আপনি যে করছেন তা বোকামি তা অত্যন্ত স্পষ্ট হওয়া উচিত।
fvu

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

1
অবশ্যই না. যাইহোক, অবহেলিত কার্যকারিতা এবং সক্রিয়ভাবে সমর্থিত একজনের মধ্যে বেছে নেওয়ার বিকল্পটি দেওয়া, বলুন, আপনার নিজের বিমূর্ততা ঘূর্ণায়মান, কেন পুরানো ফাংশনগুলি ব্যবহার করবেন?
আন্দ্রে বার্সান

উত্তর:


65

না, আপনি ব্যবহার করতে পারবেন না mysqlএবং mysqliএকসঙ্গে। এগুলি পৃথক এপিআই এবং তাদের তৈরি করা সংস্থানগুলি একে অপরের সাথে সামঞ্জস্য নয়।

mysqli_closeযদিও একটি আছে ।


যদিও আপনার কোনওভাবেই সংযোগ বন্ধ করার দরকার নেই; যখন আর কোথাও উল্লেখ করা হয় না তখন বস্তুগুলি তাদের পরিষ্কার করে clean (সরল পুরানো সংস্থানগুলি তা করে কিনা তা নিশ্চিত নয়, তবে বস্তুগুলি আসলে RAII এর সুবিধা একটি নগণ্য ডিগ্রীতে নিতে পারে))
সিএওও

@ সিএইচও কেবল তা-ই নয়, স্ক্রিপ্টটি প্রস্থান করলে পিএইচপি কোনও মাইএসকিউএল সংযোগ বন্ধ করে দেবে
বিস্ফোরণ পিল

1
তবে সর্বদা নয়, আমার অভিজ্ঞতার সাথে, তাই আমরা সর্বদা ফাইলের নীচে একটি কাছাকাছি রাখি।
RationalRabbit

14

একটি রেফারেন্স সহ তিনটি এমওয়াইএসকিউএল এপিআই এর সম্পর্কে এখানে একটি সাধারণ উত্তর দেওয়ার জন্য:

আপনি তিনটি (কোন মিশ্রিত করা যাবে না mysql_*, mysqli_*, PDOএকসঙ্গে পিএইচপি থেকে) জুমলা এপিআই এর, এটা ঠিক কাজ করে না। এটি ম্যানুয়াল FAQ এও রয়েছে :

এটা এক্সটেনশন মিশ্রিত করা সম্ভব নয় । সুতরাং, উদাহরণস্বরূপ, PDO_MySQL বা ext / mysql এ কোনও mysqli সংযোগটি কার্যকর হবে না


সংযোগ থেকে অনুসন্ধানের ক্ষেত্রে আপনাকে একই মাইএসকিউএল এপিআই এবং এর সম্পর্কিত ফাংশনগুলি ব্যবহার করতে হবে।


কিছু লোক আজ আমাকে বলার চেষ্টা করেছিল যে mysql_real_escape_string()তাদের কোডটি বাকী কী পিডিও হওয়ার সাথে মিশ্রিত করার সময় তাদের কোনও সমস্যা / ত্রুটি নেই । এই আলাদা আলাদা API এর সাথে কাজ করার সাথে আমার সময়টি এখানে পেয়ে যায় এমন কি কিছু আছে? আমি কি এখানে অজ্ঞ? এটি "এখন মুছে ফেলা" প্রশ্নের জন্য রয়েছে স্ট্যাকওভারফ্লো.com/q/34209127 কেবলমাত্র 10 কে + সদস্যদের দ্বারা দেখা যাবে যে কারও অবাক হওয়া উচিত। এর সাথে সম্পর্কিত $stmt3->execute(array('classID' => $_POST['class'],'studentID' => mysql_real_escape_string($substr)))- আমি কি এখানে কিছু মিস করছি?
ফানকি চল্লিশ নিনার

1
@ ফ্রেড-আইআই- আপনি ঠিক বলেছেন :) ম্যানুয়ালটি পড়লে বোঝা যায় যে আপনি সঠিক । সম্ভবত যা ঘটেছে তা হ'ল চুপচাপ ডিফল্ট পরামিতিগুলির সাথে সংযোগ স্থাপনের চেষ্টাmysql_real_escape_string() করবে যা পরে ওপি'র জন্য কাজ করেছিল। সুতরাং এটি কেবল অক্ষর সেট পেতে সংযোগ তৈরি করে। সুতরাং
ওপির

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

@ ফ্রেড-ii- দেখুন: link_identifier এটি ডিফল্ট সংযোগ সেটিংস, যা এটি দিয়ে পায় ব্যবহার করবে ini_get()। সুতরাং এটি সম্ভবত ডিফল্ট সেটিংসের সাথে ওপি-র জন্য কাজ করে। আমি শুধু এটি ছেড়ে কিছু নতুন কফি (☕☕☕) আনতে চাই।
রিজায়ার 123

আপনি কিছু যোগ করতে পছন্দ করতে পারেন sqlsrv_query()। আমি এখানেই একটি প্রশ্ন বন্ধ করে দিয়েছি stackoverflow.com/q/41263771
নাইনার

2

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

তবে, আপনার একই স্ক্রিপ্ট থেকে একাধিক সংযোগ এড়ানো উচিত , একক এপিআই বা ভিন্ন কোনও বিষয় থেকে কোনও ব্যাপার নয়। যেহেতু এটি আপনার ডাটাবেস সার্ভারকে বোঝা দেবে এবং এর সংস্থানগুলি নিঃশেষ করবে। সুতরাং, যদিও প্রযুক্তিগতভাবে আপনি পারেন, আপনার কোডটিতে আলাদা আলাদা এক্সটেনশন মিশ্রিত করা উচিত নয়, রিফ্যাক্টরিংয়ের স্বল্প সময়ের জন্য সংরক্ষণ করা উচিত।


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

-3

MySQLiMySQLযাইহোক এখন হ্রাস করা হয় তার চেয়ে অনেক বেশি সুরক্ষিত । এজন্য আপনার সাথে থাকা উচিত MySQLiএবং এগুলি উভয়ই পৃথক হওয়ায় আপনি সেগুলি মেশাতে পারবেন না।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.