How to create a mini database written in php using a json-formatted text file

4

I was needing a personal mini database written in PHP to store some internal data from my site, where I would create new properties, change them and delete later if necessary.

The example below shows how this .txt file would look and how to find / change a specific value (in case you change the offline value from Mariana to online) in JSON.

config.txt

{
   "users": {
      "Mariana": "offline",
      "João": "online"
   }
}

storage.php:

$method = "[GET ou SET]";
$string = "users/mariana"; // Caminho para a propriedade
$data = file_get_contents("config.txt");

$json = json_decode( $data, true ); // Transforma do JSON em array
$path = explode( "/", $string );
$last = "";

foreach ( $path as $value ) {
    $last = $json[$value]; // Navegar nas propriedades do JSON até a Mariana
}


if ( $method == "SET" ) {
    // Mudar um valor da propriedade
    $last = "online";
    file_put_contents("cofing.txt", $json); // Sava o novo arquvio

    echo "saved";
} else if ( $method == "GET" ) {
    // Somente exibir o valor da propriedade 

    echo $last;
}

I'm not that expert in PHP but if the code was in JavaScript it would work, but I prefer PHP to be fast rather than conflict when multiple users try to change some config.txt value. Could someone help?

    
asked by anonymous 13.08.2015 / 22:49

3 answers

1

To work with this type of functionality, a recursive function is the easiest way to do it, for example:

JSON file:

{
   "users": {
      "mariana": "offline",
      "joao": "online"
   }
}

PHP function

function JSONDB($path, $method, $data, &$value = NULL){

   // Separa todas as chaves
   $path = explode('/', $path); 

   // Salva a primeira na variável $key e remove-a da variável $path
   $key = array_shift($path); 

   // Junta todas as chaves em um novo path
   $npath = implode('/', $path);

   // Verifica se é GET e está na última chave
   if ($method == 'GET' && count($path) === 0)
      // Adiciona o valor na variável assinada $value
      $value = $data[$key]; 

   // Verifica se é SET e está na última chave
   else if ($method == 'SET' && count($path) === 0)
      // Seta o valor na chave atual
      $data[$key] = $value; 

   // Verifica se a chave atual não está vazia e é um array
   else if (!empty($data[$key]) && is_array($data[$key]))
      // Desce um nivel no array passando $data[$key] e atualiza o retorno na chave
      $data[$key] = JSONDB($npath, $method, $data[$key], $value); 

   // Nenhuma condição satisfeita, erro (provavelmente caminho errado)
   // Ou dados incorretos
   else 
      // Nada a fazer por aqui
      $value = FALSE; 

   // Retorna os dados para serem salvos
   return $data;
}

Use

// Arquivo com os dados JSON
$file = 'ususarios.json';

// Define método [GET ou SET]
$method = 'SET';

// Caminho para a propriedade
// IMPORTANTE> JSON é Case Sensitive ou seja, diferencia maiúscula de minúscula
// o caminho deve ser escrito da mesma forma como está no arquivo separados por /
$path = 'users/mariana'; 

// Valor a ser alterado caso o método seja GET
// Caso o método seja GET o retorno será colocado nessa variável, 
// então basta definir a variável e passa-la no quarto parâmetro
$val = 'online';

// Pega os dados do json
$data = file_get_contents($file);

// Transforma do JSON em array
$json = json_decode( $data, true ); 

// Executa a função recursiva, todos os dados serão retornado
// caso o método seja GET o valor será colocado na variável do quarto parâmetro
$dados = JSONDB($path, $method, $json, $val);

// Salva caso seja SET
if ($method == 'SET')
   $salva = file_put_contents("cofing.txt", json_encode($dados));

// Imprimindo os dados

echo '<style>pre{display:block; width:80%; margin: 20px auto;padding:10px;background-color:rgba(0,0,0,0.06);border-radius:5px;box-shadow:inset 2px 2px 5px rgba(0,0,0,0.2);}</style>';
echo '<pre>';
if ( $method == 'SET' ) {
    echo $salvo ? 'Arquivo salvo...' : 'Erro ao salvar...';
} else {
    // Somente exibir o valor da propriedade 
    // Obs, a variável $val é o quarto parâmetro passado na função
    // que quando o método for GET, será onde o retorno do GET será armazenado
    var_dump( $val );
}
echo '</pre>';

// Todos os dados
echo '<pre>';
var_dump($dados);
echo '</pre>';

Result

Observations:

This way of working with data is very primitive, that is, I'm just giving the initial step so that from here you can build your class with validation methods of input and output data, validation of file writing and etc. .

This type of functionality is very useful for saving settings such as connection to the database and so on. (But of course the file must be protected against external access.

    
14.08.2015 / 16:14
2

Would it be something like this?

Json Settings

[  
   {  
      "nome":"Mariana",
      "status":"online"
   },
   {  
      "nome":"Joao",
      "status":"offline"
   },
   {  
      "nome":"Jose",
      "status":"online"
   }
]

index.html

<!DOCTYPE html>
<html>
<head>
    <title>Teste JSON</title>
</head>
<script type="text/javascript">
    function botaoClick(botao){
        document.getElementById('status').value = botao;
        return true;
    }
</script>
<body>
    <form action="storage.php" method="POST">
        Nome: <input type="text" name="nome" />
        <input type="submit" value="online" onclick="return botaoClick(this.value)"/>
        <input type="submit" value="offline" onclick="return botaoClick(this.value)"/>
        <input type="hidden" name="acao" value="SET" />
        <input type="hidden" name="status" id="status" value="" />
    </form>
</body>
</html>

storage.php

<?php

$metodo = isset($_POST['acao']) ? $_POST['acao'] : "";
$nome = isset($_POST['nome']) ? $_POST['nome'] : "";
$status = isset($_POST['status']) ? $_POST['status'] : "";

$data = file_get_contents("config.json");

$json = json_decode($data);

foreach ($json as $key => $value) {
  if($value->nome == $nome){
    if($metodo == 'SET'){
        $value->status = $status;
        break;
    } else if ($metodo == 'GET') {
        echo $value->status;
        break;
    }
  }
}

$json_enc  = json_encode($json);

file_put_contents('config.json', $json_enc);

echo $json_enc;
    
14.08.2015 / 02:14
-1

I think the ideal, and the safest, would be for you to make a copy of the database file and then make the necessary changes to it. Therefore, I recommend that you use the tools provided to manage the database itself.

Ex: If you use PostgreSQL as a database, you could use as the system manager. In this case, you would have several advantages, such as:

  • Consistency: When removing / adding / editing information, this information would be updated automatically in all dependent fields and tables, li>

    Speed: Every database is designed to be very fast, so creating your own query language / function to do this kind of thing would be a waste of time.

    >
  • Convenience: Using small SQL queries and triggers you could perform a lot of actions quickly and much more efficiently.

  • There are several other advantages to using database manager systems, these are just a few of them. So by reinforcing what has been said: If you want to manipulate the data of a website, use a database manager system for that.

        
    13.08.2015 / 23:30