PDO (PHP Data Obserts) သည်ဒေတာဘေ့စ်စီမံခန့်ခွဲမှုစနစ်များ (DBMSS) နှင့်အပြန်အလှန်ဆက်သွယ်ခွင့်ပြုသည့်ဒေတာဘေ့စ်များကိုရယူရန်အတွက် interface တစ်ခုဖြစ်သည်။ PDO ကို အသုံးပြုခြင်း၏အဓိကလက်ခဏာတစ်ခုမှာပြင်ဆင်ထားသည့်ထုတ်ပြန်ချက်များမှတစ်ဆင့်မေးမြန်းချက်များကိုလုပ်ဆောင်နိုင်စွမ်းဖြစ်သည်။ ဤချဉ်းကပ်နည်းသည်စွမ်းဆောင်ရည်တိုးတက်လာရုံသာမက SQL injection တိုက်ခိုက်မှုများကိုထိထိရောက်ရောက်ကာကွယ်နိုင်သည်။
ကြိုတင်အသုံးချခြင်းထုတ်ပြန်ချက်များကိုအများအားဖြင့်အဆင့်နှစ်ဆင့်ခွဲထားသည်။
တိကျသည် - sql ထုတ်ပြန်ချက်များ,
Execution : addute () နည်းလမ်းကို placeholder အစားအမှန်တကယ်ဒေတာကို အသုံးပြု. execute () နည်းလမ်းကိုခေါ်ဆိုခြင်းဖြင့်လုပ်ဆောင်ပါ။
<span><span><span class="hljs-comment">// ဖန်တီး PDO နမူနာ</span></span><span>
</span><span><span class="hljs-variable">$pdo</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">PDO</span></span><span>(</span><span><span class="hljs-string">'mysql:host=localhost;dbname=test'</span></span><span>, </span><span><span class="hljs-string">'root'</span></span><span>, </span><span><span class="hljs-string">''</span></span><span>);
</span><span><span class="hljs-comment">// တလံဒေသကြီးနာ SQL အသေအချာပေြာဆိုချက်</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$pdo</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 id = :id"</span></span><span>);
</span><span><span class="hljs-comment">// parameters တွေကိုခညျြနှောငျခြင်းနှင့် quent ကို execute</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-string">'id'</span></span><span> => </span><span><span class="hljs-number">1</span></span><span>]);
</span></span>
မခေါ်ဆိုမီ () , parameter binding ကိုမည်သို့အသုံးပြုရမည်ကိုနားလည်ရန်အလွန်အရေးကြီးသည်။ PDO သည်ဘုံအရံသမားနှစ်ယောက်ကိုထောက်ပံ့ပေးသည်။
Placeholders ဟုခေါ်သော - ဥပမာ - ကုဒ်၏ဖတ်နိုင်မှုနှင့်ထိန်းသိမ်းခြင်းကိုတိုးတက်စေနိုင်သော ID ကဲ့သို့သော ID ကဲ့သို့ဖြစ်သည်။
Mark PlaceH PlaceH PlaceHTERORE : ဥပမာ - ကဲ့သို့သောအခြေအနေများမှတစ်ဆင့် parameters တွေကိုချည်နှောင်ထားသည်။
<span><span><span class="hljs-comment">// အမည်ရှိ placeholders ကိုသုံးပါ</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$pdo</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 id = :id"</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-string">'id'</span></span><span> => </span><span><span class="hljs-number">1</span></span><span>]);
</span><span><span class="hljs-comment">// မေးခွန်း Mark placeholders မေးခွန်းကိုသုံးပါ</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$pdo</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 id = ?"</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-number">1</span></span><span>]);
</span></span>
execute () ကို ခေါ်ဆိုသောအခါအမှားကိုင်တွယ်သည်အထူးအရေးကြီးသည်။ PDO သည်အမှားအယွင်းများကိုပုံမှန်အားဖြင့်သတိပေးချက်များဖြင့်ပစ်ချသည် ။ ပရိုဂရမ်၏ကြံ့ခိုင်မှုကိုသေချာစေရန်, အမှားကိုင်တွယ်ဘို့ခြွင်းချက် mode ကိုအသုံးပြုရန်အကြံပြုသည်။
<span><span><span class="hljs-variable">$pdo</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">PDO</span></span><span>(</span><span><span class="hljs-string">'mysql:host=localhost;dbname=test'</span></span><span>, </span><span><span class="hljs-string">'root'</span></span><span>, </span><span><span class="hljs-string">''</span></span><span>);
</span><span><span class="hljs-variable">$pdo</span></span><span>-></span><span><span class="hljs-title function_ invoke__">setAttribute</span></span><span>(PDO::</span><span><span class="hljs-variable constant_">ATTR_ERRMODE</span></span><span>, PDO::</span><span><span class="hljs-variable constant_">ERRMODE_EXCEPTION</span></span><span>);
</span></span>
ဤနည်းအားဖြင့်အမှားအယွင်းများသည်ကွပ်မျက်ခံရစဉ် (ဥပမာ SQL အမှားများသို့မဟုတ် parameter rom orоментияဆိုင်ရာပြ issues နာများ) တွင်ပေါ်ပေါက်လာပါက PDO သည်ပရိုဂရမ်မာကိုဖမ်းနိုင်ပြီးကိုင်တွယ်နိုင်သည်။
<span><span><span class="hljs-keyword">try</span></span><span> {
</span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$pdo</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 id = :id"</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-string">'id'</span></span><span> => </span><span><span class="hljs-number">1</span></span><span>]);
} </span><span><span class="hljs-keyword">catch</span></span><span> (PDOException </span><span><span class="hljs-variable">$e</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Error: "</span></span><span> . </span><span><span class="hljs-variable">$e</span></span><span>-></span><span><span class="hljs-title function_ invoke__">getMessage</span></span><span>();
}
</span></span>
Execute () နည်းလမ်းကို parameters များကိုဖြတ်သန်းသွားသော parameters များသည် SQL ကြေညာချက်တွင်ဒေတာအမျိုးအစားနှင့်ကိုက်ညီကြောင်းသေချာစေပါ။ ဥပမာအားဖြင့်, ဒေတာဘေ့စ်စားပွဲရှိကွက်လပ်တစ်ခုရှိသည့်ကွက်လပ်တစ်ခုသည်ကိန်းဂဏန်းများကိုအမျိုးအစားတစ်ခုဖြစ်ပါကကိန်းဂဏန်းများအနေဖြင့်သတ်မှတ်ထားသည့်အခါကိန်းဂဏန်းအမျိုးအစားများကိုထုတ်ပြန်သင့်သည်။
<span><span><span class="hljs-comment">// အမှား:ကိန်းအစား string ကိုဖြတ်သန်း</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$pdo</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 id = :id"</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-string">'id'</span></span><span> => </span><span><span class="hljs-string">'one'</span></span><span>]);
</span><span><span class="hljs-comment">// မှန်ကန်သော:传递မှန်ကန်သော的数据类型</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$pdo</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 id = :id"</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-string">'id'</span></span><span> => </span><span><span class="hljs-number">1</span></span><span>]);
</span></span>
တစ်ခါတစ်ရံတွင်ကျွန်ုပ်တို့သည်တူညီသော SQL ထုတ်ပြန်ကြေငြာချက်ကိုအကြိမ်ကြိမ်အလားတူအကြိမ်ကြိမ်လုပ်ဆောင်ရန်လိုအပ်သည်။ ဤကိစ္စတွင်သင်ကွဲပြားခြားနားသော parameters တွေကိုနှင့်အတူစုံစမ်းမှုတစ်ခုချင်းစီကိုအကြိမ်ကြိမ်အကောင်အထည်ဖော်ရန် execute () ကို သုံးနိုင်သည်, သို့သော် ကွပ်မျက်ခံရ တိုင်းယခင်က binde သတင်းအချက်အလက်များကိုရှင်းရှင်းလင်းလင်းဖော်ပြလိမ့်မည်ကိုသတိပြုသင့်သည်။ ထို့ကြောင့် SQL ကိုအကြိမ်ပေါင်းများစွာအတူတူပင်ပန်းစွာလုပ်ဆောင်သောအခါ parameters တွေကိုအချိန်တိုင်းပြန်လည်ပတ်ရန်အကြံပြုသည်။
<span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$pdo</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 age = :age"</span></span><span>);
</span><span><span class="hljs-variable">$ages</span></span><span> = [</span><span><span class="hljs-number">20</span></span><span>, </span><span><span class="hljs-number">30</span></span><span>, </span><span><span class="hljs-number">40</span></span><span>];
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$ages</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$age</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-string">'age'</span></span><span> => </span><span><span class="hljs-variable">$age</span></span><span>]);
</span><span><span class="hljs-comment">// အပြောင်းအလဲများရလဒ်များ</span></span><span>
}
</span></span>
execute () ၏ပြန်အမ်းငွေ () နည်းလမ်း () နည်းလမ်းကိုနည်းလမ်းကတော့အောင်မြင်မှုအောင်မြင်မှုရှိမရှိဖော်ပြသည်။ Select Selecties အတွက်ရှာဖွေမှုရလဒ်များရရန် fetch သို့မဟုတ် fetchall နည်းလမ်းကိုအသုံးပြုရန်လိုအပ်သည်။
<span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$pdo</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 id = :id"</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-string">'id'</span></span><span> => </span><span><span class="hljs-number">1</span></span><span>]);
</span><span><span class="hljs-comment">// တစ်ခုတည်းလိုင်းရလဒ်များကိုရယူပါ</span></span><span>
</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__">fetch</span></span><span>(PDO::</span><span><span class="hljs-variable constant_">FETCH_ASSOC</span></span><span>);
</span><span><span class="hljs-comment">// ရလဒ်အားလုံးကိုရယူပါ</span></span><span>
</span><span><span class="hljs-variable">$results</span></span><span> = </span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">fetchAll</span></span><span>(PDO::</span><span><span class="hljs-variable constant_">FETCH_ASSOC</span></span><span>);
</span></span>
သတိပြု သင့်သည် () သည် query ရလဒ်ကိုအလိုအလျောက်ပြန်ပို့လိမ့်မည်မဟုတ်ကြောင်းသတိပြုသင့်သည်။ ၎င်းသည် SQL ထုတ်ပြန်ချက်များကိုအကောင်အထည်ဖော်ရန်သာတာ 0 န်ရှိသည် ။
Execute () ကို အသုံးပြုသည့်အခါ (), ပရိုဂရမ်မာများသည်အောက်ပါတို့အမှားများကိုကြုံတွေ့ရတတ်သည်။
parameter type mispatch : SQL ရှိဒေတာအမျိုးအစားသည် butt parameter ၏ဒေတာအမျိုးအစားနှင့်ကိုက်ညီကြောင်းသေချာပါစေ။
parameters တွေကို binding ကိုမေ့လျော့ SQL ကြေငြာချက်နှင့် execute လုပ်ခြင်း () parameterscers များကတစ် ဦး ချင်းစီကိုက်ညီမှုရှိမရှိစစ်ဆေးပါ။
မှားယွင်းသော SQL syntax : အထူးသဖြင့် placewers များကိုအသုံးပြုသောအခါ SQL syntax မှန်ကန်မှုကိုသေချာအောင်လုပ်ပါ။
PDostatement Object တွင် အကြိမ်ကြိမ် အကောင်အထည်ဖော်သည့် အခါ pdostatement အရာဝတ်ထုကိုအကြိမ်ကြိမ်အကောင်အထည်ဖော်သည့်အခါ parameters များကိုအချိန်တိုင်းကွပ်မျက်ရန်သေချာစေပါ။
ဤပြ problems နာများကိုရှောင်ရှားရန် SQL ထုတ်ပြန်ချက်များ, parameter များနှင့်အချက်အလက်များနှင့်ဒေတာအမျိုးအစားများကိုဂရုတစိုက်စစ်ဆေးရန် () မခေါ်မီ () ။
PDostatement :: PDOSTATTETESS ကိုမခေါ်မီ () လုပ်ထုံးလုပ်နည်းများကိုလုပ်ဆောင်ခြင်း၏လုပ်ရပ်၏လုပ်ရပ်များကိုနားလည်ရန်အလွန်အရေးကြီးသည်။ parameter ၏စည်းလုံးမှုနည်းပါးခြင်း, ဤဗဟုသုတကိုကျွမ်းကျင်ခြင်းသည် code ၏လုံခြုံရေးနှင့်စွမ်းဆောင်ရည်ကိုမြှင့်တင်ပေးရုံသာမကသာမန်အမှားများကိုဖြစ်ပေါ်စေနိုင်ပြီးကုဒ်၏ထိန်းသိမ်းမှုကိုတိုးမြှင့်စေသည်။ ဤအမှားများကိုရှောင်ရှားခြင်းအားဖြင့် developer များပိုမိုထိရောက်သောနှင့်ခိုင်မာတဲ့ဒေတာဘေ့စစစ်ဆင်ရေးကုဒ်များကိုရေးနိုင်ပါတယ်။