【问题标题】:How to insert data with mysqli using PHP, AJAX & JSON?如何使用 PHP、AJAX 和 JSON 在 mysqli 中插入数据?
【发布时间】:2016-07-17 05:36:39
【问题描述】:

PHP

    $data = array(
        'success' => false,
        'errors' => array()
    );

    if(isset($_POST['inputs'])) {


            $inputs = $_POST['inputs'];
            foreach($inputs as $input) {

                    $name = $input['name'];
                    $value = $input['value'];

                    switch ($name) {
                            case 'email':
                                    if (!filter_var($value, FILTER_VALIDATE_EMAIL)) {
                                            $msg = "You must provide a valid e-mail address";
                                    }
                                    break;

                            default:
                                    $msg = "Sorry, we do not understand the data, please try again";
                                    break;
                    }

                    if(!empty($msg)) {
                            $data['errors'][] = array(
                                    'msg' => $msg,
                                    'field' => $name
                            );
                    }
            }

            if(empty($data['errors'])) {
                    $data['success'] = true;

                    $json = file_get_contents('php://input');
                    $obj = json_decode($json,true);

                    foreach ($obj as $item) {
                            $query = "INSERT INTO users (email)

                            VALUES

                            ('".$item['email']."')";

                            $objConnection->query($query) or die($objConnection->error);
                            $objConnection->close();
                    }

            }

    } else {
            $data['errors'][] = "Data missing";
    }
    header("Content-type: application/json; charset=UTF-8");
    echo json_encode((object)$data);

Jquery / AJAX

$(function() {
    $('.submit').click(function() {

            var formInputs = new Array();

            var formId = $(this).parent().attr('id');

            $('#' + formId + ' input').each(function() {

                    var obj = {
                        'value': $(this).val(),
                        'name': $(this).attr('name')
                    };

                    formInputs.push(obj);
            });

            $.ajax({
                    url: 'add.php',
                    type: 'POST',
                    dataType: 'json',
                    cache: false,
                    data: {
                            'inputs': formInputs
                    },
                    success: function(data) {
                            if(data.success) {
                                    $(".hej").html("worked");
                            } else {
                                    $.each(data.errors, function() {
                                            var list = "<p>"+this.msg+"</p>";
                                            $(".hej").html(list);
                                    });
                            }
                    }
            });

            return false;

    });
});

我一直在寻找答案,看看我是否能自己弄清楚,我确实找到了这个Insert data with JSON and mysql .它似乎正在工作,除了它给我一个错误,上面写着:“为 foreach() 提供的参数无效”。如果有人有更好的方法/解决方案来插入数据,我不介意。

【问题讨论】:

  • 您在此代码中没有显示任何 HTML 剥离,也没有显示您使用的数据库 API。确保在将不受信任的数据插入查询之前使用 PDO 或剥离其内容(防止 SQLi 注入)。
  • 目前我只是在测试,安全性稍后会来

标签: php jquery json ajax


【解决方案1】:

改变这个....

$json = file_get_contents('php://input');
$obj = json_decode($json,true);

foreach ($obj as $item) { //

$inputs = $_POST['inputs'];
foreach ($inputs as $item) { // rest of your code 

原因是因为您在发布,而不是告诉它 application/json ,所以它使用默认的 application/x-www-form-urlencoded

所以请注意,当您在顶部进行检查时,您使用的是 $_POST。但底部使用 file_get_contents。只需使用 $_POST,你的 foreach 就会有值。

根据顶部的 switch 语句判断,您可能必须执行类似的 switch 才能插入正确的电子邮件。

就这样……

$inputs = $_POST['inputs'];
foreach($inputs as $item) {
    $name = $item['name'];
    $value = $item['value'];
    if($name=='email'){
        $query = "INSERT INTO users (email) VALUES ('".$value."')";
        $objConnection->query($query) or die($objConnection->error);
        $objConnection->close();
    }
}

【讨论】:

  • 如果我的数据库中有更多行,这是否也有效? $query = "INSERT INTO users (email, name, username) VALUES ('".$value."')" 对我来说,这似乎只适用于一个输入字段和行,而不是多个。 @KyleK
  • 嗯,是的,您认为必须有更好的方法是正确的。但是那里的东西会起作用。因为您正在循环,所以您要分别插入每个值。更好的方法是遍历所有输入并构建一个 isert,然后在最后只插入一个。
【解决方案2】:

我想通了!

if(empty($data['errors'])) {

    $data['success'] = true;

    $inputs = $_POST['inputs'];
    $email = $inputs[0]['value']; // I select the first element in my array, then I select its value
    $password = $inputs[1]['value']; // I select the second element in my array, then I select its value

    $query = "INSERT INTO users (email, password)

    VALUES

    ('{$email}', '{$password}')";

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-06-23
    • 1970-01-01
    • 1970-01-01
    • 2021-05-29
    • 1970-01-01
    • 1970-01-01
    • 2016-08-17
    • 2014-11-26
    相关资源
    最近更新 更多