我正在尝试插入数据库中的表。我正在用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),但它没有按预期工作。
答案 0 :(得分:-1)
您传递两次$_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 D ata O 对象用于处理数据库操作。我亲自设置配置阵列的原因是因为对我而言,它并不是很完全必要,但是它更易于调试和读取。重要的是要创建一个新的PDO对象。
第三部分正在使用参数化的值准备SQL语句。由于SQL语句中的空格被忽略,PHP允许在String文字中继续行,因此您可以通过对SQL语句的不同段使用单独的行来格式化SQL语句,以提高可读性。前面带有:
前缀的值的基本思想是,它们表示一个不直接存储在SQL字符串中的值。
第四部分正在执行参数化查询。单独调用execute函数将运行SQL语句,但是由于您已在SQL查询中传递了参数,因此还需要传递要发送的值。在这种情况下,我们为参数命名,因此在关联数组中,我们将参数的名称指定为键,然后将要传递的值指定为值。
希望这可以为您清除代码,如果您有任何疑问,请随时提问。