ဒေတာဘေ့စ်လုပ်ငန်းများအတွက် PHP ၏ MySQLI extension ကိုအသုံးပြုသောအခါလုံခြုံရေးနှင့်စွမ်းဆောင်ရည်တိုးတက်စေရန်ပြင်ဆင်ထားသည့်ထုတ်ပြန်ချက်များကိုမကြာခဏသုံးလေ့ရှိသည်။ တစ်ချိန်တည်းမှာပင် developer များသည်ကွပ်မျက်ခံရစဉ်အတွင်း SQL Syntax အမှားများကဲ့သို့သောဖြစ်နိုင်ချေရှိသောအမှားများကိုတိကျစွာဖမ်းယူလိုကြသည်။ သို့သော်သင်သည်ဤသို့သောရှုပ်ထွေးသောပြ problem နာကိုကြုံတွေ့ရနိုင်သည်။
ဒီတော့ဘာဖြစ်နေတာလဲ ဤဆောင်းပါးသည်ဤပြ problem နာကိုနက်နက်နဲနဲလေ့လာသုံးသပ်ပြီးလက်တွေ့ကျသောဖြေရှင်းနည်းများကိုပြုလုပ်လိမ့်မည်။
အောက်ပါနမူနာကုဒ်ကိုကြည့်ပါ။
$mysqli = new mysqli("localhost", "user", "password", "testdb");
// Syntax အမှား:တစ်ယောက်ပျောက်နေတယ် FROM
$sql = "SELECT id name users WHERE id = ?";
$stmt = $mysqli->prepare($sql);
if (!$stmt) {
echo "Prepare failed: " . $mysqli->error; // လုပ်ဖို့မှန်ကန်သောနည်းလမ်း
} else {
$stmt->bind_param("i", $id);
$id = 1;
$stmt->execute();
if ($stmt->error) {
echo "Execute error: " . $stmt->error; // 不会捕捉到Syntax အမှား
}
$stmt->close();
}
$mysqli->close();
Prepare failed: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version...
သင်မြင်နိုင်သည့်အတိုင်း SQL syntax အမှားများသည်ဒေါ်လာ stmt-> အမှား အားလုံးကို မ 0 င ်ပါ ။
PHP တွင် MySQLI နှင့် MySQLI_STMMT အကြားအလုပ်သမားဌာနခွဲကိုနားလည်ရန်လိုအပ်သည်။
MySQLI :: ပြင်ဆင် () ပြင်ဆင်ခြင်း () သည်ဒေတာဘေ့စ် connection object မှခေါ်သည့်နည်းလမ်းဖြစ်သည်။ အကယ်. SQL သည် Syntax အမှားများရှိပါက SQUTT OFF သည် လုံးဝထုတ်လုပ်မည်မဟုတ် ,
MySQLI_STMT :: Runtime Error ကို အောင်မြင်စွာပြင်ဆင်ထားပြီး Runtime Errorize မှသာတန်ဖိုးရှိသည်။
ထို့ကြောင့် SQL syntax အမှားများကို ဒေါ်လာ stmt-> အမှား ဖြင့်ဖမ်းမိနိုင်မည်မဟုတ်ပါ။
တစ်နည်းပြောရရင်တော့:
SQL Syntax အမှားများတွင် ပြင်ဆင်ခြင်း () စင်မြင့်ပေါ်ပေါက်လာပြီး ဒေါ်လာ MySQLI-> အမှား သို့မဟုတ် MySQLI :: MySQLI :: MySQLI ::) ကိုစောင့်ဆိုင်းခြင်းထက်အကဲဖြတ်ရမည်။
အထက်ပါကုဒ်ကိုပြန်လည်ရေးရန်နှင့်ပိုမိုလုံခြုံသောအမှားကိုင်တွယ်ပုံကိုကျင့်သုံးပါ။
$mysqli = new mysqli("localhost", "user", "password", "testdb");
$sql = "SELECT id, name FROM users WHERE id = ?"; // မှန်ကန်သော syntax
$stmt = $mysqli->prepare($sql);
if (!$stmt) {
// 检查Syntax အမှား
die("SQL prepare failed: " . $mysqli->error);
}
$stmt->bind_param("i", $id);
$id = 1;
if (!$stmt->execute()) {
// runtime အမှားများကိုစစ်ဆေးပါ
die("Execute failed: " . $stmt->error);
}
$result = $stmt->get_result();
$data = $result->fetch_assoc();
echo "User: " . $data['name'];
$stmt->close();
$mysqli->close();
အကယ်. သင်သည်ဤကဲ့သို့သောလိပ်စာတစ်ခုကိုရယူခြင်းကဲ့သို့သော SQL parameter များကို SQL Parameters များတင်သွင်းရန်သင် Ajax interface ကိုအသုံးပြုနေပါက -
https://gitbox.net/api/get_user.php?id=1
ထိုအခါသင်သည်အသုံးပြုသူ input ကို SQL (အန္တရာယ်များသော!) သို့ splice:
$id = $_GET['id'];
$sql = "SELECT * FROM users WHERE id = $id"; // ဖြစ်နိုင်ခြင်း SQL ဆေးထိုးအန္တရာယ်
ဤစာအရေးအသားနည်းလမ်းသည် Splicing တွင် SQL ကိုမှားယွင်းစွာရေးသားရန်လွယ်ကူပြီး ပြင်ဆင်ခြင်း () ကို အသုံးမပြုပါ။ အမှားအယွင်းများကိုရှာဖွေရန် ပို. ခက်ခဲသည်။ ထို့ကြောင့်, အောက်ပါအရေးအသားနည်းလမ်းကိုအကြံပြုသည်။
$sql = "SELECT * FROM users WHERE id = ?";
$stmt = $mysqli->prepare($sql);
$stmt->bind_param("i", $_GET['id']);
၎င်းသည် SQL ဆေးထိုးခြင်းကိုရှောင်ရှားနိုင်ရုံသာမကရှင်းလင်းပြီးဗဟိုပြုစစ်ဆေးမှုများကိုစစ်ဆေးသည်။
SQL Syntax အမှားများကို ပြင်ဆင်ခြင်း () အဆင့်တွင်သာတွေ့နိုင်သည်။ ဒေါ်လာ stmt-> အမှား မှတဆင့်မရနိုင်ပါ။
ပြင်ဆင်ခြင်း () ပြင်ဆင်ခြင်းတန်ဖိုးကိုစစ်ဆေးပြီးအမှားမက်ဆေ့ခ်ျကိုထုတ်လုပ်ရန် $ MySQLI-> အမှားကို သုံးပါ။
ဆေးထိုးခြင်းမှကာကွယ်ရန် Preprocessing ထုတ်ပြန်ချက်များကိုအသုံးပြုရန်အကြံပြုသည်။
MySQLI နှင့် MySQLI_STMM အကြားတာ 0 န် 0 တ္တရားများကိုနားလည်ခြင်းအားဖြင့်သာကြံ့ခိုင်။ လုံခြုံသောဒေတာဘေ့စ်အပြန်အလှန်ဆက်သွယ်မှုကုဒ်များကိုကျွန်ုပ်တို့ရေးနိုင်ပါသည်။