首页 > 解决方案 > 插入 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),但它并没有像我预期的那样工作。

标签: phpjquerymysqlsqlajax

解决方案


你传递了$_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 查询中传递了参数,所以还需要传递要发送的值。在这种情况下,我们已经命名了参数,因此在关联数组中,我们将参数的名称指定为键,然后将要传递的值作为值分配。

希望这可以为您清除代码,如果您有任何问题,请随时提出。


推荐阅读