mysqli_fetch_assoc () একটি সদস্য ফাংশন bind_param () ত্রুটির জন্য প্যারামিটার / কল আশা করে। আসল মাইএসকিএল ত্রুটিটি কীভাবে পাবেন এবং এটি ঠিক করবেন?


109

আমার স্থানীয় / বিকাশের পরিবেশে, মাইএসকিউএল কোয়েরি ঠিকঠাক করছে। তবে, আমি যখন এটি আমার ওয়েব হোস্ট পরিবেশে আপলোড করি তখন আমি এই ত্রুটিটি পাই:

মারাত্মক ত্রুটি: একটি অ-অবজেক্টে সদস্য ফাংশন bind_param () এ কল করুন ...

কোডটি এখানে:

global $mysqli;
$stmt = $mysqli->prepare("SELECT id, description FROM tbl_page_answer_category WHERE cur_own_id = ?");
$stmt->bind_param('i', $cur_id);
$stmt->execute();
$stmt->bind_result($uid, $desc);

আমার ক্যোয়ারীটি যাচাই করতে, আমি কন্ট্রোল প্যানেল পিএইচপিএমআইএডমিনের মাধ্যমে কোয়েরিটি কার্যকর করার চেষ্টা করেছি এবং ফলাফলটি ঠিক আছে।


আমরা দেখতে পাচ্ছি আপনি কোথায় $mysqliপরিবর্তনশীল সূচনা করছেন ?
রিকেশ

এটি হতে পারে যে আপনার মাইএসকিউএল ব্যবহারকারীর একটি SELECTক্যোয়ারী করার সুযোগ সুবিধাগুলি রয়েছে । তুমি কি তা পরীক্ষা করেছ?
অমল মুরালি

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

@ ইয়োরকমনসেন্স - পুরানো শিরোনামের সাথে সদৃশ রেফারেন্সের জন্য এই প্রশ্নটি খুঁজে পাওয়া সহজ ছিল।
পল স্পিগেল

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

উত্তর:


122

কখনও কখনও আপনার মাইএসকিউএলআই কোডটি এর মতো mysqli_fetch_assoc() expects parameter..., Call to a member function bind_param()...বা অনুরূপ একটি ত্রুটি তৈরি করে । বা এমনকি কোনও ত্রুটি ছাড়াই, তবে ক্যোয়ারী সব একই কাজ করে না। এর অর্থ হল আপনার অনুসন্ধানটি কার্যকর করতে ব্যর্থ হয়েছে।

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

MySQLi এ ত্রুটি বার্তাটি কীভাবে পাবেন?

প্রথমত, মাইএসকিউএলআই আপনার সমস্ত পরিবেশে সংযুক্ত হওয়ার আগে সর্বদা এই লাইনটি রাখুন :

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

এর পরে সমস্ত মাইএসকিউএল ত্রুটি পিএইচপি ব্যতিক্রমগুলিতে স্থানান্তরিত হবে। অপ্রকাশিত ব্যতিক্রম, পরিবর্তে, একটি পিএইচপি মারাত্মক ত্রুটি করে makes সুতরাং, কোনও মাইএসকিউএল ত্রুটির ক্ষেত্রে, আপনি একটি প্রচলিত পিএইচপি ত্রুটি পাবেন। এটি তাত্ক্ষণিকভাবে ত্রুটির কারণ সম্পর্কে আপনাকে সচেতন করবে। এবং একটি স্ট্যাক ট্রেস আপনাকে সঠিক জায়গায় নিয়ে যায় যেখানে ত্রুটিটি ঘটেছিল।

কীভাবে বিভিন্ন পরিবেশে পিএইচপি কনফিগার করতে হয়

এখানে পিএইচপি ত্রুটি প্রতিবেদন সম্পর্কিত আমার নিবন্ধটির একটি সংক্ষেপ :
একটি বিকাশ এবং লাইভ সার্ভারগুলিতে ত্রুটির প্রতিবেদন করা আলাদা হতে হবে। ডেভলপমেন্ট সার্ভারে স্ক্রিনটি অন স্ক্রিনে দেখানো সুবিধাজনক, তবে লাইভ সার্ভারে ত্রুটি বার্তাগুলি অবশ্যই লগইন করা উচিত, যাতে আপনি পরে ত্রুটি লগ এ খুঁজে পেতে পারেন।

