လက်ရှိတည်နေရာ: ပင်မစာမျက်နှာ> နောက်ဆုံးရဆောင်းပါးများစာရင်း> MySQLI_STMT :: $ အမှားကို syntax အမှားအတွက်အကြောင်းပြချက်နှင့်အဖြေများကိုဖမ်းယူမရနိုင်ပါ

MySQLI_STMT :: $ အမှားကို syntax အမှားအတွက်အကြောင်းပြချက်နှင့်အဖြေများကိုဖမ်းယူမရနိုင်ပါ

gitbox 2025-05-28

ဒေတာဘေ့စ်လုပ်ငန်းများအတွက် PHP ၏ MySQLI extension ကိုအသုံးပြုသောအခါလုံခြုံရေးနှင့်စွမ်းဆောင်ရည်တိုးတက်စေရန်ပြင်ဆင်ထားသည့်ထုတ်ပြန်ချက်များကိုမကြာခဏသုံးလေ့ရှိသည်။ တစ်ချိန်တည်းမှာပင် developer များသည်ကွပ်မျက်ခံရစဉ်အတွင်း SQL Syntax အမှားများကဲ့သို့သောဖြစ်နိုင်ချေရှိသောအမှားများကိုတိကျစွာဖမ်းယူလိုကြသည်။ သို့သော်သင်သည်ဤသို့သောရှုပ်ထွေးသောပြ problem နာကိုကြုံတွေ့ရနိုင်သည်။

ဒီတော့ဘာဖြစ်နေတာလဲ ဤဆောင်းပါးသည်ဤပြ problem နာကိုနက်နက်နဲနဲလေ့လာသုံးသပ်ပြီးလက်တွေ့ကျသောဖြေရှင်းနည်းများကိုပြုလုပ်လိမ့်မည်။

1 ။ ပြ 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 င ်ပါ

2 ။ ခွဲခြမ်းစိတ်ဖြာခြင်းဖြစ်ပေါ်စေသည်

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 ::) ကိုစောင့်ဆိုင်းခြင်းထက်အကဲဖြတ်ရမည်။

3 ။ မှန်ကန်သောအမှားကိုင်တွယ်နည်းလမ်း

အထက်ပါကုဒ်ကိုပြန်လည်ရေးရန်နှင့်ပိုမိုလုံခြုံသောအမှားကိုင်တွယ်ပုံကိုကျင့်သုံးပါ။

 $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();

4 ။ အလွယ်တကူသတိမထားမိသောဘေးကင်းလုံခြုံမှုအန္တရာယ်

အကယ်. သင်သည်ဤကဲ့သို့သောလိပ်စာတစ်ခုကိုရယူခြင်းကဲ့သို့သော 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 ဆေးထိုးခြင်းကိုရှောင်ရှားနိုင်ရုံသာမကရှင်းလင်းပြီးဗဟိုပြုစစ်ဆေးမှုများကိုစစ်ဆေးသည်။

5 ။ အကျဉ်းချုပ်

  • SQL Syntax အမှားများကို ပြင်ဆင်ခြင်း () အဆင့်တွင်သာတွေ့နိုင်သည်။ ဒေါ်လာ stmt-> အမှား မှတဆင့်မရနိုင်ပါ။

  • ပြင်ဆင်ခြင်း () ပြင်ဆင်ခြင်းတန်ဖိုးကိုစစ်ဆေးပြီးအမှားမက်ဆေ့ခ်ျကိုထုတ်လုပ်ရန် $ MySQLI-> အမှားကို သုံးပါ။

  • ဆေးထိုးခြင်းမှကာကွယ်ရန် Preprocessing ထုတ်ပြန်ချက်များကိုအသုံးပြုရန်အကြံပြုသည်။

MySQLI နှင့် MySQLI_STMM အကြားတာ 0 န် 0 တ္တရားများကိုနားလည်ခြင်းအားဖြင့်သာကြံ့ခိုင်။ လုံခြုံသောဒေတာဘေ့စ်အပြန်အလှန်ဆက်သွယ်မှုကုဒ်များကိုကျွန်ုပ်တို့ရေးနိုင်ပါသည်။