php - 插入 MySQL 时输入值自动变为数字
问题描述
我正在尝试插入我的数据库表中。我正在用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),但它并没有像我预期的那样工作。
解决方案
你传递了$_POST[SV]
两次的值,大概它应该是你想要的任何值NH
。尽管如此,您不仅会使用准备好的语句捕捉到这一点,而且您只是在为使用当前代码进行 SQL 注入进行设置。
看看这个例子:
<?php
try {
/* setup your database configuration */
$config = array(
"host" => "127.0.0.1",
"username" => "root",
"password" => "",
"name" => "db_name"
);
$dsn = "mysql:dbname=$config[name];host=$config[host];charset=utf8mb4";
$db = new PDO($dsn, $config["username"], $config["password"]);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
/* prepare the SQL statement */
$stmt = $db->prepare("
INSERT INTO `table_dtb` (
`SV`, `DT`, `DK`, `NH`, `ttDK`, `ngTT`
) VALUES (
:sv, :dt, NOW(), :nh, '1', NOW()
);
");
/* execute the statement passing the parameterized values */
$stmt->execute(array(
":sv" => $_POST["SV"],
":dt" => $_POST["DT"],
":nh" => $_POST["NH"]
));
} catch(PDOException $ex) {
/* pdo exception */
} catch (Exception $e) {
/* php exception */
}
?>
为了解释代码的作用,您可以将其分解为 4 个不同的部分。第一部分是 Try/Catch 异常处理程序。任何时候你有一段可能失败的代码,你应该把它包装在 Try/Catch 处理程序中,它的作用是说“我将尝试执行这段代码,但如果它失败了,那么我想处理随之而来的错误。” 有两个单独的 catch 块的原因是您有一个处理数据库错误,另一个处理您的正常 PHP 错误。如果您想要对错误做的只是告诉用户发生了错误,只需使用 echo 语句。但是,如果您正在调试并且错误消息是相关的,那么您可以通过调用 getMessage 函数来获取执行的消息。
第二部分是数据库配置。从 PHP 5 开始,P HP数据对象用于处理您的数据库操作。我个人设置配置数组的原因是因为对我来说它更容易调试和阅读,尽管它不是完全必要的。重要的部分是您创建一个新的 PDO 对象。
第三部分是使用参数化值准备 SQL 语句。由于 SQL 语句中忽略了空格,并且 PHP 允许字符串文字中的行继续,因此您可以通过对 SQL 语句的不同段使用单独的行来格式化 SQL 语句以获得更好的可读性。前面有前缀的值的基本思想:
是它们表示一个不直接存储在 SQL 字符串中的值。
第四部分是执行参数化查询。单独调用 execute 函数会运行 SQL 语句,但是因为您已经在 SQL 查询中传递了参数,所以还需要传递要发送的值。在这种情况下,我们已经命名了参数,因此在关联数组中,我们将参数的名称指定为键,然后将要传递的值作为值分配。
希望这可以为您清除代码,如果您有任何问题,请随时提出。
推荐阅读
- python - QNetworkAccessManager 进程以退出代码 139 结束(被信号 11 中断:SIGSEGV)
- maven - 自定义插件的源代码中是否指定了目标?
- python - 如何在同一格式规范中一个接一个地添加一个字符/字符串
- python - 多输出回归器和 sklearn 的 RFE 模块
- python - 找不到 Statsmodel.varmax 应用或附加
- javascript - 如何从一个公共方法中提取变量的值并调用另一种方法
- powershell - 需要根据成本管理 API 查找资源组支出的总计
- makefile - 编写通用 make 目标时,如何仅使用两个目录之一中的文件?
- android - Android Q Camera 2 权限崩溃应用
- python - 计算数据子集每列的 n 个值的平均值的问题