সুতরাং, আপনাকে অবশ্যই নিম্নলিখিত মানগুলির সাথে সম্পর্কিত কনফিগারেশন বিকল্পগুলি সেট করতে হবে:

  • একটি ডেভলপমেন্ট সার্ভারে

    • error_reporting সেট করা উচিত E_ALLমান ;
    • log_errors 1 এ সেট করা উচিত (এটি একটি ডেভেলপমেন্ট পিসিতে লগ থাকা সুবিধাজনক)
    • display_errors 1 সেট করা উচিত
  • একটি প্রোডাকশন সার্ভারে

    • error_reportingE_ALLমান সেট করা উচিত ;
    • log_errors 1 সেট করা উচিত
    • display_errors 0 এ সেট করা উচিত

আসলে এটি কীভাবে ব্যবহার করবেন?

কেবল যে কোনো কোডটি সরাতে যে ত্রুটির জন্য চেক ম্যানুয়ালি , সমস্ত or die(), if ($result)এবং এই ধরনের। সরাসরি আপনার ডাটাবেস মিথস্ক্রিয়া কোড লিখুন:

$stmt = $this->con->prepare("INSERT INTO table(name, quantity) VALUES (?,?)");
$stmt->bind_param("si", $name, $quantity);
$stmt->execute();

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

আপনি যে ত্রুটি বার্তাটি পান সেটি কী করবেন?

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

ত্রুটির বার্তা পাওয়ার পরে, আপনাকে এটি পড়তে হবে এবং বুঝতে হবে। এটি অত্যন্ত সুস্পষ্ট মনে হয় তবে তা তাত্পর্যপূর্ণ নয়, তবে শিখররা প্রায়শই এই ত্রুটিটি বার্তা দেয় যে ত্রুটি বার্তাটি কেবল একটি অ্যালার্ম সিগন্যাল নয়, তবে এটি আসলে সমস্যার বিস্তারিত ব্যাখ্যা ধারণ করে । এবং আপনার যা দরকার তা হ'ল ত্রুটি বার্তাটি পড়া এবং সমস্যাটি ঠিক করা।

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

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

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

ত্রুটি প্রতিবেদন করার ক্ষেত্রে আপনার কখনই করা উচিত নয় এমন একটি তালিকা

  • কখনও ত্রুটি দমন অপারেটর ( @) ব্যবহার করবেন না! এটি একটি প্রোগ্রামারকে ত্রুটি বার্তাটি পড়তে অক্ষম করে এবং তাই ত্রুটিটি ঠিক করতে অক্ষম করে
  • ব্যবহার করবেন না die()বা echoবা অন্য কোন ফাংশন নিঃশর্তভাবে পর্দায় ত্রুটি বার্তা প্রিন্ট করতে। পিএইচপি নিজে থেকেই ত্রুটিগুলি প্রতিবেদন করতে পারে এবং এটি পরিবেশের উপর নির্ভর করে সঠিক উপায়ে করতে পারে - সুতরাং কেবল এটি পিএইচপি-র জন্য রেখে দিন।
  • ম্যানুয়ালি (যেমন if($result)) ক্যোয়ারী ফলাফল পরীক্ষা করার জন্য একটি শর্ত যুক্ত করবেন না । ত্রুটি ব্যতিক্রম সক্ষম থাকলে এই শর্তটি কেবল অকেজো হবে।
  • try..catchত্রুটি বার্তা প্রতিধ্বনি করার জন্য অপারেটর ব্যবহার করবেন না । এই অপারেটরটি কোনও ট্রানজেকশন রোলব্যাকের মতো কিছু ত্রুটি পরিচালনার জন্য ব্যবহার করা উচিত। তবে কখনই এটি ত্রুটিগুলি রিপোর্ট করতে ব্যবহার করবেন না - যেমন আমরা উপরে শিখেছি, পিএইচপি ইতিমধ্যে এটি সঠিকভাবে করতে পারে।

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


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