MySQLI_STMM :: ပြင်ဆင်ခြင်း သည် SQL ထုတ်ပြန်ချက်များကို MySQLI extension တွင်အသုံးပြုသောနည်းလမ်းဖြစ်သည်။ Preprocessing ထုတ်ပြန်ချက်များသည် SQL query strings များကိုတိုက်ရိုက် အသုံးပြု. SQL Injection ၏အန္တရာယ်ကိုလျော့နည်းစေသည်။ ဘာဖြစ်လို့လဲဆိုတော့ SQL ကိုကွပ်မျက်တဲ့အတွက်အသုံးပြုသူမှအကြောင်းအရာ input ကို query string ထဲကိုတိုက်ရိုက်မကွဲသေးပေမယ့်စည်းနှောင်တဲ့ parameter တစ်ခုအနေနဲ့သွားတယ်။
<span><span><span class="hljs-variable">$conn</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">mysqli</span></span><span>(</span><span><span class="hljs-variable">$host</span></span><span>, </span><span><span class="hljs-variable">$user</span></span><span>, </span><span><span class="hljs-variable">$password</span></span><span>, </span><span><span class="hljs-variable">$database</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$conn</span></span><span>->connect_error) {
</span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"Connection failed: "</span></span><span> . </span><span><span class="hljs-variable">$conn</span></span><span>->connect_error);
}
</span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$conn</span></span><span>-></span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-string">"SELECT * FROM users WHERE username = ? AND password = ?"</span></span><span>);
</span></span>
အထက်ပါကုဒ်တွင် SQL query တွင်မေးခွန်းနှစ်ခု ( ? ) တွင်နောက်ဆက်တွဲ parameteters များကိုလက်ခံသည့် placeholders များဖြစ်သော Placeholders များဖြစ်သည်။
Preprocessing ကြေငြာချက်တွင်အသုံးပြုသူထည့်သွင်းထားသောတန်ဖိုးကို placeholder သို့ချည်နှောင်ရန် bind_param () နည်းလမ်းကိုသုံးပါ။ ဤအချိန်တွင်ခညျြနှောငျ parameter တန်ဖိုးကို SQL ကြေငြာချက်သို့တိုက်ရိုက်ထည့်သွင်းလိမ့်မည်မဟုတ်ပါ။ bind_param () နည်းလမ်းသည် parameters နှစ်ခုလိုအပ်သည် - အချက်အလက်အမျိုးအစားနှင့်ချည်နှောင်ထားသည့် variable ကို variable-parameter နှစ်ခုလိုအပ်သည်။
ဘုံဒေတာအမျိုးအစား specifier များမှာ -
i : Integer (Int)
D : နှစ်ဆတိကျင်းရေပေါ်အချက်များ (နှစ်ဆ)
S : String (string)
B : Blob (binary data)
<span><span><span class="hljs-variable">$username</span></span><span> = </span><span><span class="hljs-string">'john_doe'</span></span><span>;
</span><span><span class="hljs-variable">$password</span></span><span> = </span><span><span class="hljs-string">'password123'</span></span><span>;
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">bind_param</span></span><span>(</span><span><span class="hljs-string">'ss'</span></span><span>, </span><span><span class="hljs-variable">$username</span></span><span>, </span><span><span class="hljs-variable">$password</span></span><span>);
</span></span>
ဤဥပမာတွင် 'SS' ဆိုသည်မှာ parameters များကိုနှစ်ခုလုံးချည်နှောင်ခြင်းအမျိုးအစားများဖြစ်သည်။ အဆိုပါ parameters တွေကို $ အသုံးပြုသူအမည် နှင့် $ စကားဝှက်ကို SQL query အတွက် placeholders မှလုံခြုံစွာခညျြနှောငျလိမ့်မည်။
Parameter သည်စည်းနှောင်ပြီးပါပြီ, execute () နည်းလမ်းကို Proprocessing Statement ကို Execute လုပ်ရန်ဟုခေါ်တွင်သည်။ အကယ်. ချည်နှောင်ထားသော parameter type အမျိုးအစားမှန်ကန်ပါက Execution ကြေငြာချက်သည်ပုံမှန်အားဖြင့်လည်ပတ်လိမ့်မည်။
<span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">execute</span></span><span>();
</span></span>
Execute () နည်းလမ်းသည်ကြေညာချက်ကိုအောင်မြင်စွာကွပ်မျက်ခံရခြင်းရှိမရှိညွှန်ပြသည့် boolean value ကိုပြန်ပို့သည်။ အကယ်. သင်သည်စုံစမ်းမှုရလဒ်များရရန်လိုအပ်ပါက Execution ရလဒ်များရရန် Get_result ()) နည်းလမ်းကိုသုံးနိုင်သည်။
Selected ထုတ်ပြန်ချက်များအတွက် Preprocessing ထုတ်ပြန်ချက်ကိုအကောင်အထည်ဖော်ပြီးနောက်သင်ဟာများသောအားဖြင့်စုံစမ်းမှု၏ရလဒ်ကိုရရန်လိုအပ်သည်။ query ကို mySQLI_RESult Object သို့ပြောင်းရန် get_result () နည်းလမ်းကိုသုံးပါ။
<span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">get_result</span></span><span>();
</span><span><span class="hljs-keyword">while</span></span><span> (</span><span><span class="hljs-variable">$row</span></span><span> = </span><span><span class="hljs-variable">$result</span></span><span>-></span><span><span class="hljs-title function_ invoke__">fetch_assoc</span></span><span>()) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$row</span></span><span>[</span><span><span class="hljs-string">'username'</span></span><span>] . </span><span><span class="hljs-string">' - '</span></span><span> . </span><span><span class="hljs-variable">$row</span></span><span>[</span><span><span class="hljs-string">'email'</span></span><span>] . </span><span><span class="hljs-string">'<br>'</span></span><span>;
}
</span></span>
ဤဥပမာတွင် query ရလဒ်များကို Row နှင့် Username နှင့် Email မှထုတ်ယူသည်။
Prosprocessing ထုတ်ပြန်ချက်များသည် SQL Injection ကိုတားဆီးနိုင်သော်လည်းအမှန်တကယ်ဖွံ့ဖြိုးတိုးတက်မှုတွင်အမှားအယွင်းများစွာကြုံတွေ့ရဆဲဖြစ်နိုင်သည်။ ထိရောက်သော debugging အတွက်ကျွန်ုပ်တို့သည်သက်ဆိုင်ရာအမှားသတင်းအချက်အလက်ရရန် အမှား နည်းလမ်းကိုသုံးနိုင်သည်။
<span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$stmt</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">'Error preparing statement: '</span></span><span> . </span><span><span class="hljs-variable">$conn</span></span><span>->error);
}
</span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">execute</span></span><span>()) {
</span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">'Execute error: '</span></span><span> . </span><span><span class="hljs-variable">$stmt</span></span><span>->error);
}
</span></span>
ဒေတာဘေ့စ် connection နှင့် Execute ထုတ်ပြန်ချက်များအတွက်အမှားအချက်အလက်များကိုဖမ်းယူရန် Conn-> Error နှင့် stmt-> အမှားများကို ဤတွင်အသုံးပြုသည်။ ၎င်းသည်ပြ problems နာများကိုအချိန်မီရှာဖွေရန်နှင့်ဖြေရှင်းရန်ကူညီပေးနိုင်သည်။
Preprocessing ထုတ်ပြန်ချက်ကိုအသုံးပြုပြီးနောက်အရင်းအမြစ်များကိုလွတ်မြောက်ရန်ကြေငြာချက်နှင့်ဒေတာဘေ့စ်ဆက်သွယ်မှုကိုပိတ်ရန် အနီးကပ် () နည်းလမ်းကိုကျွန်ုပ်တို့ခေါ်ဆိုရန်လိုအပ်သည်။
<span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">close</span></span><span>();
</span><span><span class="hljs-variable">$conn</span></span><span>-></span><span><span class="hljs-title function_ invoke__">close</span></span><span>();
</span></span>
၎င်းသည်ကောင်းမွန်သောပရိုဂရမ်းမင်းအလေ့အထတစ်ခုသာမကအရင်းအမြစ်ယိုစိမ့်မှုများကိုထိရောက်စွာရှောင်ရှားနိုင်သည်။
သက်ဆိုင်သောတက်(ဂ်)များ:
mysqli_stmt