လက်ရှိတည်နေရာ: ပင်မစာမျက်နှာ> နောက်ဆုံးရဆောင်းပါးများစာရင်း> PDostatement ၏ရလဒ်ကိုရယူသည့်အခါအမျိုးအစားမတိုက်ဆိုင်မှုပြ problem နာကိုဖြေရှင်းပါ :: Fetchobject

PDostatement ၏ရလဒ်ကိုရယူသည့်အခါအမျိုးအစားမတိုက်ဆိုင်မှုပြ problem နာကိုဖြေရှင်းပါ :: Fetchobject

gitbox 2025-05-11

ဒေတာဘေ့စ်လုပ်ငန်းများအတွက် PDO ကိုအသုံးပြုသောအခါ PDostatement :: Fetterobjection သည် query ကိုအရာဝတ်ထုတစ်ခုသို့တိုက်ရိုက်မြေပုံဆွဲနိုင်သည့်အလွန်အဆင်ပြေသောနည်းလမ်းတစ်ခုဖြစ်သည်။ သို့သော်တစ်ခါတစ်ရံတွင်ကျွန်ုပ်တို့သည်ဒေတာဘေ့စ်တွင်ကိန်းဂဏန်းအဖြစ်သတ်မှတ်သည့်နယ်ပယ်တစ်ခုဖြစ်သော လယ်ကွင်း ( Int ) အဖြစ်ပြောင်းလဲခြင်းကိုပြုလုပ်သောနယ်ပယ်ကဲ့သို့သောပြ problems နာများကြုံတွေ့ရသည်။ အချက်အလက်အမြောက်အများကိုကိုင်တွယ်ဖြေရှင်းသည့်အခါဤအခြေအနေသည်အထူးသဖြင့်ခက်ခဲသောအခြေအနေများသို့မဟုတ်တင်းကျပ်သောအချက်အလက်ဖွဲ့စည်းပုံများလိုအပ်သည်။

အကြောင်းပြချက်များနှင့်ဖြေရှင်းနည်းများကိုကြည့်ကြပါစို့။

ပြ problem နာ၏အကြောင်းရင်း

PDostatement :: FetchObjectObject သည် database field အမျိုးအစားပေါ်မူတည်ပြီး PHP အမျိုးအစားကိုအလိုအလျောက်မသွင်းပါ။ ၎င်းသည်အချက်အလက်များကိုအရာဝတ်ထုဂုဏ်သတ္တိများသို့ဖြည့်ဆည်းပေးပြီး, အကြောင်းမှာ PDO သည်အချက်အလက်အားလုံးကို data များအားလုံးကိုပုံမှန်အားဖြင့်ပြန်လည်ပြုလုပ်ပေးသည်။

ဥပမာတစ်ခုကိုကြည့်ရအောင်။

 <?php
$pdo = new PDO('mysql:host=localhost;dbname=test', 'root', '');
$stmt = $pdo->query('SELECT id, name FROM users');
$user = $stmt->fetchObject();

var_dump($user);
?>

output ကိုဖြစ်လိမ့်မည်:

 object(stdClass)#1 (2) {
  ["id"]=>
  string(1) "1"
  ["name"]=>
  string(4) "John"
}

သင်မြင်နိုင်သည့်အတိုင်း ID သည် ဒေတာဘေ့စ်တွင် INIT ကိုရိုက်ထည့်ပါကပင်ရလဒ်သည် PHP တွင် string တစ်ခုဖြစ်သည်

အဖေြ

ဤပြ problem နာကိုဖြေရှင်းရန်ဘုံနည်းလမ်းများစွာရှိသည်။

1 ။ PDO :: Attr_Stringify_fetsetes option ကိုသုံးပါ (မထောက်ခံပါ)

PDO တွင် PDO :: Attr_Stringify_fathets ဟုခေါ်သော setting တွင်နံပါတ်များကိုကြိုးခွဲခြားရန်အလိုအလျောက်ပြောင်းလဲခြင်းရှိမရှိကိုထိန်းချုပ်နိုင်သည်။ သို့သော်ဤရွေးချယ်မှုသည် Fetch () စီးရီးလုပ်ဆောင်ချက်များတွင်သာထိရောက်မှုရှိနိုင်သည်ဟု မှတ်ချက်ပြုသင့်သည်

2 ။ လက်စွဲစာအုပ်အမျိုးအစားပြောင်းလဲခြင်း (အကြံပြု)

လက်တွေ့ကျသောနည်းလမ်းမှာလူတန်းစားကိုသတ်မှတ်ရန်နှင့် Magic Method တွင်အမျိုးအစားပြောင်းလဲခြင်းကိုကိုယ်တိုင်ပြုလုပ်ရန်ဖြစ်သည်

ဥပမာအားဖြင့်:

 <?php
class User {
    public int $id;
    public string $name;

    public function __construct() {
        // အမျိုးအစား coercion ကိုဒီမှာဖျော်ဖြေနိုင်ပါတယ်
    }

    public function __set($name, $value) {
        if ($name === 'id') {
            $this->id = (int) $value;
        } elseif ($name === 'name') {
            $this->name = (string) $value;
        }
    }
}

$pdo = new PDO('mysql:host=localhost;dbname=test', 'root', '');
$stmt = $pdo->query('SELECT id, name FROM users');
$user = $stmt->fetchObject(User::class);

