လက်ရှိတည်နေရာ: ပင်မစာမျက်နှာ> နောက်ဆုံးရဆောင်းပါးများစာရင်း> MySQLI_STMTT :: Defanges အတွက် $ အမှားအယွင်းများကိုအသုံးပြုခြင်းသည်အဘယ်နည်း။

MySQLI_STMTT :: Defanges အတွက် $ အမှားအယွင်းများကိုအသုံးပြုခြင်းသည်အဘယ်နည်း။

gitbox 2025-05-28

PHP ပရိုဂရမ်တွင် MySQLI extension ကို MySQL database နှင့်အပြန်အလှန်ဆက်သွယ်ရန်အသုံးပြုသည်။ MySQLI_STMT သည်အရေးမကြီးသောထုတ်ပြန်ချက်များကိုမကြာခဏအသုံးပြုလေ့ရှိသည်။ MySQLI_STMT :: $ အမှား သည် SQL ထုတ်ပြန်ချက်များကိုအကောင်အထည်ဖော်သည့်အခါဖြစ်ပေါ်လာသောအမှားသတင်းကိုပြန်ပေးသည့် MySQLI_STMT Object တွင်ပစ္စည်းတစ်ခုဖြစ်သည်။ အကယ်. SQL Execution သည်အောင်မြင်လျှင် $ အမှားသည် အချည်းနှီးဖြစ်လိမ့်မည်။ အမှားတစ်ခုဖြစ်ပါကပြ problems နာများကိုဖြေရှင်းရန် developer ကိုလွယ်ကူချောမွေ့စေရန်အသေးစိတ်အမှားအချက်အလက်များပါ 0 င်မည်ဖြစ်သည်။

သို့သော် MySQLI_STMT ကို အသုံးပြုသောအခါ developer များသည်အချို့သောထောင်ချောက်အချို့ကိုကြုံတွေ့ရနိုင်သည်။ ဤဆောင်းပါးသည်ဤပြ problems နာများကိုဆွေးနွေးပါမည်။

သာမန်တွင်း 1 - အရောင်းအ 0 ယ်များသည်မှန်ကန်စွာပြန်လှိမ့်မထားပါ

အရောင်းအ 0 ယ်များတွင် MySQLI သည် database အရောင်းအ 0 ယ်များကိုစီမံခန့်ခွဲရန် စတင်ရန် ( ) , ငွေပေးချေမှုဆိုင်ရာအသေခံခြင်းအတွင်းအမှားတစ်ခုဖြစ်ပါကအချက်အလက်မကိုက်ညီစေရန် Rollback () ကို အသုံးပြု. ငွေပေးငွေယူကိုပြန်လှိမ့်ချထားသင့်သည်။ သို့သော် အကယ်. MySQLI_STMT ကိုသင်သာအားကိုးပါကငွေပေးချေမှုသည်အောင်မြင်မှုရှိ, ရှိမရှိဆုံးဖြတ်ရန်အမှားအယွင်းများကိုလွဲချော်စေနိုင်သည်။

ဖြေရှင်းချက် -

MySQLI ::: :: အမှားတစ်ခုဖြစ်ပေါ်လျှင်အမှားတစ်ခုဖြစ်ပေါ်သည့်အခါငွေပေးငွေယူကိုအမြဲတမ်းပြန်လှိမ့်ပါကစစ်ဆေးရန် MySQLI :: errno ကို သုံးပါ။ ၎င်းသည်အမှားအယွင်းများဖြစ်ပေါ်နေသောမည်သည့်နေရာတွင်ရှိနေပါစေသူတို့ကအချိန်မီကိုင်တွယ်နိုင်သည်။

 $mysqli->begin_transaction();

$stmt = $mysqli->prepare("INSERT INTO users (username, email) VALUES (?, ?)");
$stmt->bind_param("ss", $username, $email);

if (!$stmt->execute()) {
    echo "Error executing query: " . $stmt->error;
    $mysqli->rollback();  // အမှားတစ်ခုဖြစ်ပေါ်လျှင်,ပြန်အရောင်းအလှိမ့်
    exit();
}

// အရာအားလုံးအဆင်ပြေလျှင်,တင်သွင်းမှုတင်သွင်း
$mysqli->commit();

