【问题标题】:Ajax call is getting a 200 but I'm not inserting a record after function callAjax 调用得到 200 但我没有在函数调用后插入记录
【发布时间】:2019-02-11 04:29:57
【问题描述】:

这有点神秘,但我想我已经缩小了部分问题的范围。

基本上,我有一个表单,当我点击提交时,我正在制作一个 ajax 帖子,该帖子点击我的路由,然后是控制器,这会在其他地方调用一个执行插入的函数(通过 DB2 中的过程,但基本上是直接插入)

我的 Ajax 返回 200 ok 消息并在开发工具中显示表单数据,因此该部分正常。目标是获取表单值以及我在控制器中硬编码的值,并将它们传递给准备语句并执行的函数。

我认为问题在于表单中的所有内容都是字符串,但我的函数期望 intstring 加上该过程只有在使用正确的数据类型时才能成功插入。我认为问题出在表单数据中,因为如果我做一个粗略的硬代码并在这样的测试文件中手动调用该函数,它会插入:

$id = 123;
$name1 = 'Test Name';
$number1 = 112;
$name1 = '2nd Test Name';
$number2 = 584;
$number3 = 88;
$name3 = 'Name Blue';
$category = 'Fruit';
$comment = 'Testing the comments';
$date1 = '2018-09-18';
$date2 = '2018-09-19';

所以基本上,我仍然需要传递我的表单数据,并从控制器中获取它以及其他值,确保字符串作为字符串传递而 INT 作为 int 传递,然后执行该函数。我必须在这里遗漏一些非常简单的东西,但我现在 100% 迷路了。

非常感谢任何帮助

Route.php

Route::post('insertPList', 'Controller@insertPList');

controller.php

public function insertPList(Request $request)
{

        $id = 123;
        $name1 = $request->name1;
        $number1 = $request->number1;
        $name2 = $request->name2;
        $number2 = $request->number2;
        $number3 = $request->number3;
        $name3 = $request->name3;
        $category = 'Fruit';
        $comment = $request->comment;
        $date1 = '2018-09-10';
        $date2 = '2018-09-11';

        $service = new service();
        $service->insertListRecord($id, $name1, $number1,$name2, $number2, $number3, $name3, $category, $comment, $date1, $date2);

}

服务.php

public function insertListRecord(int $id, string $name1, int $number1, string $name2, int $number2, int $number3, string $name3, string $category, string $comment, string $date1, string $date2)
{
    $link = Iseries::conn();
    $sql = "CALL INSERT_LIST(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";

    $prep = odbc_prepare($link, $sql);
    $exec = odbc_execute($prep, array($id, $name1, $number1, $name2, $number2, $number3, $name3, $category, $comment, $date1, $date2));


    if (odbc_error())
     {
           echo odbc_errormsg($link);
     }
}

blade.php

    $("#save").click(function(e){

    e.preventDefault();

    var name1 = $("input[name=name1]").val();
    var number1 = $("input[name=number1]").val();
    var name2 = $("input[name=name2]").val();
    var number2 = $("input[name=number2]").val();
    var number3 = $("input[name=number3]").val();
    var name3 = $("input[name=name3]").val();
    var comment = $("textarea[name=comment]").val();

    $.ajax({
        url:'URL',
        data:{
            name1:name1,
            number1:number1,
            name2:name2,
            number2:number2,
            number3:number3,
            name3:name3,
            comment:comment
        },
        "_token": "{{ csrf_token() }}",
        type:"POST",
        success:function(data){
            console.log(data);
        },
        error: function(jqxhr, status, exception) {
             alert('Exception:', exception);
         }
    });

});

【问题讨论】:

  • 所有application/x-www-form-urlencoded格式提交的HTTP请求参数都是字符串
  • 原始类型提示仅适用于 PHP 7。您使用的是什么版本?您总是可以在分配变量时只转换变量,例如$number1 = (int) $request->number1;
  • 我相信我正在使用 7.0.2。而且我知道参数是作为字符串传递的,但这就是为什么我想知道在 ajax 调用之后如何正确传递它们
  • 你还没有解释你的代码是如何工作的。你有任何错误吗?如果将string 传递给int 类型提示参数,PHP 7 应该抛出TypeError 异常。数字字符串应该可以毫无问题地进行类型转换
  • 请注意,odbc_execute() 无论如何都会将所有内容绑定为字符串,所以我真的不认为这是您的问题。

标签: javascript php sql ajax laravel


【解决方案1】:

根据您的解释,如果您遇到的问题是类型格式问题(字符串、整数、布尔值)并且您使用的是 laravel 框架,那么请在您的模型中添加类似这样的内容。

/**
 * The attributes that should be cast to native types.
 *
 * @var array
 */
protected $casts = [
    'email_verified_at' => 'datetime',
    'number1' => 'integer',
    'name1' => 'string',
    'column name' => 'expected or required format of data',
]; 

希望这应该在插入数据库之前将数据转换为您需要的格式。 See also

【讨论】:

    猜你喜欢
    • 2011-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-22
    相关资源
    最近更新 更多