在发布到服务器之前,使用php验证条目是否存在于json数组中

时间:2018-11-12 16:57:24

标签: php jquery json ajax

我正在尝试找出在json数组中查找值组合的最佳方法,如果存在,则返回错误消息。如果数组中不存在值的组合,则将它们发布到服务器。这是我到目前为止所拥有的。

JSON

[{
  "username": "johnsmith@test.com",
  "contest": "TV",
  "timestamp": "Fri Nov 09 2018 16:33:38 GMT-0500 (Eastern Standard Time)"
}, {
  "username": "bob@test2.com",
  "contest": "Phone",
  "timestamp": "Fri Nov 09 2018 18:33:51 GMT-0500 (Eastern Standard Time)"
}]

我正在使用ajax将详细信息发布到php,并且该部分效果很好。

        $.ajax({
            type: 'POST',
            url: 'update.php',
            data: { theuser: theuser, thecontest: thecontest, timestamp: timestamp },
            success: function() {
                //Show confirm notification hide btns and close the modal
                $('.modalbtns').hide();
                $('#successbox').fadeIn();
                setTimeout(function() {
                    $('#ModalCenter').modal('hide')
                }, 2400);
            },
            error: function() {
                // do something on error
            }
        });

到目前为止,这就是我要使用的php(update.php)

<?php

$theuser = $_POST['theuser'];
$thecontest = $_POST['thecontest'];
$timestamp = $_POST['timestamp'];

if (is_writable('alldata.json')) {

    $json = file_get_contents('alldata.json');
    $data = json_decode($json);
    $data[] = array('username'=> $theuser, 'contest' => $thecontest, 'timestamp' => $timestamp);
    file_put_contents('alldata.json', json_encode($data));

} else {
    //echo "file is not writable, check permissions";
}

?>

例如,我要实现的目标是

在发布之前,请检查json数组是否存在以下组合。 用户名= bob@test2.com AND竞赛=电话 如果存在,则将自定义消息返回到页面,例如(您已经注册)。 如果组合不在json数组中,请发布到文件中。

我相信它一定是

foreach($data as $item)
{
    if($item->username == $username) || ($item->contest == $contest){
        //combination found, do not post!
    }
}

但是我无法正常工作,谢谢您的帮助!

2 个答案:

答案 0 :(得分:1)

您必须通过以下方式更改后端PHP代码,

<?php
    $theuser = $_POST['theuser'];
    $thecontest = $_POST['thecontest'];
    $timestamp = $_POST['timestamp'];

    if (is_writable('alldata.json')) {
        $json = file_get_contents('alldata.json');
        $data = json_decode($json, true);
        $flag = false;
        foreach($data as $d){
            if($d['username'] == $theuser && $d['contest'] == $thecontest){
                $flag = true;
                break;
            }
        }
        if(!$flag){
            $data[] = array('username'=> $theuser, 'contest' => $thecontest, 'timestamp' => $timestamp);
            file_put_contents('alldata.json', json_encode($data));
        }else{
            // echo "you are already registered for the contest";
        }
    } else {
        // echo "file is not writable, check permissions";
    }
?>

所需更改的摘要:

  • 将附加参数true传递给json_decode()函数,以将返回的对象转换为关联数组。
  • 假设用户可以注册多个竞赛,则应使用&&条件而不是||来检查用户是否已注册特定竞赛。
  • 使用布尔标志$flagforeach循环检查用户是否已注册,如果已经注册,则显示一条简单消息,如果未注册,则将用户数据附加到json字符串中。

答案 1 :(得分:0)

您可以简单地创建一个函数来进行检查并使用循环代码:

<?php
function check_combination($data){
    foreach($data as $item)
    {
        if($item->username == $username) || ($item->contest == $contest){
            return false; //if match found function will return by breaking the loop.
        }
    }
    return true; //it will be returned after all the values are iterated.
}


check_combination($data);

但是请注意,如果您的数据太大,可能会导致性能问题,那么将需要一种更好的方法。