ဘာကြောင့်ဒီလိုလုပ်ရတာလဲ

MySQLI_STMT :: $ အမှားသည် ထုတ်ပြန်ချက်တစ်ခုတည်းကွပ်မျက်မှုတစ်ခုတည်းအတွက်အမှားအချက်အလက်များကိုသာပြန်လည်ပေးပို့သည်, ငွေပေးငွေယူတစ်ခုလုံး၏အမှားများကိုမဖုံးကွယ်ပါ။ အကယ်. သင်သည်ထုတ်ပြန်ချက်များစွာကိုသင်လုပ်ပြီးအမှားများကိုစစ်ဆေးရန်အတွက် ဒေါ်လာ stmt-> အမှားကို သာအားကိုးပါကငွေပေးချေမှု၏အမှားအယွင်းကိုသင်လွဲချော်နိုင်သည်။

ဘုံတွင်း 2 - ကွဲပြားခြားနားသောဆက်သွယ်မှုအောက်တွင်ငွေပေးချေမှုစီမံခန့်ခွဲမှု

MySQLI သည် အရောင်းအ 0 ယ်များကိုဒေတာဘေ့စ်ဆက်သွယ်မှုမျိုးစုံဖြင့်လုပ်ဆောင်ရန်ခွင့်ပြုသည်။ developer တစ် ဦး သည်ငွေပေးငွေယူတစ်ခုလုပ်ဆောင်သောအခါသူသည်ဆက်သွယ်မှုတစ်ခုပေါ်တွင်မှားယွင်းစွာစတင်ပြီးအခြားဆက်သွယ်မှုတစ်ခုတွင်ရှာဖွေမှုတစ်ခုပြုလုပ်နိုင်သည်။ MySQLI_STMT :: $ အမှားအယွင်းများ သည်မတူညီသောဆက်သွယ်မှုများအပေါ်လုပ်ဆောင်မှုအပေါ်အမှားအယွင်းများဖြစ်ပေါ်နေပါကအမှားတစ်ခုဖြစ်ပါကအမှားအယွင်းများကိုအချိန်မီသိမ်းဆည်းရမိမည်မဟုတ်ပါ။

ဖြေရှင်းချက် -

ငွေပေးငွေယူမှု၏လုပ်ဆောင်မှုအားလုံးတွင်တူညီသော database connection တွင်ဖျော်ဖြေတင်ဆက်ကြောင်းသေချာပါစေ။ ငွေပေးငွေယူတစ်ခုလုံး၏အခြေအနေကိုအလားတူဆက်သွယ်မှုကိုသေချာစေရန် MySQLI Object Connection ကိုသုံးနိုင်သည်။

 $mysqli->begin_transaction();  // အရောင်းအ 0 ယ်အားလုံးအလားတူဆက်သွယ်မှုတွင်ဖျော်ဖြေကြသည်သေချာအောင်လုပ်ပါ

$stmt1 = $mysqli->prepare("INSERT INTO users (username, email) VALUES (?, ?)");
$stmt1->bind_param("ss", $username, $email);

$stmt2 = $mysqli->prepare("INSERT INTO orders (user_id, amount) VALUES (?, ?)");
$stmt2->bind_param("id", $user_id, $amount);

// လုပ်ဆောင်ချက်တစ်ခုလုပ်ဆောင်ပါ
if (!$stmt1->execute() || !$stmt2->execute()) {
    echo "Error executing queries: " . $mysqli->error;
    $mysqli->rollback();
    exit();
}

$mysqli->commit();  // တင်သွင်းရန်သေချာပါစေ

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

ဘုံတွင်း 3 - ဒေတာဘေ့စ်အမှားအဆင့်ကိုလျစ်လျူရှုပါ

MySQL တွင်အမှားအယွင်းများအရအမှားအယွင်းများကိုကွဲပြားခြားနားသောအမျိုးအစားများအဖြစ်ခွဲခြားထားသည်။ အမှားအယွင်းများသည်ဆိုးဝါးစွာသေစေနိုင်သည်။ အခြားသူများကသင့်အားဆက်လက်လုပ်ဆောင်ရန်ခွင့်ပြုသည့်သတိပေးချက်များရှိစဉ်။ MySQLI_STMT :: $ အမှားသည် SQL Error Messages ကိုသာပြန်လည်ပေးလိမ့်မည်။ သို့သော်အမှား၏ပြင်းထန်မှုကိုသင့်အားမပြောနိုင်ပါ။

