【发布时间】:2019-05-30 07:06:42
【问题描述】:
我正在尝试插入我的数据库表中。我是用ajax做的。
这是我的代码:
$(document).on('click','.add', function(){
var id = $(this).attr("id");
var DT = $('#DT'+id).val();
var SV = $('.search_text').val(); // store input value
var action = "add";
$.ajax({
url:"action.php",
method:"POST",
data:{DT:DT, SV:SV,action:action,id:id},
success: function(data){
alert("success");
},
error: function(){
alert("error action");
}
});
});
数据将指向action.php。这是action.php的代码:
if (isset($_POST['action'])) {
if($_POST["action"] == "add") {
$insert_dtb = mysqli_query($con, "INSERT INTO table_dtb(SV, DT, DK, NH, ttDK, ngTT)
value($_POST[SV],$_POST[DT],now(),$_POST[SV],'1',now());");
}
}
但我在 SV 变量中的输入值在插入表时变为数字。
示例:如果我输入 0153222,那么在表 table_dtb 的 SV 列中它只有 153222,我不能在 SV 列中输入字符。
虽然我将 table_dtb 中的列 SV 设置为 varchar(9),但它并没有像我预期的那样工作。
【问题讨论】:
-
sql注入的圣母。
-
Kit Harrington:Sql 注入来了!!!
-
使用参数化查询,问题就会消失(同时也会修复sql注入漏洞)
-
由于您没有使用准备好的语句(顺便说一句,您确实应该这样做),请尝试回显您的插入查询,以确保它插入的是您认为的内容。其他东西可能会删除开头的 0。否则,我猜这是因为变量没有被引用,所以 MySQL 将值视为数字而不是字符串,并删除 0。使用准备好的语句和参数绑定会解决的。
-
请注意,存在 mysqli/PDO 包装器可以自动为您处理准备好的语句。比如我的班级GrumpyPDO,你的代码就会变成
$db->run("INSERT INTO table_dtb (SV, DT, DK, NH, ttDK, ngTT) VALUES (?, ?, now(), ?, '1', now())", [$_POST['sv'], $_POST['dt'], $_POST['sv']]);,这样就不会被SQL注入了。