PHP ၏ MySQLI လုပ်ငန်းများအတွက် PHP ၏ MySQLI extension ကိုအသုံးပြုသောအခါကြိုတင်ပြင်ဆင်ထားသည့်ထုတ်ပြန်ချက်များသည်ဘုံနှင့်လုံခြုံစိတ်ချရသောအလေ့အကျင့်တစ်ခုဖြစ်သည်။ developer များအများအားဖြင့် MySQLI :: stmt_init () stmt_init () stmt_init ( ) ကိုအသုံးပြုသည်။ သို့သော် ကြိုတင်ပြင်ဆင်မှုကို အကောင်အထည်ဖော်ရန်သင်မေ့နေလျှင်, stmt_init ကိုခေါ်ပြီးနောက် ( ) ကိုခေါ်ယူပြီးနောက်၎င်းသည်အချို့သောသွယ်ဝိုက်သောပြ problems နာများဖြစ်စေလိမ့်မည်။ ဤဆောင်းပါးသည်ခွဲခြမ်းစိတ်ဖြာပြီးဥပမာများပေးလိမ့်မည်။
များသောအားဖြင့်ကျွန်ုပ်တို့၏ကုဒ်ဖွဲ့စည်းပုံသည်ဤကဲ့သို့ဖြစ်သည်။
$mysqli = new mysqli("localhost", "user", "password", "database");
$stmt = $mysqli->stmt_init();
$stmt->prepare("SELECT * FROM users WHERE id = ?");
အတွက်
stmtt_init () MySQLI_STMT အရာဝတ်ထုကိုအစပြုသည်။
ကြိုတင်ပြင်ဆင်မှု () SQL ကြေငြာချက်ကိုပြင်ဆင်ပြီးအရာဝတ်ထုကိုချည်ထားသည်။
အကယ်. သင်သည် stmt_init () ကို သာခေါ်ဆိုပါက, ပြင်ဆင်ခြင်းကို အောက်ပါကြေငြာချက်တွင်ဖော်ပြချက်ကိုအသုံးပြုသည့်အခါ Program ကိုအသုံးပြုသောအခါအောက်ပါပြ problems နာအမျိုးအစားများပေါ်ပေါက်လာလိမ့်မည်။
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
အကယ်. သင်သည်အရာဝတ်ထုကိုအသေးအဖွဲအရာဝတ်ထုကိုအစပြုနိုင်သော်လည်း ကြိုတင်ပြင်ဆင်မှု ( ) တွင်တွေ့နိုင်သော SQL အမှားများကိုလျှို့ဝှက်ထားလိမ့်မည်။ ဤသည် debugging ကုန်ကျစရိတ်တိုးပွားစေပါသည်။
ကြိုတင်ပြင်ဆင်ရန်မေ့နေခြင်း () သင် 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
ဒေတာချိုးဖောက်မှုများဖြစ်ပေါ်စေပါလိမ့်မယ်။
အမြဲတမ်း 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;
}
ကြိုတင်ပြင်ဆင်မှု ()) ကိုမေ့နေခြင်း () သည်အောက်ပါပြ problems နာများကိုဖြစ်ပေါ်စေလိမ့်မည်။
အခြားကြေညာချက်နည်းလမ်းများဟုခေါ်ဆိုနေစဉ်အမှားတစ်ခုဖြစ်ပွားခဲ့သည်။
SQL အမှားများကိုကြိုတင်မရရှိနိုင်ပါ။
ထိုကဲ့သို့သော SQL ထိုးခြင်းကဲ့သို့သောလုံခြုံရေးဆိုင်ရာအန္တရာယ်များကိုတိုးမြှင့်။
ကြိုတင်ပြင်ဆင်ရန် () stmt_init ကိုအသုံးပြုပြီး နောက်ချက်ချင်းပင်ကြိုတင်ပြင်ဆင်ရန်အကြံပြုသည်။