ဖြေရှင်းချက် -

ငွေပေးချေမှုတစ်ခုတွင် MySQLI_STMT :: $ အမှားသည် အချည်းနှီးဖြစ်သည်။ ထို့နောက်အမှားအမျိုးအစားပေါ်မူတည်ပြီးသင့်လျော်သောအရေးယူမှုကိုပြုလုပ်ပါ။ အကယ်. ၎င်းသည်ဆိုးဝါးသောအမှားဖြစ်ပါကငွေပေးငွေယူကိုပြန်လှိမ့်သင့်သည်။ အကယ်. ၎င်းသည်သတိပေးချက်အမှားတစ်ခုဖြစ်ပါကဆက်လက်လုပ်ဆောင်ရန်သင်ရွေးချယ်နိုင်သည်။

 if (!$stmt1->execute()) {
    if ($stmt1->errno) {
        echo "Fatal error: " . $stmt1->error;
        $mysqli->rollback();  // 致命错误时ပြန်အရောင်းအလှိမ့်
        exit();
    } else {
        echo "Warning: " . $stmt1->error;
        // သင်သည်အခြားစစ်ဆင်ရေးများကိုဆက်လက်လုပ်ဆောင်ရန်ရွေးချယ်နိုင်သည်
    }
}

သာမန်တွင်း 4 - SQL Injection Protection ကိုလျစ်လျူရှုခြင်း

MySQLI 's Preprocessing ထုတ်ပြန်ချက်များသည် SQL Injection Attack ကိုမသုံးပါက SQL Injection Attack ကိုမသုံးပါက SQL Injection () နည်းလမ်းကိုမှန်ကန်စွာအသုံးမပြုပါက application သည် SQL Injection Attacks ၏အန္တရာယ်နှင့်ထိတွေ့သွားလိမ့်မည်။ MySQLI_STMT ကိုသင်အသုံးပြုနေလျှင်ပင်သင်၏ငွေပေးငွေယူတွင်အမှားအယွင်းများကိုဖမ်းရန် $ အမှားများကိုဖမ်းရန်,

ဖြေရှင်းချက် -

parameter ၏ဒေတာအမျိုးအစားကိုမှန်ကန်စွာသတ်မှတ်ရန်သေချာစေရန် parameters တွေကိုမှန်ကန်စွာသတ်မှတ်ရန် parameters တွေကိုအားဖြည့်ရန် bind_param ()) သို့မဟုတ် bind_value () နည်းလမ်းများကိုအမြဲတမ်းသုံးပါ။

 $stmt = $mysqli->prepare("SELECT * FROM users WHERE username = ?");
$stmt->bind_param("s", $username);  // Username Parametersceters bind,တားဆီး SQL သွင်းခြင်း
$stmt->execute();

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

အကျဉ်းချုပ်

MySQLI_STMT :: $ အမှားအယွင်းများကို အသုံးပြုသောအခါ developer များက data formission ကိုဖြစ်ပေါ်စေသောပျက်ကွက်မှုများကိုရှောင်ရှားရန်အရောင်းအ 0 ယ်များတွင်အမှားအယွင်းများကိုကိုင်တွယ်ရန်သတိထားရန်လိုအပ်သည်။ အသုံးအများဆုံးကျော့ကွင်းများတွင် - အရောင်းအ 0 ယ်များသည်မတူကွဲပြားသောဆက်သွယ်မှုများအောက်တွင်ငွေပေးချေမှုစီမံခန့်ခွဲမှုပုံစံများကိုလျစ်လျူရှုခြင်း, ကျိုးကြောင်းဆီလျော်သောအမှားဖြင့်ပြုလုပ်ထားသောအမှားများဖြင့်ဤပြ problems နာများကိုပိုမိုကျိုးကြောင်း ဆီ လျော်စွာကိုင်တွယ်ခြင်းဖြင့်အလွန်လျှော့ချနိုင်သည်။