Проверка наличия записи в массиве json с php перед отправкой на сервер - PullRequest
0 голосов
/ 12 ноября 2018

Я пытаюсь найти лучший способ найти комбинацию значений в массиве 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 И конкурс = телефон Если оно существует, верните пользовательское сообщение на страницу, например, (вы уже зарегистрированы). Если комбинация отсутствует в массиве json, отправьте сообщение в файл.

Я полагаю, что это должно быть что-то вроде

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

Но я не могу заставить его работать, спасибо за помощь!

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

Вы можете просто создать функцию для проверки и использовать ваш код цикла:

<?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);

Но учтите, что если ваши данные слишком велики, это может быть проблемой производительности, лучше подходпотребуется.

0 голосов
/ 12 ноября 2018

Вы должны изменить внутренний код 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()функция для преобразования возвращаемых объектов в ассоциативные массивы.
  • Предполагая, что пользователь может зарегистрироваться для нескольких конкурсов, вы должны использовать условие && вместо ||, чтобы проверить, зарегистрирован ли пользователь для определенного конкурса илине.
  • Используйте логический флаг $flag и цикл foreach, чтобы проверить, зарегистрирован ли пользователь, отобразить простое сообщение, если оно уже зарегистрировано, или присоединить данные пользователя к строке json, если она не зарегистрирована.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...