PHP တွင် SPRINTF function ကို formatt လုပ်ထားသောကြိုးများကိုတည်ဆောက်ရန်အသုံးပြုသည်။ သို့သော် SQL Query များကိုတည်ဆောက်ရန် Sprintf ကို တိုက်ရိုက်အသုံးပြုသောအခါအပိုသတိထားရန်လိုအပ်သည်။ အောက်တွင်ကျွန်ုပ်တို့သည် SPRINTF ကို အသုံးပြု. SQL Query များကိုတည်ဆောက်ရာတွင် SQL Query များနှင့်အကောင်းဆုံးအလေ့အကျင့်များကိုတည်ဆောက်ရာတွင်ဘုံအားနည်းချက်များသို့ 0 င်ရောက်မည်ဖြစ်သည်။
SQL Query များကိုတည်ဆောက်ရန် Sprintf ကို အသုံးပြုသောအခါအကြီးမားဆုံးပြ problems နာများထဲမှတစ်ခုမှာ SQL injection အားနည်းချက်ဖြစ်သည်။ Sprintf သည် အသုံးပြုသူ input ကိုအလိုအလျောက်မလုပ်ဆောင်နိုင်ပါက၎င်းသည်ထည့်သွင်းမှုများကို string တစ်ခုထဲသို့ထည့်ပြီးထည့်သွင်းထားသည်။
ဥပမာ -
$userId = $_GET['user_id'];
$sql = sprintf("SELECT * FROM users WHERE user_id = %d", $userId);
အကယ်. $ သုံးစွဲသူသည် 1 သို့မဟုတ် 1 = 1 ကဲ့သို့သောအန္တရာယ်ရှိသော input ကိုဖြစ်လျှင်၎င်းသည်မေးမြန်းမှုကိုဖြစ်လာစေရန်ဖြစ်ပေါ်စေလိမ့်မည်။
SELECT * FROM users WHERE user_id = 1 OR 1=1
၎င်းသည်အသုံးပြုသူအချက်အလက်အားလုံးကိုပြန်ပို့ပေးလိမ့်မည်။
ဖြေရှင်းချက် - SQL Injection ကိုရှောင်ရှားရန် SQL ကိုတိုက်ရိုက်ခွဲခြားမည့်အစားဖော်ပြချက်များကိုပြင်ဆင်သင့်သည်။ Sprintf အဆင်ပြေသော်လည်း SQL injection ကိုမတားဆီးနိုင်ပါ။ PDO သို့မဟုတ် MySQLI မှပြင်ဆင်ထားသောပြင်ဆင်ထားသည့်ထုတ်ပြန်ချက်များကိုအသုံးပြုရန်အလုံခြုံဆုံးနည်းလမ်း။
// အသုံးပြု PDO ကြိုတင်ပြင်ဆင်မှုများ
$stmt = $pdo->prepare("SELECT * FROM users WHERE user_id = :user_id");
$stmt->execute(['user_id' => $userId]);
Sprintf function သည် variable များကိုထည့်ရန် format strings ကိုအသုံးပြုသည်။ ၎င်းသည်ပုံစံချခြင်းအမှားများကိုဖြစ်ပေါ်စေနိုင်သည်။ ဥပမာအားဖြင့်, ကျွန်ုပ်တို့သည် string ကိုထည့်သောအခါ, ကိုးကားချက်များကိုမှန်ကန်စွာမလုပ်ဆောင်ပါက၎င်းသည် SQL syntax အမှားအယွင်းများကိုပိုမိုပြင်းထန်စွာထုတ်ဖော်ပြောဆိုခြင်းသို့မဟုတ်ဆေးထိုးမှုအားနည်းချက်များကိုပိုမိုပြင်းထန်စွာမိတ်ဆက်ပေးနိုင်သည်။
ဥပမာ -
$username = "O'Reilly";
$sql = sprintf("SELECT * FROM users WHERE username = '%s'", $username);
အထက်ပါကုဒ်သည် query သို့ query ကို ထည့်ပြီးအောက်ပါ SQL ကိုထုတ်လုပ်လိမ့်မည်။
SELECT * FROM users WHERE username = 'O'Reilly'
၎င်းသည်တစ်ခုတည်းသောကိုးကားချက်များမှန်ကန်စွာမလွတ်မြောက်သောကြောင့်၎င်းသည် SQL အမှားများကိုဖြစ်ပေါ်စေသည်။
ဖြေရှင်းချက် - ဒီရှောင်ရှားရန် addslashes () သို့မဟုတ် mysqli_real_real_esal_escape_String () အသုံးပြုသူမှထည့်သွင်းထားသောအထူးအက္ခရာများမှလွတ်မြောက်ရန်အသုံးပြုနိုင်သည်။ ပိုမိုကောင်းမွန်သောချဉ်းကပ်နည်းသည်ထွက်ပြေးရန်အလိုအလျောက်ကိုင်တွယ်မည့်ပြင်ဆင်မှုထုတ်ပြန်ချက်များကိုအသုံးပြုရန်ဖြစ်သည်။
// အသုံးပြု mysqli ၏လွတ်မြောက်မှု
$username = mysqli_real_escape_string($conn, $username);
$sql = sprintf("SELECT * FROM users WHERE username = '%s'", $username);
သို့သော်အစောပိုင်းတွင်ဖော်ပြခဲ့သည့်အတိုင်းကြိုတင်ပြင်ဆင်ထားသည့်ထုတ်ပြန်ချက်များသည်ပိုမိုအကြံပြုထားသောချဉ်းကပ်နည်းဖြစ်သည်။
Integers ကို format လုပ်ဖို့ % d ကိုသုံးတဲ့အခါဒါမှမဟုတ် floating point နံပါတ်များကို format လုပ်ဖို့ % f ကို သုံးပါ။ ကိန်းဂဏန်းများနှင့်မပြည့်စုံသောအချက်မဟုတ်သည့် variable တစ်ခုဖြစ်ပါက Sprintf သည် မမျှော်လင့်သောရလဒ်များကိုထုတ်ယူနိုင်သည်။
ဥပမာ -
$price = "99.99";
$sql = sprintf("SELECT * FROM products WHERE price = %f", $price);
$ စျေးနှုန်း သည် string တစ်ခုဖြစ်သော်လည်း % f သည် floating နံပါတ်ကိုမျှော်လင့်ပါသည်။ ၎င်းသည်မ မျှော် လင့်သောရလဒ်များကိုဖြစ်ပေါ်စေနိုင်သည်,
ဖြေရှင်းချက် - လိုအပ်ချက်များကိုဖြည့်ဆည်းရန်သေချာစေရန်ကြိုတင်မြင်နိုင်သောအမျိုးအစားကိုစစ်ဆေးရန်အကောင်းဆုံးဖြစ်သည်။ ဥပမာအားဖြင့်, floating နံပါတ်များကိုပြောင်းလဲ:
$price = (float)$price;
$sql = sprintf("SELECT * FROM products WHERE price = %f", $price);
String နှင့် Date Fields များသည် SQL Query တွင်မကြာခဏပါဝင်လေ့ရှိသည်။ String fields များကိုတစ်ခုတည်းကိုးကားချက်များ ( ' ) ကိုပေးရန်လိုအပ်ပြီးရက်စွဲအကွက်များကိုသင့်လျော်သောပုံစံဖြင့်ပေးရန်လိုအပ်သည်။ အကယ်. သင်သည်ဤကွက်လပ်များကို Sprintf ကို တိုက်ရိုက် အသုံးပြု. တိုက်ရိုက်ထည့်သွင်းပါကကိုးကားချက်များထည့်ရန်သို့မဟုတ်မှားယွင်းသောနေ့စွဲပုံစံကိုသုံးရန်မေ့နေနိုင်သည်။
ဥပမာ -
$date = '2023-04-22';
$sql = sprintf("SELECT * FROM events WHERE event_date = %s", $date);
အထက်ဖော်ပြပါကုဒ်များမှထုတ်လုပ်သောစုံစမ်းမှုကို $ နေ့စွဲကို ကိုးကားခြင်းဖြင့် 0 င်ရောက်ခြင်းမရှိသောကြောင့်အမှားများကိုမှားယွင်းစေနိုင်သည်။
SELECT * FROM events WHERE event_date = 2023-04-22
၎င်းကို SQL မှမှားယွင်းသော syntax သို့ခွဲထုတ်လိမ့်မည်။
ဖြေရှင်းချက် - ရက်စွဲနှင့် string နယ်ပယ်များကိုသင့်လျော်စွာအသုံးပြုခြင်းသို့မဟုတ်အသုံးချသည့်ထုတ်ပြန်ချက်များကိုအလိုအလျောက်လုပ်ဆောင်ရန်သို့မဟုတ်အသုံးပြုပါ။
// ရက်စွဲနှင့်ကိုးကားပုံစံ
$sql = sprintf("SELECT * FROM events WHERE event_date = '%s'", $date);
အကယ်. သင်သည် Sprintf ကို URL တစ်ခုကိုတည်ဆောက်ရန်အသုံးပြုပါကအထူးအက္ခရာများကြောင့်ဖြစ်ပေါ်လာသောအမှားများကိုရှောင်ရှားရန်သင်၏ parameters များကိုစနစ်တကျ encoded encoded encoded encoded လုပ်ခြင်းကိုသေချာအောင်လုပ်ပါ။
ဥပမာ -
$userId = 123;
$url = sprintf("https://www.example.com/user?id=%d", $userId);
အထူးသဖြင့် query strings များ၌အလားအလာ ရှိသော ဇာတ်ကောင်ပ conflicts ိပက်ခအချို့ကိုရှောင်ရှားရန်,
$userId = urlencode($userId);
$url = sprintf("https://www.gitbox.net/user?id=%s", $userId);
SQL Injection ကိုရှောင်ကြဉ်ပါ ။ sprintf မှတဆင့် SQL Queries ကိုတိုက်ရိုက် splicting အစားကြိုတင်သတ်မှတ်ထားသောထုတ်ပြန်ချက်များ (PDO သို့မဟုတ် MySQLI) ကိုသုံးပါ။
အသုံးပြုသူ input ကိုမှလွတ်မြောက်ရန် - SPRINTF မှတစ်ဆင့် SQL Query များကိုအမှန်တကယ်တည်ဆောက်ရန်လိုအပ်ပါကအသုံးပြုသူထည့်သွင်းမှုမှလွတ်မြောက်ရန်သေချာပါစေ။
Variable အမျိုးအစားကိုစစ်ဆေးပါ ။ Formatting လုပ်စဉ်တွင်အသုံးပြုသောဒေတာအမျိုးအစားသည်မျှော်မှန်းထားသည့်အတိုင်းကိုက်ညီပြီးအမှားအယွင်းများကိုရှောင်ရှားရန်သေချာစေပါ။
String နှင့် date fields များကိုသင့်လျော်စွာကိုင်တွယ်ပါ - SQL Queries တွင်ကိုးကားချက်များနှင့်နေ့စွဲပုံစံများကိုသင့်လျော်စွာအသုံးပြုရန်သေချာအောင်လုပ်ပါ။
URLs နှင့်သတိထားပါ - Sprintf သည် URL များကိုတည်ဆောက်ရန်အသုံးပြုပါက url query parameters များကိုသေချာစွာ encode လုပ်ပါ။