Проверка наличия записи в массиве json с помощью php перед отправкой на сервер

Я пытаюсь найти лучший способ найти комбинацию значений в массиве json, и, если она существует, вернуть сообщение об ошибке. Если комбинация значений отсутствует в массиве, отправьте их на сервер. Вот что у меня есть на данный момент.

JSON

[{
  "username": "[email protected]",
  "contest": "TV",
  "timestamp": "Fri Nov 09 2018 16:33:38 GMT-0500 (Eastern Standard Time)"
}, {
  "username": "[email protected]",
  "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, существует ли следующая комбинация. имя пользователя = [email protected] И конкурс = Телефон Если он существует, верните на страницу настраиваемое сообщение, например (вы уже зарегистрировались). Если комбинации нет в массиве json, опубликуйте в файл.

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

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

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

Где if ($item->username == $username) || ($item->contest == $contest){? Похоже, что БД было бы проще использовать и управлять.

user3783243 12.11.2018 18:05
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
1
68
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы должны изменить внутренний 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, если он не зарегистрирован.

Спасибо, это работает! Как я могу отправить строку «вы уже зарегистрированы» обратно в ajax?

Carlos27 12.11.2018 18:51

@ Carlos27, ваша функция обратного вызова success AJAX будет выглядеть примерно так: success: function(data){alert(data);}, где data - это данные, возвращенные сервером, то есть ваш оператор echo.

Rajdeep Paul 12.11.2018 19:17

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

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

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

Вы правы, я заметил, что после приближения к 1000 записей (3 поля на запись) я получил следующую ошибку в php .. [10-Dec-2018 14:42:21 UTC] Предупреждение PHP: недопустимый аргумент для foreach ( ) в /home/username/public_html/calendrier/update.php в строке 10 И мой файл json был полностью стерт. Достаточно ли этого, чтобы создать проблему с php? Что вы предлагаете как лучший подход?

Carlos27 12.12.2018 14:35

Другие вопросы по теме