လက်ရှိတည်နေရာ: ပင်မစာမျက်နှာ> နောက်ဆုံးရဆောင်းပါးများစာရင်း> STMT_INIT ကိုအသုံးပြုပြီးနောက်တွင်ကြိုတင်ပြင်ဆင်ရန် () ဟုခေါ်ဆိုရန်မေ့နေလျှင်ဘာဖြစ်မည်နည်း။

STMT_INIT ကိုအသုံးပြုပြီးနောက်တွင်ကြိုတင်ပြင်ဆင်ရန် () ဟုခေါ်ဆိုရန်မေ့နေလျှင်ဘာဖြစ်မည်နည်း။

M66 2025-05-29

PHP ၏ MySQLI လုပ်ငန်းများအတွက် PHP ၏ MySQLI extension ကိုအသုံးပြုသောအခါကြိုတင်ပြင်ဆင်ထားသည့်ထုတ်ပြန်ချက်များသည်ဘုံနှင့်လုံခြုံစိတ်ချရသောအလေ့အကျင့်တစ်ခုဖြစ်သည်။ developer များအများအားဖြင့် MySQLI :: stmt_init () stmt_init () stmt_init ( ) ကိုအသုံးပြုသည်။ သို့သော် ကြိုတင်ပြင်ဆင်မှုကို အကောင်အထည်ဖော်ရန်သင်မေ့နေလျှင်, stmt_init ကိုခေါ်ပြီးနောက် ( ) ကိုခေါ်ယူပြီးနောက်၎င်းသည်အချို့သောသွယ်ဝိုက်သောပြ problems နာများဖြစ်စေလိမ့်မည်။ ဤဆောင်းပါးသည်ခွဲခြမ်းစိတ်ဖြာပြီးဥပမာများပေးလိမ့်မည်။

1 ။ stmtt_init ၏အခြေခံအသုံးပြုမှု () နှင့် ပြင်ဆင်ခြင်း ()

များသောအားဖြင့်ကျွန်ုပ်တို့၏ကုဒ်ဖွဲ့စည်းပုံသည်ဤကဲ့သို့ဖြစ်သည်။

 $mysqli = new mysqli("localhost", "user", "password", "database");
$stmt = $mysqli->stmt_init();
$stmt->prepare("SELECT * FROM users WHERE id = ?");

အတွက်

  • stmtt_init () MySQLI_STMT အရာဝတ်ထုကိုအစပြုသည်။

  • ကြိုတင်ပြင်ဆင်မှု () SQL ကြေငြာချက်ကိုပြင်ဆင်ပြီးအရာဝတ်ထုကိုချည်ထားသည်။

2 ။ သင် ကြိုတင်ပြင်ဆင် ရန်မေ့သွားလျှင်ဘာဖြစ်မည်နည်း။

အကယ်. သင်သည် stmt_init () ကို သာခေါ်ဆိုပါက, ပြင်ဆင်ခြင်းကို အောက်ပါကြေငြာချက်တွင်ဖော်ပြချက်ကိုအသုံးပြုသည့်အခါ Program ကိုအသုံးပြုသောအခါအောက်ပါပြ problems နာအမျိုးအစားများပေါ်ပေါက်လာလိမ့်မည်။

1 ။ နည်းလမ်းခေါ်ဆိုမှုအမှား

Bind_param ကဲ့သို့သောခေါ်ဆိုမှုများကိုခေါ်ဆိုခြင်း () သည်မခေါ်ဘဲတိုက်ရိုက် လုပ်ဆောင်ခြင်း () တိုက်ရိုက်လုပ်ဆောင်ခြင်း () တိုက်ရိုက်လုပ်ဆောင်ခြင်း () သည် သတိပေးချက်များကိုပစ်ချခြင်းသို့မဟုတ်ဆိုးဝါးသောအမှားများကိုပင်ဖြစ်ပေါ်စေလိမ့်မည်။

 $mysqli = new mysqli("localhost", "user", "password", "database");