var_dump($user);
?>

ဤနည်းအားဖြင့်သင်သည်ဒေတာဘေ့စ်မှဒေတာများကိုရယူသောအခါအမျိုးအစားမှန်ကန်မှုကိုသေချာအောင်လုပ်နိုင်သည်။

3 ။ ရှင်းလင်းစွာဖြည့်ဆည်းဖော်ပြချက်များရှိကွင်းဆင်းအမျိုးအစားများကိုပြောင်းလဲခြင်း (optional)

SQL ထုတ်ပြန်ချက်များတွင်ကွက်လပ်များကိုလိုအပ်သောအမျိုးအစားသို့တိုက်ရိုက်အတင်းအကျပ်လုပ်ပါ။

 SELECT id + 0 AS id, name FROM users

ဤနည်းအားဖြင့်ဒေတာဘေ့စ်ပြန်ရောက်သည့်အခါ ID သည်ကိန်းတစ်ခုဖြစ်ပြီးဖြစ်သော်လည်းဤနည်းလမ်းသည်အထူးသဖြင့်လှပပြီးပြုပြင်ထိန်းသိမ်းမှုညံ့ဖျင်းသည်။ ထို့ကြောင့်ယာယီအရေးပေါ်ကယ်ဆယ်ရေးအတွက်သာသင့်လျော်သည်။

4 ။ ထုံးစံမြေပုံရေးဆွဲရေးလုပ်ငန်းများ (ကြီးမားသောစီမံကိန်းများအတွက်သင့်လျော်သော) ကိုသုံးပါ။

သင်၏စီမံကိန်းတွင်နေရာများစွာရှိပါက Object Mapping လိုအပ်သည့်နေရာများစွာရှိပါကအထွေထွေ Mapper Tool ကိုရေးရန်စဉ်းစားပါ။ ဥပမာအားဖြင့်:

 <?php
function mapUser($data) {
    $user = new User();
    $user->id = (int) $data->id;
    $user->name = (string) $data->name;
    return $user;
}

$pdo = new PDO('mysql:host=localhost;dbname=test', 'root', '');
$stmt = $pdo->query('SELECT id, name FROM users');
$rawUser = $stmt->fetchObject();
$user = mapUser($rawUser);

var_dump($user);
?>

ဤနည်းလမ်းသည်ပိုမိုထိန်းချုပ်နိုင်ပြီးစီမံခန့်ခွဲမှုဆိုင်ရာယုတ္တိဗေဒကိုနောက်အဆင့်တွင်ထည့်သွင်းခြင်းကဲ့သို့သောစီမံခန့်ခွဲမှုနှင့်ချဲ့ထွင်ရန်လွယ်ကူသည်။

အခြားကြိုတင်ကာကွယ်မှုများ

  • Data Table Field အမျိုးအစားသည်ကျိုးကြောင်းဆီလျော်စွာဒီဇိုင်းရေးဆွဲထားပါသည် ။ ဒေတာဘေ့စ်စားပွဲရှိကွက်လပ်များကိုတတ်နိုင်သမျှရှင်းလင်းစွာရွေးချယ်ရန်ကြိုးစားပါ။ ဥပမာအားဖြင့် ID သည် Int ဖြစ်ရမည်ဖြစ်ပြီးငွေပမာဏသည် ဒ decimal မဖြစ်ရမည်။ ကိန်းဂဏန်းများအစားကြိုးများကိုမသုံးပါနှင့်။

  • ခိုင်မာသောအမျိုးအစားကြေငြာချက်များကို အသုံးပြု . PHP 7.4+ တွင်အမျိုးအစားအရိပ်အမြွက်များနှင့် attribute အမျိုးအစားများကြေငြာချက်များသည်အစောပိုင်းအမှားများကိုရှာဖွေတွေ့ရှိနိုင်သည်။

  • Unified Data Access Layer (DAL) encapsulationulation : အကယ်. စီမံကိန်းသည်ကြီးမားပါကထပ်ခါတလဲလဲလုပ်အားကိုရှောင်ရှားရန် Database Access and Object ကို adapcapsulate လုပ်ခြင်းသည်အကောင်းဆုံးလုပ်အားကိုရှောင်ရှားရန်စည်းလုံးညီညွတ်စွာဖြင့်စည်းလုံးညီညွတ်စေသည်။

အကျဉ်းချုပ်

FetchOccoboject ကို အသုံးပြုရန်အလွန်အဆင်ပြေသော်လည်းမှန်ကန်သောဒေတာအမျိုးအစားကိုသေချာစေရန်, များသောအားဖြင့်သင်ကိုယ်တိုင်အတန်းကိုသတ်မှတ်ရန်, ၎င်းသည် code ကိုပိုမိုခိုင်မာစေပြီးနောက်ဆက်တွဲ debugging ၏ပြ trouble နာကိုလျှော့ချနိုင်သည်။

အကယ်. အသေးစိတ်ဖော်ပြထားသည့် PDO အသုံးပြုမှုနှင့်အရာဝတ်ထုမြေပုံများကိုပိုမိုသိရှိလိုပါက https://gitbox.net/docs/pdo ကိုရည်ညွှန်းနိုင်သည်။