2017-07-10 25 views
1

phpに名前とパスワードの対応がチェックされています。原則は次のとおりです。名前がファイル内にある場合(ファイル名とパスワードがjsonファイルに格納されている場合)、ファイル内のパスワードが入力されたパスワードと一致するかどうか。名前とパスワードが一致することを確認してください。

$file = "../data/users.json"; 

$json_array = json_decode(file_get_contents($file), true); 

$users = array(); 

if(is_array($json_array)) { 
    $users = $json_array; 
} 
if(isset($users[$name])) { 
    if($users[$name]["pass"] !== $password){ 
     http_response_code(400); 
    } 
} 
else { 
    $users[] = array("name" => $name, "pass" => $password, "id" => $i); 
    $i = 0; 
    foreach ($users as $key => $value) { 
     $users[$key]["id"] = $i; 
     $i++; 
    } 

    file_put_contents($file, json_encode($users, JSON_PRETTY_PRINT)); 
} 

そして、ここでそれがファイルに書き込まれ

[ 
    { 
     "name": "qwe", 
     "pass": "qwe", 
     "id": 0 
    } 
] 

私はすでに存在している名前と、それに一致しないパスワードを入力すると、スクリプトは新しいペアとしてそれを書き込みます。

[ 
    { 
     "name": "qwe", 
     "pass": "qwe", 
     "id": 0 
    }, 
    { 
     "name": "qwe", 
     "pass": "qweqwe", 
     "id": 1 
    } 
] 

私が理解したように、これは原因ISSET($ユーザー[$名])は常に虚偽になりますが、私はそれを修正する方法を知らないという事実にあります。名前とパスワードの確認を修正するにはどうすればよいですか?

+0

'$ユーザーが[$名]'動作しません。配列。 あなたができることは、ループ内のすべてのエラーをチェックし、その名前と一致させようとすることです。私はPHPはmapやgrep関数を持っていると思うが、これはループよりも優れているかもしれない(それは基本的に同じであることも厳しい) – Phiter

答えて

1

フィータのコメントは正しいです。あなたが唯一の作品へのコードが必要な場合は、単純な配列のインデックスとして名を挿入します。

$users[$name] = array("name" => $name, "pass" => $password, "id" => $i); 

EDIT:

これは完全なコードです:

$file = "../data/users.json"; 

$json_array = json_decode(file_get_contents($file), true); 

$users = array(); 

if(is_array($json_array)) { 
    $users = $json_array; 
} 
if(isset($users[$name])) { 
    if($users[$name]["pass"] !== $password){ 
     http_response_code(400); 
    } 
} 
else { 
    $i = 0; 
    foreach ($users as $key => $value) { 
     $users[$key]["id"] = $i; 
     $i++; 
    } 
    $users[$name] = array("name" => $name, "pass" => $password, "id" => $i); 

    file_put_contents($file, json_encode($users, JSON_PRETTY_PRINT)); 
} 

私はちょうどました$users[$name] = array("name" => $name, "pass" => $password, "id" => $i);をforeachの下の行に移動します(追加したいのですが?!?)。$ nameをインデックスとして指定します。

EDIT 2:あなたはJSON構造を保持したい場合は

、これを試してください:あなたがその鍵を持っていないので、

<?php 
$file = "users.json"; 

$json_array = json_decode(file_get_contents($file), true); 

$users = array(); 

if(is_array($json_array)) { 
    $users = $json_array; 
} 
$newUser = true; 
foreach($users as $user) { 
    if ($user["name"] == $name) { 
     $newUser = false; 
     if ($user["pass"] !== $password) { 
      http_response_code(400); 
     } else { 
      // GOOD PASSWORD 
     } 
    } 
} 
var_dump($users); 
var_dump(count($users)); 
if ($newUser) { 
    $users[] = array("name" => $name, "pass" => $password, "id" => count($users) + 1); 
} 
file_put_contents($file, json_encode($users, JSON_PRETTY_PRINT)); 
+0

このように? { \t if($ users [$ name] => $ name、 "pass" => $ password、 "id" => $ i);)名前] ["pass"]!== $ password){ \t \t http_response_code(400); \t} } ' –

+0

はい、でも今はオブジェクトのオブジェクトです。私はオブジェクトの配列が必要です。 –

+0

それは私が必要なものです、ありがとう! –

0
$file = "../data/users.json"; 

    $json_array = json_decode(file_get_contents($file), true); 

    $users = array(); 

    if(is_array($json_array)) { 
     $users = $json_array; 
    } 


    if(isset($users[0])) { 
     if($users[0]["pass"] !== $password){ 
      http_response_code(400); 
     } 
    } 
    else { 
     $users[] = array("name" => $name, "pass" => $password, "id" => $i); 
     $i = 0; 
     foreach ($users as $key => $value) { 
      $users[$key]["id"] = $i; 
      $i++; 
     } 

     file_put_contents($file, json_encode($users, JSON_PRETTY_PRINT)); 
    } 
関連する問題