$stmt = $mysqli->stmt_init();
// ခေါ်ဆိုရန်မေ့လျော့ prepare()

$stmt->bind_param("i", $userId); // ဒီမှာအမှားတစ်ခုသတင်းပို့လိမ့်မည်
$stmt->execute();                // ဒါကြောင့်လည်းဒီမှာကျရှုံးပါလိမ့်မယ်

အမှားသတင်းစကားဖြစ်နိုင်သည်

 Fatal error: Uncaught Error: Call to a member function bind_param() on bool

သို့မဟုတ်:

 Warning: mysqli_stmt::bind_param(): invalid object or not initialized

2 ။ Syntax အမှားများကိုရှာမရပါ

အကယ်. သင်သည်အရာဝတ်ထုကိုအသေးအဖွဲအရာဝတ်ထုကိုအစပြုနိုင်သော်လည်း ကြိုတင်ပြင်ဆင်မှု ( ) တွင်တွေ့နိုင်သော SQL အမှားများကိုလျှို့ဝှက်ထားလိမ့်မည်။ ဤသည် debugging ကုန်ကျစရိတ်တိုးပွားစေပါသည်။

3 ။ လုံခြုံရေးအန္တရာယ်များ

ကြိုတင်ပြင်ဆင်ရန်မေ့နေခြင်း () သင် SQL ထုတ်ပြန်ချက်များကိုတိုက်ရိုက်ဖြည့်ဆည်းပေးနိုင်သည်။ ဥပမာအားဖြင့်:

 // အမှားဥပမာ(မဟုတ် prepare)
$userId = $_GET['id'];
$query = "SELECT * FROM users WHERE id = $userId";
$result = $mysqli->query($query);

ပြင်ဆင်ထားပါက () နှင့် parameter စည်းနှောင်ခြင်းသည်မရရှိနိုင်ပါကအသုံးပြုသူထည့်သွင်းမှုကို SQL တွင်တိုက်ရိုက်ထည့်သွင်းထားလိမ့်မည်။ တိုက်ခိုက်သူသည်အောက်ပါ URL ကိုတည်ဆောက်နိုင်သည်။

 https://m66.net/get_user.php?id=1 OR 1=1

ဒေတာချိုးဖောက်မှုများဖြစ်ပေါ်စေပါလိမ့်မယ်။

3 ။ လုပ်ဖို့မှန်ကန်သောနည်းလမ်း

အမြဲတမ်း stmt_init () ကို အသုံးပြု. အောက်ပါအတိုင်း ပြင်ဆင်ပါ

 $mysqli = new mysqli("localhost", "user", "password", "database");

$stmt = $mysqli->stmt_init();
if ($stmt->prepare("SELECT * FROM users WHERE id = ?")) {
    $stmt->bind_param("i", $userId);
    $stmt->execute();
    $result = $stmt->get_result();
    while ($row = $result->fetch_assoc()) {
        echo $row['username'] . "<br>";
    }
    $stmt->close();
} else {
    echo "SQL prepare အမှား: " . $mysqli->error;
}

4 ။ အကျဉ်းချုပ်

ကြိုတင်ပြင်ဆင်မှု ()) ကိုမေ့နေခြင်း () သည်အောက်ပါပြ problems နာများကိုဖြစ်ပေါ်စေလိမ့်မည်။

  • အခြားကြေညာချက်နည်းလမ်းများဟုခေါ်ဆိုနေစဉ်အမှားတစ်ခုဖြစ်ပွားခဲ့သည်။

  • SQL အမှားများကိုကြိုတင်မရရှိနိုင်ပါ။

  • ထိုကဲ့သို့သော SQL ထိုးခြင်းကဲ့သို့သောလုံခြုံရေးဆိုင်ရာအန္တရာယ်များကိုတိုးမြှင့်။

ကြိုတင်ပြင်ဆင်ရန် () stmt_init ကိုအသုံးပြုပြီး နောက်ချက်ချင်းပင်ကြိုတင်ပြင်ဆင်ရန်အကြံပြုသည်။