আমি বুঝতে পেরেছি যে এই প্রশ্নটিতে কোনও নতুন ক্রিয়াকলাপ হওয়ার পরে অনেক দিন হয়েছে। তবে, অন্যান্য পোস্টাররা যেমন মন্তব্য করেছেন - get_result()
এখন কেবলমাত্র মাইএসকিউএল নেটিভ ড্রাইভার (মাইএসকিএলএনডি) ইনস্টল করে পিএইচপিতে পাওয়া যায় এবং কিছু ক্ষেত্রে মাইএসকিএলএনডি ইনস্টল করা সম্ভব বা কাম্য নয়। সুতরাং, আমি ভেবেছিলাম যে এই উত্তরটি get_result()
ব্যবহার না করে কীভাবে প্রস্তাবিত কার্যকারিতাটি দেয় সে সম্পর্কিত তথ্যের সাথে পোস্ট করা সহায়ক get_result()
।
get_result()
fetch_array()
ফলাফল / সেট লুপের সাথে প্রায়শই একত্রিত হয় এবং ফলাফলের প্রতিটি সারি থেকে মানগুলিকে সংখ্যাসূচক-সূচকযুক্ত বা সহযোগী অ্যারেতে সংরক্ষণ করে। উদাহরণস্বরূপ, নীচের কোডটি ফলাফল সেট মাধ্যমে লুপ করতে get_result () ব্যবহার করে, প্রতিটি সারি থেকে সংখ্যাসূচক-সূচকযুক্ত $ ডেটা [] অ্যারেতে সংরক্ষণ করে:
$c=1000;
$sql="select account_id, username from accounts where account_id<?";
$stmt = $mysqli->prepare($sql);
$stmt->bind_param('i', $c);
$stmt->execute();
$result = $stmt->get_result();
while($data = $result->fetch_array(MYSQLI_NUM)) {
print $data[0] . ', ' . $data[1] . "<BR>\n";
}
তবে, যদি get_result()
উপলভ্য না থাকে (কারণ mysqlnd ইনস্টল করা নেই), তবে এটি ব্যবহার না করে ফলাফলের প্রতিটি সারি থেকে কীভাবে মানগুলি সংরক্ষণ করতে হবে তা সমস্যার দিকে নিয়ে যায় get_result()
। অথবা, উত্তরাধিকার কোডটি কীভাবে মাইগ্রেট get_result()
করা যায় যা এটি ছাড়াই চলতে ব্যবহার করে (যেমন ব্যবহার করেbind_result()
পরিবর্তে করে) - যতটা সম্ভব সামান্যতম কোডকে প্রভাবিত করার সময়।
দেখা যাচ্ছে যে প্রতিটি সারি থেকে একটি সংখ্যা-সূচকযুক্ত অ্যারেতে মানগুলি সংরক্ষণ করে ব্যবহার করা এত সোজা-ফরোয়ার্ড নয় bind_result()
। bind_result()
স্কেলার ভেরিয়েবলগুলির একটি তালিকা প্রত্যাশা করে (অ্যারে নয়)। সুতরাং, ফলাফলের প্রতিটি সারি থেকে একটি অ্যারেতে সেট করা মানগুলি সংরক্ষণ করতে এটি কিছু করতে লাগে।
অবশ্যই কোডটি সহজেই নিম্নলিখিত হিসাবে পরিবর্তন করা যেতে পারে:
$c=1000;
$sql="select account_id, username from accounts where account_id<?";
$stmt = $mysqli->prepare($sql);
$stmt->bind_param('i', $c);
$stmt->execute();
$stmt->bind_result($data[0], $data[1]);
while ($stmt->fetch()) {
print $data[0] . ', ' . $data[1] . "<BR>\n";
}
তবে, এর জন্য আমাদের স্বতন্ত্রভাবে ডাকে $ ডেটা [0], $ ডেটা [1], ইত্যাদি তালিকাভুক্ত করা প্রয়োজন bind_result()
, যা আদর্শ নয়। আমরা এমন একটি সমাধান চাই যা আমাদের স্পষ্টভাবে $ ডেটা [0], $ তথ্য [1], ... $ ডেটা [এন -1] তালিকাভুক্ত করতে হবে না (যেখানে এন নির্বাচনী বিবৃতিতে ক্ষেত্রের সংখ্যা) কল এ bind_results()
। যদি আমরা এমন কোনও উত্তরাধিকার অ্যাপ্লিকেশন স্থানান্তর করি যেটিতে প্রচুর পরিমাণে ক্যোয়ারী রয়েছে এবং প্রতিটি ক্যোয়ারিতে আলাদা আলাদা ক্ষেত্রের ক্ষেত্র থাকতে পারেselect
তবে আমরা যদি উপরেরটির মতো সমাধানটি ব্যবহার করি তবে মাইগ্রেশনটি খুব শ্রমনির্ভর এবং ত্রুটির প্রবণ হবে will ।
আদর্শভাবে, আমরা 'ড্রপ-ইন রিপ্লেসমেন্ট' কোডটির স্নিপেট চাই - get_result()
ফাংশনটি যুক্ত লাইনটি এবং পরবর্তী লাইনে ()) লুপটি প্রতিস্থাপন করতে । এর আগে () লুপের অভ্যন্তরে থাকা রেখাগুলি - এর আগে লাইনগুলির কোনও বা তারপরে কোনও লাইনকে প্রভাবিত না করে প্রতিস্থাপন কোডটির পরিবর্তিত কোডের মতো একই ফাংশন থাকা উচিত। আদর্শভাবে আমরা চাই প্রতিস্থাপন কোডটি যথাসম্ভব কমপ্যাক্ট হওয়া উচিত, এবং আমরা select
কোয়েরির ধারাটিতে ক্ষেত্রের সংখ্যার ভিত্তিতে প্রতিস্থাপন কোডটি টেলর করতে চাই না ।
ইন্টারনেটে অনুসন্ধান করে, আমি বেশ কয়েকটি সমাধান পেয়েছি যা ব্যবহার bind_param()
করে call_user_func_array()
(উদাহরণস্বরূপ, গতিময়ভাবে mysqli_stmt পরামিতিগুলি আবদ্ধ করুন এবং তারপরে ফলাফল (পিএইচপি) বাঁধাই করুন ), তবে বেশিরভাগ সমাধান যেগুলি আমি পেয়েছি ফলাফলগুলি ফলস্বরূপ একটি সংঘবদ্ধ অ্যারেতে সংরক্ষণ করা হয় তা নয় not একটি সংখ্যায়-সূচকযুক্ত অ্যারে, এবং এর মধ্যে অনেকগুলি সমাধান আমার পছন্দ মতো কমপ্যাক্ট ছিল না এবং / অথবা 'ড্রপ-ইন প্রতিস্থাপন' হিসাবে উপযুক্ত ছিল না। তবে, আমি যে উদাহরণগুলি পেয়েছি সেগুলি থেকে, আমি এই সমাধানটি একসাথে বাঁধতে সক্ষম হয়েছি, যা বিলের সাথে খাপ খায়:
$c=1000;
$sql="select account_id, username from accounts where account_id<?";
$stmt = $mysqli->prepare($sql);
$stmt->bind_param('i', $c);
$stmt->execute();
$data=array();
for ($i=0;$i<$mysqli->field_count;$i++) {
$var = $i;
$$var = null;
$data[$var] = &$$var;
}
call_user_func_array(array($stmt,'bind_result'), $data);
while ($stmt->fetch()) {
print $data[0] . ', ' . $data[1] . "<BR>\n";
}
অবশ্যই, () লুপটিকে আরও কমপ্যাক্ট করার জন্য একটি লাইনে ভেঙে ফেলা যেতে পারে।
আমি আশা করি এটি ব্যবহার করে সমাধানের সন্ধানকারী যে কোনও ব্যক্তিকে সহায়তা করবে bind_result()
একটি সংখ্যাসূচকভাবে-সূচীবদ্ধ অ্যারের মধ্যে এবং / অথবা ব্যবহার স্থানান্তরণের উত্তরাধিকার কোড একটি উপায় খুঁজছেন প্রতিটি সারির থেকে মানগুলি সঞ্চয় করতে get_result()
। মন্তব্য স্বাগত।
$stmt = $conn->mysqli->stmt_init();
?